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

本人水平有限,从最简单的图像处理算法写起,希望能和大家共同提高。


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

一 灰度图定义

参考百度百科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;

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

三 效果和效率

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


效果呢?

系统方法 乘法 移位
图像处理算法系列 第一章 灰度图_第1张图片 图像处理算法系列 第一章 灰度图_第2张图片 图像处理算法系列 第一章 灰度图_第3张图片

肉眼上没有太大差距

你可能感兴趣的:(算法,opencv,灰度图)