最后结论:
Grey = (R*38 + G*75 + B*15)>> 7
代码
#include <cv.h>
#include <highgui.h>
using namespace cv;
int main(){
Mat src= imread("C:\\Users\\Poplar\\Pictures\\ff.jpg");
Mat grey(src.rows, src.cols, CV_8UC1, Scalar(0));
for (inty = 0; y < src.rows; y++)
{
uchar*cp = src.ptr<uchar>(y);
uchar*gp = grey.ptr<uchar>(y);
for(int x = 0; x < src.cols; x++){
*gp= (15*cp[0] + 75*cp[1] + 38*cp[2]) >> 7;
cp+= 3;
gp++;
}
}
imshow("src",src);
imshow("grey",grey);
waitKey(0);
return0;
}
效果如图
下面具体解释
RGB彩色图像中,一种彩色由R(红色),G(绿色),B(蓝色)三原色按比例混合而成。
图像的基本单元是一个像素,就像一个巨幅电子广告屏上远处看是衣服图像,走近你会看到一个一个的方格,这个方格的颜色是一种,从远处看,觉察不到这个方格的存在。
一个像素需要3块表示,分别代表R,G,B,如果8为表示一个颜色,就由0-255区分不同亮度的某种原色。
一张9像素的8位RGB图像,在计算机内存中的分布大概示意如下:
实际中数都是二进制形式的,并且未必按照R,G,B顺序,比如opencv是按照B,G,R顺序将三个色值保存在3个连续的字节里
灰度图像是用不同饱和度的黑色来表示每个图像点,比如用8位 0-255数字表示“灰色”程度,每个像素点只需要一个灰度值,8位即可,这样一个3X3的灰度图,只需要9个byte就能保存
RGB值和灰度的转换,实际上是人眼对于彩色的感觉到亮度感觉的转换,这是一个心理学问题,有一个公式:
Grey = 0.299*R + 0.587*G + 0.114*B
根据这个公式,依次读取每个像素点的R,G,B