彩色图片信息量大,有的时候我们仅仅用灰度图像里的信息就已经够了,为了提高运算速度自然就会采用灰度图,甚至有时灰度图还是过大,采用二值化图像也是有可能的。我们识别物体,最关键的因素是梯度(现在很多的特征提取,SIFT,HOG等等本质都是梯度的统计信息),梯度意味着边缘,这是最本质的部分,而计算梯度,自然就用到灰度图像了。
我们日常的环境通常获得的是彩色图像,很多时候我们常常需要将彩色图像转换成灰度图像。也就是3个通道(RGB)转换成1个通道。
1)平均法
最简单的方法当然就是平均法,将同一个像素位置3个通道RGB的值进行平均。
I(x,y) = 1/3 * I_R(x,y) +1/3 * I_G(x,y)+ 1/3 * I_B(x,y)
2)最大最小平均法
取同一个像素位置的RGB中亮度最大的和最小的进行平均。
3)加权平均法
I(x,y) = 0.3 * I_R(x,y) +0.59 * I_G(x,y)+ 0.11 * I_B(x,y)
这是最流行的方法。几个加权系数0.3,0.59,0.11是根据人的亮度感知系统调节出来的参数,是个广泛使用的标准化参数。
我们这里直接用给出的函数灰度化。
#include //定义了许多数据结构和基本的函数
#include //很方便的图像捕获接口
#include
#include
#include
//#include
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
//Mat image;
//image = imread("01.jpg");
//
//namedWindow("Display", WINDOW_AUTOSIZE);
//imshow("Dispaly", image);
//waitKey(0); //等待键盘时间
//return 0;
/*将图像由彩色图片输出成黑白图片*/
Mat image;
image = imread("D:\\abc\\1.jpg");
Mat gray_image;
cvtColor(image, gray_image, CV_BGR2GRAY); //要引用头文件 opencv/opencv.hpp
imwrite("./Gray_Image.jpg", gray_image);
namedWindow("image", WINDOW_AUTOSIZE);
namedWindow("gray_image", WINDOW_AUTOSIZE);
imshow("image", image);
imshow("gray_image", gray_image);
waitKey(0);
return 0;
}
运行结果:
领取专属 10元无门槛券
私享最新 技术干货