您的位置:首页 > 其它

图像处理算法系列 第一章 灰度图

2013-04-08 21:34 295 查看
本人水平有限,从最简单的图像处理算法写起,希望能和大家共同提高。

这一章主要写灰度图的相关知识。

一 灰度图定义

参考百度百科http://baike.baidu.com/view/1184366.htm

Gray Scale Image 或是Grey Scale Image,又称灰阶图。把白色黑色之间按对数关系分为若干等级,称为灰度。灰



度分为256阶。用灰度表示的图像称作灰度图

什么叫灰度图?任何颜色都有红、绿、蓝三原色组成,假如原来某点的颜色为RGB(R,G,B),那么,我们可以通过下面几种方法,将其转换为灰度:

1.浮点算法:Gray=R*0.3+G*0.59+B*0.11

2.整数方法:Gray=(R*30+G*59+B*11)/100

3.移位方法:Gray =(R*76+G*151+B*28)>>8;

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

5.仅取绿色:Gray=G;

通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。

维基百科:

计算机领域中,灰度(Gray scale)数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。但是,在数字图像领域之外,“黑白图像”也表示“灰度图像”,例如灰度的照片通常叫做“黑白照片”。在一些关于数字图像的文章中单色图像等同于灰度图像,在另外一些文章中又等同于黑白图像。

http://zh.wikipedia.org/wiki/%E7%81%B0%E5%BA%A6%E5%9B%BE%E5%83%8F

二 灰度的计算

既然我们知道了灰度图的定义,那么我们怎么计算灰度图呢?

首先,申请灰度图的空间,空间大小为 width * height * sizeof(char), 如果使用一个char来表示颜色的,即0-255.

out.create(input.cols,input.rows,CV_8UC1);


然后,通过上面的公式进行计算,代码部分如下:

公式一:Gray=R*0.3+G*0.59+B*0.11;

int i,j;
uchar* p;
uchar* q;
uchar R,G,B;
for( i = 0; i < nRows; ++i)
{
p = input.ptr<uchar>(i);
q = out.ptr<uchar>(i);
for ( j = 0; j < nCols; ++j)
{
B = p[j * nChannels];
G =  p[j * nChannels + 1];
R =  p[j * nChannels + 2];
q[j] = 0.299 * R + 0.587 * G + 0.114*B;

}
}


公式二:Gray =(R*76+G*151+B*28)>>8;

只是把上面的那句话替换掉。

三 效果和效率

先看一下效率,原始方法和乘法基本一致,位移的效率要快一倍,所以在大型实时系统中,用位移代替乘法和除法就是一种很好的优化方法。
系统的方法应该有一些并行计算的内容,在很多情况下效果应该都比这个测试的结果要好一点,应该是我自己的机器开东西太多的原因,导致另外一个核比较慢,所以这里效率才比较低。



效果呢?

系统方法乘法移位



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