彩色图像的灰度化、二值化 以及什么是索引图像
【引言】在图像预处理阶段,对彩色图像灰度化、二值化是常见的处理方式。通常是先对图像做灰度化,再做二值化,它们能够在特定场景发挥出功效,文本做梳理总结。
彩色图像
每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。RGB图像与索引图像一样都可以用来表示彩色图像。与索引图像一样,它分别用红(R)、绿(G)、蓝(B)三原色的组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值(由RGB三原色表示)直接存放在图像矩阵中,由于每一像素的颜色需由R、G、B三个分量来表示,M、N分别表示图像的行列数,三个M x N的二维矩阵分别表示各个像素的R、G、B三个颜色分量。RGB图像的数据类型一般为8位无符号整形,通常用于表示和存放真彩色图像,当然也可以存放灰度图像。
灰度化(grayscale):
灰度是指只含亮度信息,不含色彩信息的图像。黑白照片就是灰度图,特点是亮度由暗到明,变化是连续的。要表示灰度图,就需要把亮度值进行量化
使用灰度图的好处:
① RGB的值都一样,即减少了计算量。
② 图像数据即调色板索引值,就是实际的RGB值,也就是亮度值。
③ 因为是256色调色板,所以图像数据中一个字节代表一个像素,很整齐。
所以,做图像处理时都采用灰度图。
二值化
是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。
将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位。
首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。
其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。
下程序可以实现图像的二值化:
/************************************** * * 函数名: * cvBinaryEx * 参 数: * imgSrc - 进行锐化的图像 * 返回值: * 成功锐化返回TRUE,否则返回false; * 说 明: * * 对图进行二值化 * ************************************/ bool cvBinaryEx(IplImage *imgSrc) { IplImage* img = cvCreateImage(cvGetSize(imgSrc),imgSrc->depth,imgSrc->nChannels); CvScalar s; int sum=0; for (int i=0; i < imgSrc->height; i++) { for (int j=0; j < imgSrc->width; j++) { s = cvGet2D(imgSrc,i,j); sum = (s.val[0]+s.val[1]+s.val[2])/3; if (sum > 128) { s.val[0]=s.val[1]=s.val[2]=255; cvSet2D(imgSrc,i,j,s); } else { s.val[0]=s.val[1]=s.val[2]=0; cvSet2D(imgSrc,i,j,s); } } } return true; }
索引图像
即它的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为[0,255],则MAP矩阵的大小为256Ⅹ3,用MAP=[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。索引图像的数据类型一般为8位无符号整形(int8),相应索引矩阵MAP的大小为256Ⅹ3,因此一般索引图像只能同时显示256种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,如Windows中色彩构成比较简单的壁纸多采用索引图像存放,如果图像的色彩比较复杂,就要用到RGB真彩色图像。
参考:https://blog.csdn.net/timidsmile/article/details/6681668
https://blog.csdn.net/iamchenxin2014/article/details/70805928