11.图像处理
03.图像处理
在setting中设置导入pillow库
前置知识
RGB颜色:3个颜色通道组成的颜色
3个颜色:红(255,0,0)、绿(0,255,0)、蓝(0,0,255)
其他常见:黄(255,255,0)
一个像素(pixel)=3字节
做实验的两张图如下,分别为kfc-1.jpg
和kfc-2.jpg
1.图片基础操作
from PIL import Image
def main():
# 打开当前文件夹下的kfc图片,并用im变量去接收图片
im = Image.open("./kfc.jpg")
# 显示图片
# im.show()
# 获取图片的格式
# print(im.format)
# 获得图片的大小(分辨率),通过图片属性的详细信息查看
# print(im.size)
# 获得图片的高度和宽度,和大小结果一样,只是可以分开取
# print(im.height,im.width)
# 获得某一个像素的颜色
# print(im.getpixel((300,50)))
pass
if __name__ == '__main__':
main()
2.图片混合和遮罩处理
混合
im1 = Image.open("./kfc-1.jpg").convert(mode='RGB')
#新建一个RGB文件,和im1一样大,并取绿色,图片不一样大则不同
im2 = Image.new('RGB',im1.size,'green')
# 显示是一个纯绿色的图片
#im2.show()
#将两张图片混合,alpha在[0,1]之间
Image.blend(im1,im2,alpha=0.5).show()
遮罩
im1 = Image.open("./kfc-1.jpg")
im2 = Image.open("./kfc-2.jpg")
#重新定义im2的大小,将其和im1大小相同
im2 = im2.resize(im1.size)
# 修改后保存
im2.save("./haha.jpg")
# 将图片的3个颜色通道进行分离
r,g,b = im2.split()
# 使用im2的g通道对im1进行遮罩处理
Image.composite(im2,im1,g).show()
3.复制,缩放和镜像效果
复制和缩放
im1 = Image.open("./kfc-1.jpg")
# 把每个像素扩大2倍,色泽更饱和,有些PS的原理和这个差不多
Image.eval(im1,lambda i:i*2).show()
# 复制一个图片副本到内存,由于有些修改在图片本身,所以需要丢到内存操作
copy = im1.copy()
# 缩放到指定的大小
copy.thumbnail((100,50))
copy.show()
剪切和粘贴
# 剪切图片,从(5,5)位置剪到(130,130)
part1 = im1.crop((5, 5, 130, 130))
# 将im1剪切的部分粘贴到im2的(30,30)的地方
im2.paste(part1, (30, 30))
im2.show()
镜像和旋转
# 将图片1逆时针90°旋转,图片长宽像素不变,超出用黑色填充
im1.rotate(90).show()
# 图片左右镜像
im1.transpose(Image.FLIP_LEFT_RIGHT).show()
# 上下镜像,图片翻转
im1.transpose(Image.FLIP_TOP_BOTTOM).show()
# 顺时针旋转90°,图片长宽像素也随之改变
im1.transpose(Image.ROTATE_90).show()
# 图片颠倒,效果相当于镜像+逆时针变长宽旋转90°
im1.transpose(Image.TRANSPOSE).show()
图片通道分离和滤镜
通道分离
im1 = Image.open("./kfc-1.jpg")
im2 = Image.open("./kfc-2.jpg")
# 设置im2和im1大小相同
im2 = im2.resize(im1.size)
# 进行RGB分离
r1,g1,b1 = im1.split()
r2,g2,b2 = im2.split()
# 制作合成一个新的图片
tmp1 = [r1,g2,b1]
im3 = Image.merge("RGB",tmp1)
im3.show()
图片模糊(滤镜)
fromPILimportImage
fromPILimportImageFilter
defmain():
im1 = Image.open("./kfc-1.jpg")
im2 = Image.open("./kfc-2.jpg")
#设置im2和im1大小相同
im2 = im2.resize(im1.size)
#高斯模糊
im1.filter(ImageFilter.GaussianBlur).show()
if__name__ =='__main__':
main()
合成模块
from PIL import Image
from PIL import ImageChops
def main():
im1 = Image.open("./kfc-1.jpg")
im2 = Image.open("./kfc-2.jpg")
# 图片运算需要图片大小相同
im2 = im2.resize(im1.size)
# 图片加法运算
ImageChops.add(im1,im2).show()
# 图片减法运算
ImageChops.subtract(im1,im2).show()
# 图片变暗(图片保留较暗的部分)
ImageChops.darker(im1,im2).show()
# 图片变亮(保留图片教亮的部分)
ImageChops.lighter(im1,im2).show()
# 图片的叠加(相当于变暗)
ImageChops.multiply(im1,im2).show()
# 图片同时投影到屏幕(相当于变亮)
ImageChops.screen(im1,im2).show()
# 底片效果
ImageChops.invert(im1).show()
# 图片取不同
ImageChops.difference(im1,im2).show()
if __name__ == '__main__':
main()
色彩亮度的调整
色彩调整
from PIL import Image
from PIL import ImageEnhance
def main():
im1 = Image.open("./kfc-1.jpg")
w,h = im1.size
# 设置新的图片,宽度为3张原图
image_output = Image.new('RGB',((3*w),h))
# 第一个放原图
image_output.paste(im1,(0,0))
# 第二个地方放增强图,将颜色拿出来
img_color = ImageEnhance.Color(im1)
# 对颜色进行增强1.5倍
imga = img_color.enhance(1.5)
# 输出到out_put上
image_output.paste(imga,(w,0))
# 第三个放减弱的图
imgb = img_color.enhance(0.5)
image_output.paste(imgb, (2*w, 0))
image_output.show()
if __name__ == '__main__':
main()
亮度调整
im1 = Image.open("./kfc-1.jpg")
# 亮度调整
image_color = ImageEnhance.Brightness(im1)
# 亮度大于1增强,小于1减弱
image1 = image_color.enhance(1.6)
image1 = image_color.enhance(0.6)
image1.show()
绘制图片和验证码
绘制图片
from PIL import Image
from PIL import ImageDraw,ImageFont
def main():
# 创建画布,一个300×250的白色底面图像
pic = Image.new('RGB',(300,250),'white')
# 选择之前创建的图片资源去作画
draw_obj = ImageDraw.Draw(pic)
# 绘制蓝色填充,红色描边的矩形,从(50,50)到(100,100)
draw_obj.rectangle((50,50,150,150),fill='blue',outline='red')
# 绘制文本,需要加载字体文件,请求大小为20
font = ImageFont.truetype('test.ttf',20)
# 在画布(100,100)的地方写'abcdef',字体为导入字体,填充为绿色
draw_obj.text((100,100),'abcdef',font=font,fill='green')
# 画一个圆形,以第一个参数作为外切矩形,从弧度为0,画到180,填充颜色为蓝
draw_obj.arc((0,0,100,50),0,180,fill='blue')
# 画一条线,从(0,0)画到(20,30),颜色为黄,宽度为3
draw_obj.line((0,0,20,30),fill='yellow',width=3)
# 画两条线,从左上角画到右下角,从左下角画到右上角,色号选择(255,255,0),宽度设置为5
draw_obj.line((0,0)+pic.size,fill=(255,255,0),width=5)
draw_obj.line((0,pic.size[1],pic.size[0],0), fill=(255,255,0), width=5)
pic.show()
if __name__ == '__main__':
main()
绘制验证码
from PIL import Image
from PIL import ImageDraw
import random
pic = Image.new('RGB',(300,250),'white')
draw_obj = ImageDraw.Draw(pic)
# 随机生成RGB颜色
def get_color():
return (random.randint(200,255),random.randint(200,255),random.randint(200,255))
# 生成随机小写字母,ASCII码
def get_char():
return chr(random.randint(65,97))
def main():
# 对整张图进行遍历,并使得每个像素都有一个花点
for x in range(300):
for y in range(250):
draw_obj.point((x,y),fill=get_color())
# 干扰线
draw_obj.line(((10,10),(80,80)),fill=(0,255,0),width=3)
# 生成随机字母并画在上面
for i in range(4):
draw_obj.text((10+i*20,100),get_char(),fill=(255,0,0))
pic.show()
if __name__ == '__main__':
main()