色彩空间转换RGB之PIL和OpenCV的区别

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结合使用才能对数组进行处理。


  
  
  1. import cv2
  2. from PIL import Image
  3. import matplotlib.pyplot as plt
  4. path = r"D:\Photo\2.png"
  5. image1 = cv2.imread(path)
  6. image2 = Image. open(path)
  7. rgb = image2.convert( 'RGB') # 色彩空间转换
  8. print(rgb)
  9. # 输出<PIL.Image.Image image mode=RGB size=1024x1024 at 0x204BAE91FA0>

在OpenCV中使用cv2.cvtColor()实现多种色彩空间转换

 因为CV2读取图像返回的是数组,所以直接用print(rgba.shp)读取数组的维数。


  
  
  1. bgr = image1
  2. rgb = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)
  3. plt.imshow(bgr) # 显示直接读取的图片
  4. plt.show()
  5. plt.imshow(rgb) # 显示改变后的图片
  6. plt.show() # 显示图片
  7. print( 'bgr=\n', bgr) # 打印数组
  8. print( 'rgb=\n', rgb)

​ 

  将RGB转换为RGBA:


  
  
  1. rgba = cv2.cvtColor(rgb, cv2.COLOR_RGB2RGBA)
  2. print( '(H,W,C)=', rgba.shape)
  3. # 输出(H,W,C)= (644, 1044, 4)

转换实例:一张用PS处理为灰度图属性显示32位的图像


  
  
  1. path = r"D:\Photo\3.png"
  2. image1 = cv2.imread(path)
  3. image2 = Image. open(path)
  4. print( "----------cv2矩阵-----------")
  5. print( 'image1=\n', image1, '\n(H,W,C)=', image1.shape) # 查看读取的矩阵
  6. # image1 = 三维数组表现为三个通道
  7. # (H,W,C)= (1024, 1024, 3)
  8. print( "----------PIL矩阵-----------")
  9. Img = np.array(image2)
  10. print( 'image1=\n', Img, '\n', '\n(W,H,C)=', Img.shape) # PIL读取为数组之后查看
  11. # (W,H,C)= (1024, 1024, 2) 三维数组表现为两个通道
  12. print( "-------------CV2转换--------------")
  13. GRAY = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) # GRAY灰度图
  14. print(GRAY.shape)
  15. # 输出(1024, 1024)
  16. print( "-------------PIL转换--------------")
  17. print( len(image2.split())) # PIL读取原图像输出是2,即两个通道,判断是LA也就是带有透明度的灰度图
  18. L = image2.convert( 'L') # 转换为灰度图
  19. print( len(L.split())) # 输出1
  20. print(L.size)

由于读取方式的不同导致矩阵产生也不相同。shape对矩阵进行处理,所以产生结果也不相同。下图是读取这张32位图像的矩阵结果。

 CV2读取默认是三通道读取。CV2和PIL转换后都变成了灰度图(二维)。

(运行完之后未保存图像位没有发生变化还是32位)

32位LA图像转换为灰度图代码:


  
  
  1. import os
  2. from PIL import Image
  3. # 针对LA图像进行批量处理为灰度图
  4. def delete_alpha( imput, output):
  5. files = os.listdir(imput)
  6. for file in files:
  7. a, b = os.path.splitext(file)
  8. img = Image. open(os.path.join(imput + "/" + file))
  9. if len(img.split()) == 2: # 判断图像是不是有两个通道
  10. L = img.convert( 'L')
  11. L.save(output + a + b)
  12. else:
  13. img.save(output + a + "1" + b)
  14. if __name__ == '__main__':
  15. imput = r"D:\Photo\1"
  16. output = r"D:\Photo\2/"
  17. delete_alpha(imput, output)

 https://blog.csdn.net/qq_53914247/article/details/129654286




Mike_666

不知所起.

色彩空间转换RGB之PIL和OpenCV的区别

posted @ 2023-07-13 09:30  坦笑&&life  阅读(6)  评论(0编辑  收藏  举报  来源