OpenCV-学习历程4- 读取图像/读取像素/修改像素值方法(包含灰度+rgb图像像素处理方式)

OPENCV系列博客主要记录自己学习OPENCV的历程,以及存储已经实现的代码,以备后续回顾使用,代码中包含了主要的备注。

#include <opencv2/opencv.hpp>
#include <iostream>


using namespace std;
using namespace cv;

int main(int argc, char**argv) {
	//Step1 读取图片
	Mat src;
	src = imread("sample.jpg");
	if (src.empty()) {
		cout << "The image is empty,plz check the file route..." << endl;
		return -1;
	}
	namedWindow("Original_image", CV_WINDOW_AUTOSIZE);
	imshow("Original_image", src);

	//Step2 将图片转化为灰度图,读取像素灰度值,并遍历反转全部像素颜色
	//      注意:这一部分是对单通道进行操作
	Mat gray_src;
	cvtColor(src,gray_src,CV_BGR2GRAY);
	namedWindow("Gray_image", CV_WINDOW_AUTOSIZE);
	imshow("Gray_image", gray_src);

	int height = gray_src.rows;
	int width = gray_src.cols;

	for (int row = 0; row < height; row++) {
		for (int colomn = 0; colomn < width; colomn++) {
			int gray = gray_src.at<uchar>(row, colomn);  //!!重要,使用这个语句取出图像像素灰度
			gray_src.at<uchar>(row, colomn)=255 - gray;  //!!可以通过这个语句,修改每个像素的灰度值
		}
	}
	namedWindow("Gray_image_inverse", CV_WINDOW_AUTOSIZE);
	imshow("Gray_image_inverse", gray_src);



	//Step3 遍历图片,对RGB三通道彩色图片进行反转
	//      原理类似,注意遍历时候的数据类型
	Mat dst;
	dst.create(src.size(),src.type());
	height = src.rows;
	width = src.cols;
	int nc = src.channels();

	for (int row = 0; row < height; row++) {
		for (int colomn = 0; colomn < width; colomn++) {
			if (nc ==1 ) {
				int gray_2 = gray_src.at<uchar>(row, colomn);    //!!重要,使用这个语句取出图像像素灰度
				gray_src.at<uchar>(row, colomn) = 255 - gray_2;  //!!可以通过这个语句,修改每个像素的灰度值
			             }
			else if (nc == 3) {
				int b = src.at<Vec3b>(row, colomn)[0];     //!!重要:彩色图3个通道,每个行列对应的是一个数组,数组包含bgr三原色
				int g = src.at<Vec3b>(row, colomn)[1];
				int r = src.at<Vec3b>(row, colomn)[2];
				dst.at<Vec3b>(row, colomn)[0] = 255 - b;
				dst.at<Vec3b>(row, colomn)[1] = 255 - g;
				dst.at<Vec3b>(row, colomn)[2] = 255 - r;   //此处除了取反之外,可以设定其他数值,达到不同效果
			}
		}
	}



	//bitwise_not(src, dst);  //使用这个语句可以按位取反,得到与上边同样效果

	namedWindow("Color_image_inverse", CV_WINDOW_AUTOSIZE);
	imshow("Color_image_inverse", dst);

	waitKey();
	return 0;

}

 效果如下:

猜你喜欢

转载自blog.csdn.net/weixin_42503785/article/details/113913199