欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

PIL读取图像颜色失真问题#RGB#灰度图

程序员文章站 2022-05-20 21:10:03
...

 作者:JasonChen
 时间:2019.4.27
 博主今天在做图像识别的项目,需要用到PIL包读取并显示图像,可是显示图像如下图所示:
PIL读取图像颜色失真问题#RGB#灰度图
 而原图像是这种:
PIL读取图像颜色失真问题#RGB#灰度图
 显然,图像颜色失真,注:"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)

  本次着重讨论解决第一种的方法:首先查看读取进来的信息:
PIL读取图像颜色失真问题#RGB#灰度图
 如上图所示:由于像素矩阵是二维的,默认打开的是灰度图格式(“L”),这里利用np.array()函数将其转化为数组的形式,然后发现像素值是属于[0, 255]范围,所以造成图像失真。
解决方案如下:
将二维数据转化为三维:只要在open()函数后面加上convert(“RGB”)就可以了,如下图所示:
PIL读取图像颜色失真问题#RGB#灰度图
PIL读取图像颜色失真问题#RGB#灰度图
 可以看到像素矩阵的前面两维度的大小均没有改变,只是简单的将二维格式中的每个像素值复制3次,从而扩展到第三维。
总结回顾
 下次遇到颜色失真问题,首先考虑方案1,open语句后面加convert(“RGB”),当然如果本身就是三维的话,你也可以将三维彩色图像转化为二维的灰度图convert(“L”);其次考虑方案2,将BGR转化为RGB格式的方法,这两种方法都用上,可以解决大部分颜色失真问题,PS:cv2.imread(path)函数中的图片路径path中不能包含中文,否则返回None!