OpenCV::Mat 修改特定位置像素的值

这个功能在实际工程开发很重要很必要,废话不多说,上代码。

#include<opencv2\opencv.hpp>
int main() 
{
	cv::Mat img = cv::imread("Lena.jpg");
	cv::Mat img_backup = img.clone();
	//如果是单通道,转为三通道
	if (1 == img.channels())
		cv::cvtColor(img, img, cv::COLOR_GRAY2BGR);

	/**
	核心:
	*	*(img.data + img.step[0] * i + img.step[1] * j + img.elemSize1() * c)=new_val
	*	这行代码是解析出来image的第i行第j列(即坐标为[j,i])第c通道,然后就可以对它进行赋值了。
	*/
	for (int i = 0; i < img.rows; ++i)
		for (int j = 0; j < img.cols; ++j)
		{
			//对第0个通道进行赋值操作,也就是blue通道
			*(img.data + img.step[0] * i + img.step[1] * j + img.elemSize1() * 0) = 255;

			//对第2个通道进行赋值操作,也就是green通道
			*(img.data + img.step[0] * i + img.step[1] * j + img.elemSize1() * 1) = 0;

			//对第3个通道进行赋值操作,也就是red通道
			*(img.data + img.step[0] * i + img.step[1] * j + img.elemSize1() * 2) = 0;
		}

	cv::imshow("img_src", img_backup);
	cv::imshow("img_rst", img);
	cv::waitKey();
}

运行结果图如下:

因为把所有的第1,2通道值设为0,第0通道值设为255,所以整张图像呈现为蓝色。

猜你喜欢

转载自blog.csdn.net/csdn_zhishui/article/details/83039207