1. C/C++

OpenCV-第五话-图像操作

一.单通道灰度图像处理

/*
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通道设置为0

2.取三个通道中的最大值作为单通道图像的值可以将BGR图像转为亮度较大的GRAY图像;相反如果去三个通道中最小的值的话,得到的就是亮度较暗的GRAY图像。

Amazing!