PIL读取图像颜色失真问题#RGB#灰度图
作者:JasonChen
时间:2019.4.27
博主今天在做图像识别的项目,需要用到PIL包读取并显示图像,可是显示图像如下图所示:
而原图像是这种:
显然,图像颜色失真,注:"SS"是我加在图层上面的字符
通过参考其他博客的内容:总共得到两种bug:
(1)需要说明的是:若图像的像素矩阵是三维的话,则PIL默认是RGB格式读取进来,若像素矩阵是二维的话,则会强制被认为是灰度图(“L”)格式,这和像素值大小无关,只和像素矩阵的维数有关,其中灰度图格式只处理[0,1]浮点型数值,若图像的像素值远远超过了1且不为三维的话,即造成图像失真。
(2)若图像是三维的,但是读取进来的是BGR格式的话,需要将其转化为RGB格式,这里贴出PIL包转化的具体代码,其中pic_path是图像路径,需要导入PIL包:
from PIL import Image
image = Image.open(pic_path)
b, g, r = image.split()
image = Image.merge("RGB", (r, g, b))
plt.imshow(image)
本次着重讨论解决第一种的方法:首先查看读取进来的信息:
如上图所示:由于像素矩阵是二维的,默认打开的是灰度图格式(“L”),这里利用np.array()函数将其转化为数组的形式,然后发现像素值是属于[0, 255]范围,所以造成图像失真。
解决方案如下:
将二维数据转化为三维:只要在open()函数后面加上convert(“RGB”)就可以了,如下图所示:
可以看到像素矩阵的前面两维度的大小均没有改变,只是简单的将二维格式中的每个像素值复制3次,从而扩展到第三维。
总结回顾
下次遇到颜色失真问题,首先考虑方案1,open语句后面加convert(“RGB”),当然如果本身就是三维的话,你也可以将三维彩色图像转化为二维的灰度图convert(“L”);其次考虑方案2,将BGR转化为RGB格式的方法,这两种方法都用上,可以解决大部分颜色失真问题,PS:cv2.imread(path)函数中的图片路径path中不能包含中文,否则返回None!
上一篇: Matlab中mesh函数的用法