OpenCV--图像的反色与灰度图显示

本文详细介绍了如何使用OpenCV进行图像反色处理,包括单通道和三通道图像,并提供了具体的代码示例。同时,展示了如何手动实现灰度图像的显示,而不依赖于cvtColor函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本博客转载自https://blog.csdn.net/qq_25343557/article/details/78657561?locationNum=5&fps=1

对于单通道图像:

void Invert1(){
    Mat src,dest;
    src = imread("lena.jpg");
    if(!src.data){
        cout << "Loading image failed!" << endl;
        return ;
    }
    namedWindow("Original Image",CV_WINDOW_AUTOSIZE);
    imshow("Original Image",src);

    cvtColor(src,dest,COLOR_BGR2GRAY);

    int rows = src.rows;
    int cols = src.cols;

    //单通道图像的反色
    for(int row = 0;row<rows;row++){
        for(int col = 0;col<cols;col++){
            dest.at<uchar>(row,col) = 255 - dest.at<uchar>(row,col);
        }
    }
    namedWindow("Single channel",CV_WINDOW_AUTOSIZE);
    imshow("Single channel",dest);

    cvWaitKey();
}

在这里插入图片描述

对于三通道而言:

void Invert2(){
	Mat src;
	src = imread("D:\\111.jpg");
	if (!src.data){
		cout << "Loading image failed!" << endl;
		return;
	}
	namedWindow("Original image", CV_WINDOW_AUTOSIZE);
	imshow("Original image", src);
	int rows = src.rows;
	int cols = src.cols;
	cout << rows << "\t" << cols << endl;
	Mat dest;
	dest.create(src.size(), src.type());

	for (int row = 0; row<rows; row++){
		for (int col = 0; col<cols; col++){
			int b = src.at<Vec3b>(row, col)[0];
			int g = src.at<Vec3b>(row, col)[1];
			int r = src.at<Vec3b>(row, col)[2];

			dest.at<Vec3b>(row, col)[0] = 255 - b;
			dest.at<Vec3b>(row, col)[1] = 255 - g;
			dest.at<Vec3b>(row, col)[2] = 255 - r;

		}
	}

	namedWindow("Three channels", CV_WINDOW_AUTOSIZE);
	imshow("Three channels", dest);
	cvWaitKey();
}

在这里插入图片描述

OpenCV提供的函数bitwise_not(src,dest):

void Invert3(){
	Mat src, dest;
	src = imread("D:\\111.jpg");
	if (!src.data){
		cout << "Loading image failed!" << endl;
		return;
	}
	namedWindow("Original image", CV_WINDOW_AUTOSIZE);
	imshow("Original image", src);

	cv::bitwise_not(src, dest);

	namedWindow("Inverted color", CV_WINDOW_AUTOSIZE);
	imshow("Inverted color", dest);
	cvWaitKey();
}

在这里插入图片描述

不同于使用cvtColor()函数,我们可以自己对像素操作实现灰度图的显示:


void GrayShow(){
	Mat src;
	src = imread("D:\\111.jpg");
	if (!src.data){
		cout << "Loading image failed!" << endl;
		return;
	}
	namedWindow("Original image", CV_WINDOW_AUTOSIZE);
	imshow("Original image", src);
	int rows = src.rows;
	int cols = src.cols;

	Mat dest = Mat(src.rows, src.cols, 0);
	for (int row = 0; row<rows; row++){
		for (int col = 0; col<cols; col++){
			int b = src.at<Vec3b>(row, col)[0];
			int g = src.at<Vec3b>(row, col)[1];
			int r = src.at<Vec3b>(row, col)[2];

			dest.at<uchar>(row, col) = max(r, max(g, b));//choose the greatest value among bgr
			//dest.at<uchar>(row,col) = min(r,min(g,b));//choose the smallest value among bgr
		}
	}

	namedWindow("min, Gray scale image", CV_WINDOW_AUTOSIZE);
	imshow("min, Gray scale image", dest);
	cvWaitKey();
}

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值