一.单通道灰度图像处理
/*
OpenCV 图像操作学习
Michael Jiang<sencom1997@outlook.com>
2019年7月24日09:42:25
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
	//读取图像
	Mat src = imread("D:/go.png", IMREAD_COLOR);
	
	//创建窗口
	namedWindow("src win", WINDOW_AUTOSIZE);
	namedWindow("gray win", WINDOW_AUTOSIZE);
	namedWindow("reverse win", WINDOW_AUTOSIZE);
	//显示原始图像
	imshow("src win", src);
	
	//BGR转gray
	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);
	//显示gray图像
	imshow("gray win", gray);
	//gray图像位操作取反
	Mat reverse = Mat(gray.size(),gray.type());
	int higth = gray.rows;
	int width = gray.cols;
	for (int i = 0; i < higth; i++)
	{
		for (int j = 0; j < width; j++)
		{
			reverse.at<uchar>(i,j) = 255 - gray.at<uchar>(i,j);
		}
	}
	//显示反转灰度图像
	imshow("reverse win", reverse);
	waitKey(0);
	return 0;
}二.三通道BGR图像处理
/*
OpenCV 图像操作学习
Michael Jiang<sencom1997@outlook.com>
2019年7月24日09:42:25
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
	//读取图像
	Mat src = imread("D:/go.png", IMREAD_COLOR);
	
	//创建窗口
	namedWindow("src win", WINDOW_AUTOSIZE);
	//namedWindow("gray win", WINDOW_AUTOSIZE);
	namedWindow("reverse win", WINDOW_AUTOSIZE);
	//显示原始图像
	imshow("src win", src);
	
	//BGR图像反转
	Mat reverse = Mat(src.size(), src.type());
	int higth = src.rows;
	int width = src.cols;
	for (int i = 0; i < higth; i++)
	{
		for (int j = 0; j < width; j++)
		{
			reverse.at<Vec3b>(i, j)[0] = 255 - src.at<Vec3b>(i, j)[0];
			reverse.at<Vec3b>(i, j)[1] = 255 - src.at<Vec3b>(i, j)[1];
			reverse.at<Vec3b>(i, j)[2] = 255 - src.at<Vec3b>(i, j)[2];
		}
	}
	//显示反转灰度图像
	imshow("reverse win", reverse);
	/*
	//BGR转gray
	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);
	//显示gray图像
	imshow("gray win", gray);
	//gray图像位操作取反
	Mat reverse = Mat(gray.size(),gray.type());
	int higth = gray.rows;
	int width = gray.cols;
	for (int i = 0; i < higth; i++)
	{
		for (int j = 0; j < width; j++)
		{
			reverse.at<uchar>(i,j) = 255 - gray.at<uchar>(i,j);
		}
	}
	//显示反转灰度图像
	imshow("reverse win", reverse);
	*/
	waitKey(0);
	return 0;
}
三.小记
1.在三通道转换时可以设置某一通道或者某两个通道的值为0,可以出现一些意想不到的特效
reverse.at<Vec3b>(i, j)[2] = 0;//将RED通道设置为02.取三个通道中的最大值作为单通道图像的值可以将BGR图像转为亮度较大的GRAY图像;相反如果去三个通道中最小的值的话,得到的就是亮度较暗的GRAY图像。
Amazing!
