Matlab读入PNG图像后自动反色现象解释

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/daniu2007/article/details/83650294

       今天发现一个神奇的现象:一幅PNG格式的8位深黑白二值图像用Matlab imread( )函数读入后自动反色了,即原本黑色的区域变成白色,原本白色的区域变成黑色,如下图所示。

                                         

        事实上,查看Matlab工作区中保存图像数据的变量,可以看到其中保存的图像数值也反了, 即原图中黑色的区域像素值是255,白色的区域像素值却是0。

        尝试了用画图、photoshop打开原图,能正常显示,不会自动反色。看起来图像没有问题,难道是Matlab的问题?但是我用matlab imread()读入另一张八位深二值PNG图像却能正常显示。在网上检索“Matlab读入PNG图像反色”找不到相关问题和答案。为了一探究竟,我打算先从了解PNG文件入手。在网上检索到了一个博客,对PNG文件做了详细的介绍,其中一篇博文链接如下:

https://blog.csdn.net/hherima/article/details/45848171

        按照博文中的做法,我下载了UltraEdit来查看PNG文件中的数据块。用UltraEdit分别打开一张能正常在Matlab中显示的PNG二值图像,和一张在matlab中会自动反色的PNG二值图像,如下所示:

                                      

        图中圈出来的位置指示的是图像的颜色类型。该位置00表示灰度图像,03表示索引彩色图像。问题似乎有解了,那张在matlab中自动反色的图像的颜色类型居然是索引彩色图。查看matlab imread() 函数的帮助文档,可以看到matlab读入索引图像的方式如下:

                                  

        Matlab还提供了索引图像转RGB和灰度图的函数,分别为ind2rgb( )和ind2gray( )。既然这样,是不是意味着我们按照索引图像的读入方式读入那张会自动反色的图像,然后转化为灰度图,就应该能正常显示了。代码如下:

 [X,map] = imread('0855.png');
 Org1= ind2gray(X,map);
 imshow(Org1)

        程序运行的结果果然是正常显示了,如下所示:

扫描二维码关注公众号,回复: 4803444 查看本文章

                                                      

         再来看Matlab读取的调色板(map):

                                               

        从上图可以看出,调色板第一行对应的是1,第256行对应的是0。在索引图像中,像素值是该像素的颜色在调色板上的位置。由于8位深的图像的像素值在0-255区间,像素值对应调色板上的行数。所以,当像素值为0时,对应调色板上的颜色值为1;像素值为255时,对应调色版上的颜色值为0。所以,在索引图像中,黑色区域的像素值是255,白色区域像素值是0,跟普通灰度图刚好相反。这就是为什么在matlab中会反色。

猜你喜欢

转载自blog.csdn.net/daniu2007/article/details/83650294