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

本文介绍了PNG格式图片的透明度特性,以及在Python中使用PIL和OpenCV进行色彩空间转换的方法,包括从RGB到RGBA的转换,以及如何处理32位的LA(灰度+透明度)图像。文章还提供了一个批量处理LA图像转为灰度图的函数示例。
摘要由CSDN通过智能技术生成

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)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值