灰度化图像

图像的灰度化

因为三通道图像相对来说处理比较麻烦,所以往往要转换成灰度图像,虽然OPENCV也有自带的函数,不过也需要掌握几种常见的灰度化的方法。

灰度化的核心本质

把三通道的图片转化成单通道。开始写的时候我把三个通道都改成同一个数字然后被老师批评了哈哈哈哈。

平均化灰度
Mat gray1(Mat &img) {
	Mat re = Mat(img.rows, img.cols, CV_8UC1, Scalar(0));
	for (int i = 0; i < img.rows; ++i) {
		for (int j = 0; j < img.cols; ++j) {
			int aver = (img.at<Vec3b>(i, j)[0] + img.at<Vec3b>(i, j)[1] + img.at<Vec3b>(i, j)[2]) / 3;
			re.at<uchar>(i, j) = aver;
		}
	}
	return re;
}

通过光栅扫描,对于每个像素点把三个通道的颜色加起来除以三就行。他这里把三个uchar加起来似乎就会自动提升到整数,很是神奇。

加权灰度化

Mat gray2(Mat &img) {
	Mat re = Mat(img.rows, img.cols, CV_8UC1, Scalar(0));
	for (int i = 0; i < img.rows; ++i) {
		for (int j = 0; j < img.cols; ++j) {
			int B = img.at<Vec3b>(i, j)[0];
			int G = img.at<Vec3b>(i, j)[1];
			int R = img.at<Vec3b>(i, j)[2];
			re.at<uchar>(i, j) = (int)(0.3 * R + 0.59 * G + 0.11 * B);
		}
	}
	return re;
}

这个就和上面的差不多,只是出现了权重,0.3 * R + 0.59 * G + 0.11 * B,加强了绿色弱化了蓝色。同样这里也有一个需要注意的地方,三通道存储像素点并不是RGB而是BGR,说是很多相机照片是这个格式,所以他就用了这样的形式。

然后还有最大值最小值之类的灰度化,就是三个值取最大值最小值就行。

上述代码的效果是输入一个三通道的图像,返回一个单通道的图像。三通道就是三张单通道的图片叠加出来的效果。需要说明的是,在三通道图像上如果三个通道数值是一样的,那么图像也是呈现灰色,但是这算不得灰度化图像。

你可能感兴趣的:(图像/音频算法)