彩色图像转换灰度图像

发布于 2022年 05月 19日 18:30

数字图像

     现在我们所接触到的图像绝大多数都是数字图像,图像数字化后,每个像素点就可以看作是一个小方格,每个小方格里面存储的就是图像的像素信息。如果把一副数字图像抽象出来,就是一个二维矩阵(灰度图)或者三维矩阵(彩色图)

彩色图像

     任何颜色都有红、绿、蓝三原色组成。用红、绿、蓝三元组的二维矩阵来表示(这样构成了三个通道),抽象出来一起构成了一个三维数组。三元组的每个数值也是在0-255之间,0表示相应的基色在该像素中没有,而255表示相应的基色在该像素中取得最大值。通过调节每个通道数灰度值的亮度,从而对三个通道中的三种基色进行不同搭配,进而构成了五颜六色的彩色世界!!我们可以把这三种基色(红、绿、蓝)看成三种颜料,每一个颜色通道里面的灰度等级看成每种颜料的调色板,灰度等级越大,那么对应的通道中的颜色就越接近三种基色。例如一个8bit的彩色图片,灰度等级为0~255,如果第0通道(R)里面灰度等级为255,这个通道显示的色板就是红色,如果灰度等级小于255,那个红色就会越来越淡,到0的时候就表示红色这个基色在0通道里面没有了,依次类推,第1通道(G)、第2通道(B)也是这个原理,然后将这三种色板的基色重叠在一起,就好比三种基色颜料混合在一起,这样就构成了彩色图像。

灰度图像

     每个像素的亮度用一个数值来表示,取值范围0-255,0表示黑、255表示白,其他值表示处于黑白之间的灰度,抽象出来构成了一个二维数组。灰度图像就没有色彩了,他的颜色是介于黑色到白色。255表示白色,0表示黑色,灰度等级处于之间就表示成不同等级的灰色。

图像转换

     彩色图像转换成灰度图像最基本的就是考虑怎么去分配三个通道里面的灰度等级,如果单纯直接将R通道里面的灰度值全部拿出来,也会构成一个灰度图像,同理,拿出G通道、B通道的拿出来,也是一副灰度图像,但是我们一般不这样做。查阅官方手册后,我们可以思考,通过以下几种方法来转换彩色图像的三个通道的灰度值:

 

    浮点算法:Gray=0.299R+0.587G+0.114B

    整数方法:Gray=(R30+G59+B*11)/100

    移位方法:Gray=(R28+G151+B*77)>>8

    平均值法:Gray=(R+G+B)/3

    最大值法:Gray = max(R,G,B)

    最小值法:Gray = min(R,G,B)

    仅取绿色:Gray=G

 

    上面公式中的R、G、B表示这三个通道里面的灰度值。为什么会出现这样不同的比例转换呢?因为我们人的眼睛对颜色的敏感程度是不一样的,我们对绿色更加敏感,其次是红色,最后是蓝色。所以对不同通道里的灰度值进行加权,加权后得到的灰度值就是我们转换后的灰度图的灰度值,所以这样得到的灰度图像更符合我们人眼的直观映像。转换后存到对应的二维数组里面,这个数组就是转换后的灰度图像抽象意义上的二维数组,显示出来就是一副灰度图像。这就是彩色图像转换成灰度图像的原理。

编写图像彩色空间转换灰度图像算法

(1)导包,读取图片,划分三个通道值;

 

(2)采用三通道的平均值、最大值、最小值、经典的加权和OpenCV库的cvtColor函数转换作为最终灰度图像的值;

a. 创建储存图片矩阵,求平均值、最大值、最小值、经典的加权转换和cvtColor函数结果;

 

 

 

b. 通过imshow显示图片;

c.用原RGB图片经处理后得到以下图片;

结论:在使用加权公式计算的结果与OpenCV内置函数的结果基本上一样,故两者最为接近,用最大值生成的图片比较明亮,平均值居中,最小值较暗。

 

(3)用Numpy内置函数优化程序代码,提高其运行速度。

a. 使用time库对优化的代码进行计时;

b.通过imshow显示图片并加入监听“ESC”,点击时撤销全部图片;

 

c.优化图片与for循环生成的数据一致;

d.对比显示两者之间运行速度;

 

 

结论:用Numpy中矩阵运算对数据进行处理比传统用for循环一个个像素的赋值处理运行速度得到了明显地提升,充分说明了Numpy在矩阵运算处理方面的优越性。

 

参考资料:https://blog.csdn.net/qq_44820108/article/details/121702791

推荐文章