(一)PIL(python image library)的基本概念
PIL中主要涉及几个概念:通道、模式、尺寸、坐标系统、调色板、信息和滤波器。
(1) 通道
首先我们要知道一张图片是怎么样的。图片是有三种颜色组成的也就是RGB三原色,一张图片可以变成红色,绿色,蓝色三张图片。这个也就是所谓的通道数。然而对于黑白或者灰度图像来说,就只有一个通道了。有的图片是四通道的(RGBA)她在最后加了一个维度,为透明度。
(2) 模式
模式定义了图像的类型和像素的位宽。
(3) 尺寸
可以通过size属性来获取图像的储存,这是一个二元组,也就是水平和垂直方向上的像素数量。
(4) 信息
使用info属性,可以为一张图片添加一些辅助信息。这是一个字典对象,加载和保存图片文件是,多少信息 需要处理取决于文件。
from PIL import Image
img = Image.open("./img/0.jpg")
print(img.getbands()) # ('R', 'G', 'B')
print(img.mode) # RGB
print(img.size) # (400, 395)
print(img.readonly) # 1
img.info["name"] = "阿猫阿狗"
print(img.info) # {'loop': 1, 'background': (255, 255, 255, 255), 'name': '阿猫阿狗'}
# img.show()
import numpy as np
from PIL import Image
# 把numpy转换成PIL,图片的形状是(H,W,C)
np_img = np.random.randint(0,256,(300,300,3),dtype=np.int32)
print(np_img.shape) # (300, 300, 3)
img = Image.fromarray(np_img,"RGB")
# img.show()
# 把PIL转换成numpy
img0 = Image.open("./img/0.jpg")
np_img0 = np.array(img0)
print(np_img0.shape) # (395, 400, 3)
img0.close()
# 把RGB模式转变成L模式(灰度图)
img1 = Image.open("./img/0.jpg")
img1 = img1.convert("L")
print(img1.mode) # L
img1.show()
# 把L转成RGB
img2 = img1.convert("RGB")
print(img2.mode) # RGB
img2.show()
(5) 坐标系
PIL使用的是笛卡尔坐标系,和我们平时数学中的坐标系有一些不同。
(6) 调色板
调色板模式(“P”)使用一个颜色调色板为每个像色定义具体的颜色值。
(7) 滤波器
对于多个输入的像素因设为一个输出像素的几何操作。
(二)代码
import numpy as np
from PIL import Image
# 缩放
img = Image.open("./img/0.jpg")
print(img.size) # (400, 395)
img = img.resize((200,200))
print(img.size) # (200, 200)
# img.show()
img.close()
# 局部缩放
img = Image.open("./img/0.jpg")
img = img.resize((200,200),box=(100,100,200,200),resample=Image.Resampling.LANCZOS) # 后面是取样方法
# img.show()
img.close()
# 创建缩略图(按比例)
img = Image.open("./img/0.jpg")
img.thumbnail((200,200),resample=Image.Resampling.NEAREST)
print(img.size) # (200, 198)
# img.show()
# 通道分离
img = Image.open("./img/0.jpg")
print(img.getbands()) # ('R', 'G', 'B')
r,g,b = img.split()
print(r.size,r.mode,r.info) # (400, 395) L {'loop': 1, 'background': (255, 255, 255, 255), 'timestamp': 0, 'duration': 0}
# r.show()
img.close()
# 图像合并
img1 = Image.open("./img/0.jpg")
img2 = Image.open("./img/9.jpg")
img1 = img1.resize((200,200))
img2 = img2.resize((200,200))
r1,g1,b1 = img1.split()
r2,g2,b2 = img2.split()
img3 = Image.merge("RGB",(r1,g2,b2))
img4 = Image.blend(img1,img2,0.5) # 0.3为第一张图片的透明度
img3.show()
img4.show()
img0.close()
img1.close()
img2.close()
img3.close()
img4.close()
# 图像裁剪
img1 = Image.open("./img/0.jpg")
img_crop = img1.crop((100,100,200,200))
# img_crop.show()
print(img_crop.size) # (100, 100)
# 获取像素点
p = img1.getpixel((100,100))
print(p) # (208, 195, 190)
#图像的拷贝和粘贴
img = img1.copy()
img_paste = Image.new("L",(100,100),color=200) # 白色的图片
img.paste(img_paste,box=(100,100,200,200),mask=img_paste) # 在img图片的box位置上粘贴img_paste
# img.show()
# 图像翻转
img2 = img1.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
img3 = img1.transpose(Image.Transpose.FLIP_TOP_BOTTOM)
# img2.show()
# img3.show()
# 任意角度旋转
img4 = img1.rotate(45)
# img4.show()
# 图像随意变形
img5 = img1.transform((200,200),Image.Transform.EXTENT,data=[100,100,150,150],resample=Image.Resampling.BILINEAR)
img5.show()
import PIL.Image as image
import PIL.ImageDraw as draw
import PIL.ImageFont as imagefont
import PIL.ImageFilter as imgfilter
path = "./img/cat1.jpg"
img1 = image.open(path)
# img1.show() # 使用默认工具打开图片
print(img1.size) # (500, 400)
img2 = img1.resize((250,250)) # 重置大小
# img2.show()
img3 = img2.rotate(45,expand=True) #旋转图片
# img3.show()
img3.save("./cat.jpg")
img = draw.Draw(img1)
img.rectangle((0,0,500,400),outline="green",width=3) # 画矩形
img.line((0,0,500,400),fill="yellow",width=3)# 划线
img.point((250,200),fill="red")# 画点
font = imagefont.truetype("SIMYOU.TTF",size=40) # 引入字体 幼圆字体
img.arc((150,100,350,300),0,360,fill="white",width=3) # 画圆弧 前面是矩形的坐标,后面是圆弧的度数0-360
img.chord((150,100,350,300),0,180,fill="white",outline="green",width=3) # 画半圆
img.text((240,350),"猫",fill="blue",align="center",font=font) # 写字
# img1.show()
img4 = img1.convert("L") # 转换为灰度图
# img4.show()
# img5 = img1.filter(imgfilter.BLUR()) # 模糊
img5 = img1.filter(imgfilter.CONTOUR()) # 素描
img5.show()
输出结果:













网友评论