11.图像处理


03.图像处理

在setting中设置导入pillow库

前置知识

RGB颜色:3个颜色通道组成的颜色

3个颜色:红(255,0,0)、绿(0,255,0)、蓝(0,0,255)

其他常见:黄(255,255,0)

一个像素(pixel)=3字节

做实验的两张图如下,分别为kfc-1.jpgkfc-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()