您的位置:首页 > 其它

图像处理--灰度化,二值化与反色

2012-08-24 20:34 260 查看
灰度化
在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。一般有以下四种方法对彩色图像进行灰度化:   

1.分量法   

将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。f1(i,j)=R(i,j) f2(i,j)=G(i,j) f3(i,j)=B(i,j) 其中fk(i,j)(k=1,2,3)为转换后的灰度图像在(i,j)处的灰度值。

如图4-1的彩色图像转为4-2三种灰度图。



 图4-1 彩色图像   (a)R分量灰度图 (b)G分量灰度图 (c)B分量灰度图   

图4-2 彩色图的三分量灰度图   

2.最大值法   

将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。   f(i,j)=max(R(i,j),G(i,j),B(i,j))   

3.平均值法   

将彩色图像中的三分量亮度求平均得到一个灰度图。   f(i,j)=(R(i,j)+G(i,j)+B(i,j)) /3   

4.加权平均法   

根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。   f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j))

二值化




全局二值化

  一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体,最常用的方法就是设定一个全局的阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。将大于T的像素群的像素值设定为白色(或者黑色),小于T的像素群的像素值设定为黑色(或者白色)。

  全局二值化,在表现图像细节方面存在很大缺陷。为了弥补这个缺陷,出现了局部二值化方法。

  局部二值化的方法就是按照一定的规则将整幅图像划分为N个窗口,对这N个窗口中的每一个窗口再按照一个统一的阈值T将该窗口内的像素划分为两部分,进行二值化处理。

局部自适应二值化

  局部二值化也有一个缺陷。这个缺陷存在于那个统一阈值的选定。这个阈值是没有经过合理的运算得来,一般是取该窗口的平局值。这就导致在每一个窗口内仍然出现的是全局二值化的缺陷。为了解决这个问题,就出现了局部自适应二值化方法。

  局部自适应二值化,该方法就是在局部二值化的基础之上,将阈值的设定更加合理化。该方法的阈值是通过对该窗口像素的平均值E,像素之间的差平方P,像素之间的均方根值Q等各种局部特征,设定一个参数方程进行阈值的计算,例如:T=a*E+b*P+c*Q,其中a,b,c是自由参数。这样得出来的二值化图像就更能表现出二值化图像中的细节。

反色
反色的实际含义是将R、G、B值反转。若颜色的量化级别是256,则新图的R、G、B值为255减去原图的R、G、B值。这里针对的是所有图,包括真彩图、带调色板的彩色图(又称为伪彩色图)、和灰度图。针对不同种类有不同的处理。先看看真彩图。我们知道真彩图不带调色板,每个象素用3个字节,表示R、G、B三个分量。所以处理很简单,把反转后的R、G、B值写入新图即可,比如一个点的颜色为(0,0,0),反色后为(255,255,255)。再来看看带调色板的彩色图,我们知道位图中的数据只是对应调色板中的一个索引值,我们只需要将调色板中的颜色反转,形成新调色板,而位图数据不用动,就能够实现反转。
灰度图是一种特殊的伪彩色图,只不过调色板中的R、G、B值都是一样的而已。所以反转的处理和上面讲的一样。
求区域内R,G,B的各自平均值
求R,G,B的平均值在图像处理上有很大的意义,代码如下:

void GetRGBInfo(CPoint point,CPoint pStart ,int& nBData,int& nGData ,int & nRData)
{
int nLeft,nRight,nUp,nBottom;
nLeft = point.x<pStart.x?point.x:pStart.x;
nRight = point.x>pStart.x?point.x:pStart.x;
nBottom = point.y<pStart.y?point.y:pStart.y;
nUp = point.y>pStart.y?point.y:pStart.y;
int nNum = 0;
long nValueR=0;
long nValueG=0;
long nValueB=0;

for (int i=nBottom;i<nUp;i++)
{
for (int j=nLeft;j<nRight;j++)
{
nValueR+= g_pImageSrc[i*m_nPicWidth*3+j*3];
nValueG+= g_pImageSrc[i*m_nPicWidth*3+j*3+1];
nValueB+= g_pImageSrc[i*m_nPicWidth*3+j*3+2];
nNum++;
}
}
if (nNum!=0)
{
nBData = nValueR/nNum;
nGData = nValueG/nNum;
nRData = nValueB/nNum;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: