PNG格式的图片支持透明度设置,用PS处理图像保存为PNG格式有时候会带有alpha通道,查看图片的属性会显示32位(R8、G8、B8、alpha8),可能是LA或者RGBA。
在PIL中使用Image.convert()实现色彩空间转换
PIL中convert()包含九种不同模式(二值图“1”,灰度图“L”,P,RGB,RGBA,CMYK,YCbCr,I,F)。PIL需要与numpy结合使用才能对数组进行处理。
import cv2
from PIL import Image
import matplotlib.pyplot as plt
path = r"D:\Photo\2.png"
image1 = cv2.imread(path)
image2 = Image.open(path)
rgb = image2.convert('RGB') # 色彩空间转换
print(rgb)
# 输出<PIL.Image.Image image mode=RGB size=1024x1024 at 0x204BAE91FA0>
在OpenCV中使用cv2.cvtColor()实现多种色彩空间转换
因为CV2读取图像返回的是数组,所以直接用print(rgba.shp)读取数组的维数。
bgr = image1
rgb = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)
plt.imshow(bgr) # 显示直接读取的图片
plt.show()
plt.imshow(rgb) # 显示改变后的图片
plt.show() # 显示图片
print('bgr=\n', bgr) # 打印数组
print('rgb=\n', rgb)
将RGB转换为RGBA:
rgba = cv2.cvtColor(rgb, cv2.COLOR_RGB2RGBA)
print('(H,W,C)=', rgba.shape)
# 输出(H,W,C)= (644, 1044, 4)
转换实例:一张用PS处理为灰度图属性显示32位的图像
path = r"D:\Photo\3.png"
image1 = cv2.imread(path)
image2 = Image.open(path)
print("----------cv2矩阵-----------")
print('image1=\n', image1, '\n(H,W,C)=', image1.shape) # 查看读取的矩阵
# image1 = 三维数组表现为三个通道
# (H,W,C)= (1024, 1024, 3)
print("----------PIL矩阵-----------")
Img = np.array(image2)
print('image1=\n', Img, '\n', '\n(W,H,C)=', Img.shape) # PIL读取为数组之后查看
# (W,H,C)= (1024, 1024, 2) 三维数组表现为两个通道
print("-------------CV2转换--------------")
GRAY = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) # GRAY灰度图
print(GRAY.shape)
# 输出(1024, 1024)
print("-------------PIL转换--------------")
print(len(image2.split())) # PIL读取原图像输出是2,即两个通道,判断是LA也就是带有透明度的灰度图
L = image2.convert('L') # 转换为灰度图
print(len(L.split())) # 输出1
print(L.size)
由于读取方式的不同导致矩阵产生也不相同。shape对矩阵进行处理,所以产生结果也不相同。下图是读取这张32位图像的矩阵结果。
CV2读取默认是三通道读取。CV2和PIL转换后都变成了灰度图(二维)。
(运行完之后未保存图像位没有发生变化还是32位)
32位LA图像转换为灰度图代码:
import os
from PIL import Image
# 针对LA图像进行批量处理为灰度图
def delete_alpha(imput, output):
files = os.listdir(imput)
for file in files:
a, b = os.path.splitext(file)
img = Image.open(os.path.join(imput + "/" + file))
if len(img.split()) == 2: # 判断图像是不是有两个通道
L = img.convert('L')
L.save(output + a + b)
else:
img.save(output + a + "1" + b)
if __name__ == '__main__':
imput = r"D:\Photo\1"
output = r"D:\Photo\2/"
delete_alpha(imput, output)