色彩空间转换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结合使用才能对数组进行处理。
-
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)
Mike_666