OpenCV 学习笔记(4)OpenCV遍历彩色图像、灰度图像的像素值方法

https://blog.csdn.net/mooneve/article/details/53001677

应用:将彩色图像转为灰度图像输出

方法一 使用ptr函数和指针 (高效)

void main()
{
	//读入彩色图像
	Mat img = imread("fruits.jpg");
	imshow("原图", img);
	int rows = img.rows;
	int cols = img.cols;
	//生成和img同样大小的空白灰度图像
	Mat grayImg = Mat(rows, cols, CV_8U);
	for (int i = 0; i < rows; i++)
	{
		//获取图像每一行的首地址
		Vec3b *p = img.ptr<Vec3b>(i);//彩色图                      //p指向地址
		uchar *p2 = grayImg.ptr<uchar>(i);//灰度图                 //*p指向内容
		for (int j = 0; j < cols; j++)
		{
			//每次迭代获取图像列的地址
			Vec3b &pix = *p++;//彩色图                             //pix指向内容
			uchar &pix2 = *p2++;//灰度图                           //&pix指向地址
			pix2 = pix[0] * 0.114 + pix[1] * 0.587 + pix[2] * 0.299;
		}
	}
	imshow("灰度图", grayImg);
	waitKey(0);
}

  

方法二 使用at<Vec3b>(i, j) 和at<uchar>(i, j)

void main()
{
	//读入彩色图像
	Mat img = imread("fruits.jpg");
	imshow("原图", img);
	int rows = img.rows;
	int cols = img.cols;
	//生成和img同样大小的空白灰度图像
	Mat grayImg = Mat(rows, cols, CV_8U);
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; j++)
		{
			//彩色图像获取到单个像素
			Vec3b pix = img.at<Vec3b>(i,j);
			//获取到RGB分量的值。
			uchar B = pix[0];
			uchar G = pix[1];
			uchar R = pix[2];
			//或者使用下面的方法
			//uchar B = img.at<Vec3b>(i, j)[0];
			//uchar G = img.at<Vec3b>(i, j)[1];
			//uchar G = img.at<Vec3b>(i, j)[2];
			//计算灰度值,然后赋值给灰度图中的像素
			grayImg.at<uchar>(i,j) = R * 0.299 + G * 0.587 + B * 0.114;//灰度著名心理学公式
		}
	}
	imshow("灰度图", grayImg);
	waitKey(0);
}

  

原文地址:https://www.cnblogs.com/kekeoutlook/p/10533730.html