PIL:Python Imaging Libaray PIL库是python图像处理库
但是PIL仅仅支持到Python2.7,一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新Python 3.x
安装Pillow库:pip install pillow
但是导入包的时候还是:导入PIL这个库中的Image模块
import PIL
from PIL import Image
1.打开图片:Image.open()
from PIL import Image
image=Image.open(r"D:\4.jpg")
2.展示图片
from PIL import Image
image=Image.open(r"D:\4.jpg")
image.show()
3.保存图片:
from PIL import Image
image=Image.open(r"D:\4.jpg")
image.save("D:\linzhiling.jpg")
4.输出图片的size和mode
(1)Rgb图像
from PIL import Image
image1=Image.open(r"D:\4.jpg")
print(image1.size)#(1680, 1050)
print(image1.mode)#RGB
(2)灰度图像
image2=Image.open(r"D:\2.jpg")
print(image2.size)#(457, 783)
print(image2.mode)#L
mode表示图片的模式,RGB表示彩色图像,L代表灰度图
size 属性为图片的大小(宽度,长度),无论是彩色图还是灰度图都是返回(xxx,xxx),也就是说不会返回通道数
5.rgb图和灰度图互相转化
(1)rgb图转化成灰度图
image1=Image.open(r"D:\4.jpg")
print(image1.size)#(1680, 1050)
print(image1.mode)#RGB
image2=image1.convert("L")
image2.show()
(2)灰度图转彩色图
image2=Image.open(r"D:\2.jpg")
print(image2.size)#(457, 783)
print(image2.mode)#L
image3=image2.convert("RGB")
print(image3.size)#(457, 783)
print(image3.mode)#RGB
image3.show()
和cv2库的灰度图一样,虽然转成了三通道的图,但是看起来还是和灰度图一摸一样
6.图片缩放resize
image1=Image.open(r"D:\4.jpg")
print(image1.size)#(1680, 1050)
print(image1.mode)#RGB
image2=image1.resize((256,256))
image2.show()
7.图片旋转:
im = image.rotate(45) # 逆时针旋转 45 度
im = image.transpose(Image.FLIP_LEFT_RIGHT) # 左右翻转
im = im.transpose(Image.FLIP_TOP_BOTTOM)# 上下翻转
8.对每个像素值进行操作
image1=Image.open(r"D:\4.jpg")
print(image1.size)#(1680, 1050)
print(image1.mode)#RGB
image2=image1.point(lambda i:i*5)#所有像素点都乘以5
image2.show()
原图:
代码运行后:
比较常见的应用是将一张0/1二值图变成0/255二值图:
比如这样一张图:
运行下面代码后:
image2=Image.open(r"D:\Test.png")
print(image2.size)#(457, 783)
print(image2.mode)#L
image3=image2.point(lambda i:i*255)
image3.show()
得到:
其他两种实现将一张0/1二值图变成0/255二值图的方法参见本人另一篇博客:一张单通道的二值图(0,1二值图)转化为单通道二值图(0,255)二值图_Pr Young的博客-CSDN博客
9. 图片和Numpy数组之间相互转化:
(1)图片转数组
image2=Image.open(r"D:\4.jpg")
print(image2.size)#(1680,1050)
print(image2.mode)#RGB
array = np.array(image2)
print(array.shape) #(1050, 1690, 3)
(2)数组转图片
image2=Image.open(r"D:\4.jpg")
print(image2.size)#(1680,1050)
print(image2.mode)#RGB
array = np.array(image2)
print(array.shape) #(1050, 1690, 3)
out = Image.fromarray(array)
out.show()