OpenCV对图像的操作(2)

目录

官方在线帮助文档:OpenCV: OpenCV modules

用OpenCV对图像做一些简单的操作

1. 亮度调整与对比度调整

2. 键盘响应操作

3. 自带颜色操作

4. 图像像素的逻辑操作

5. 通道分离与合并

6. 图像色彩空间转换

7. 图像像素值统计

8. 图像几何形状绘制


官方在线帮助文档:OpenCV: OpenCV modules

用OpenCV对图像做一些简单的操作

1. 亮度调整与对比度调整

	#include
	#include
	
	using namespace cv;
	using namespace std;
	
	
	class demo
	{
	public:
	
		static void on_lightness(int b, void* userdata) {
			Mat image = *((Mat*)userdata);
			Mat dst = Mat::zeros(image.size(), image.type());
			Mat m = Mat::zeros(image.size(), image.type());
			addWeighted(image, 1.0, m, 0, b, dst);
			imshow("亮度与对比度调整", dst);
		}
		static void on_contrast(int b, void* userdata) {
			Mat image = *((Mat*)userdata);
			Mat dst = Mat::zeros(image.size(), image.type());
			Mat m = Mat::zeros(image.size(), image.type());
			double contrast = b / 100.0;
			addWeighted(image, contrast, m, 0.0, 0, dst);
			imshow("亮度与对比度调整", dst);
		}
		void tracking_bar_demo(Mat &image)
		{
			namedWindow("亮度与对比度调整", WINDOW_AUTOSIZE);
			int max_value = 100;
			int lightness = 50;
			int contract_value = 100;
			createTrackbar("Value Bar:", "亮度与对比度调整", &lightness, max_value, on_lightness,(void*)(&image));
			createTrackbar("Contrast Bar:", "亮度与对比度调整", &contract_value, 200, on_contrast, (void*)(&image));
			on_lightness(50, &image);
		}
	};
	int main(int argc, char** argv)
	{
		Mat src = imread("jennie.jpg",IMREAD_UNCHANGED);
		// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
		// namedWindow("输出窗口", WINDOW_FREERATIO);
		// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
		if (src.empty()) {
			cout << "没有找到你的图片" << endl;
			return -1;
		}
	
		imshow("输出窗口", src);
	
		demo d;
		d.tracking_bar_demo(src); 
		waitKey(0);// 设置图片显示时间
		destroyAllWindows();// 释放所有窗口
		return 0;
	}

2. 键盘响应操作

	#include
	#include
	
	using namespace cv;
	using namespace std;
	
	
	class demo
	{
	public:
		void key_demo(Mat& image)
		{
			Mat dst = Mat::zeros(image.size(), image.type());
			while (true) {
				int c = waitKey(100);
				if (c == 27) {// 退出
					break;
				}
				if (c == 49) {// Key #1
					cout << "你按了1:要进行转换灰度的操作"<< endl;
					cvtColor(image, dst, COLOR_BGR2GRAY);
				}
				if (c == 50) {// Key  #2
					cout << "你按了2:要进行转换HSV的操作" << endl;
					cvtColor(image, dst, COLOR_BGR2HSV);
				}
				if (c == 51) {// Key  #3
					cout << "你按了3:要进行亮度的调节" << endl;
					dst = Scalar(50, 50, 50);
					add(image, dst, dst);
				}
				imshow("键盘响应", dst);
			}
		}
	};
	int main(int argc, char** argv)
	{
		Mat src = imread("jennie.jpg",IMREAD_UNCHANGED);
		// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
		// namedWindow("输出窗口", WINDOW_FREERATIO);
		// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
		if (src.empty()) {
			cout << "没有找到你的图片" << endl;
			return -1;
		}
	
		imshow("输出窗口", src);
	
		demo d;
		d.key_demo(src); 
		waitKey(0);// 设置图片显示时间
		destroyAllWindows();// 释放所有窗口
		return 0;
	}

3. 自带颜色操作

Look Up Table 查找表

  • applyColorMap(src,dst,COLORMAP)
  • src  表示输入图像
  • dst  表示输出图像
  • 匹配到的颜色LUT,OPENCV支持13中颜色风格的查找表映射
	#include
	#include
	
	using namespace cv;
	using namespace std;
	
	
	class demo
	{
	public:
		void color_style_demo(Mat &image)
		{
			int colormap[] = {
				COLORMAP_AUTUMN,
				COLORMAP_BONE,
				COLORMAP_JET,
				COLORMAP_WINTER,
				COLORMAP_RAINBOW,
				COLORMAP_OCEAN,
				COLORMAP_SUMMER,
				COLORMAP_SPRING,
				COLORMAP_COOL,
				COLORMAP_PINK,
				COLORMAP_HOT,
				COLORMAP_PARULA,
				COLORMAP_MAGMA,
				COLORMAP_INFERNO,
				COLORMAP_PLASMA,
				COLORMAP_VIRIDIS,
				COLORMAP_CIVIDIS,
				COLORMAP_TWILIGHT,
				COLORMAP_TWILIGHT_SHIFTED
			};
			Mat dst;
			int index = 0;
			while (true) {
				int c = waitKey(1000);
				if (c == 27) {// 退出
					break;
				}
				applyColorMap(image, dst, colormap[index%19]);
				index++;
				imshow("颜色风格", dst);
			}
		}
	};
	int main(int argc, char** argv)
	{
		Mat src = imread("jennie.jpg",IMREAD_UNCHANGED);
		// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
		// namedWindow("输出窗口", WINDOW_FREERATIO);
		// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
		if (src.empty()) {
			cout << "没有找到你的图片" << endl;
			return -1;
		}
	
		imshow("输出窗口", src);
	
		demo d;
		d.color_style_demo(src); 
		waitKey(0);// 设置图片显示时间
		destroyAllWindows();// 释放所有窗口
		return 0;
	}

4. 图像像素的逻辑操作

	#include
	#include
	
	using namespace cv;
	using namespace std;
	
	
	class demo
	{
	public:
		void bitwise_demo(Mat& image)
		{
			Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);
			Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);
			rectangle(m1, Rect(100, 100, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);
			// -1 是填充,2是描边
			rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);
			imshow("m1", m1);
			imshow("m2", m2);
			Mat dst;
			bitwise_and(m1, m2, dst);
			imshow("像素与操作", dst);
			bitwise_or(m1, m2, dst);
			imshow("像素或操作", dst);
			bitwise_not(image, dst);
			// Mat dst = ~image;//取反
			imshow("取反", dst);
			bitwise_xor(m1, m2, dst);
			imshow("异或", dst);
	
		}
	};
	int main(int argc, char** argv)
	{
		Mat src = imread("jennie.jpg",IMREAD_UNCHANGED);
		// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
		// namedWindow("输出窗口", WINDOW_FREERATIO);
		// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
		if (src.empty()) {
			cout << "没有找到你的图片" << endl;
			return -1;
		}
	
		imshow("输出窗口", src);
	
		demo d;
		d.bitwise_demo(src); 
		waitKey(0);// 设置图片显示时间
		destroyAllWindows();// 释放所有窗口
		return 0;
	}

5. 通道分离与合并

	#include
	#include
	#include
	
	using namespace cv;
	using namespace std;
	
	
	class demo
	{
	public:
		void channels_demo(Mat& image)
		{
			// 通道分离
			vector mv;
			split(image, mv);
			imshow("蓝色", mv[0]);
			imshow("绿色", mv[1]);
			imshow("红色", mv[2]);
	
			Mat dst;
			mv[1] = 0;
			mv[2] = 0;
			merge(mv, dst);
			imshow("蓝色", dst);
			// 同理修改其他两种通道后彰显一种通道的颜色
			// 也可以只让其中一个通道的值为0
	
			// 通道的合并
			int from_to[] = { 0,2,1,1,2 };
			mixChannels(&image, 1, &dst, 1, from_to, 3);
			imshow("通道混合", dst);
		}
	};
	int main(int argc, char** argv)
	{
		Mat src = imread("jennie.jpg",IMREAD_UNCHANGED);
		// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
		// namedWindow("输出窗口", WINDOW_FREERATIO);
		// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
		if (src.empty()) {
			cout << "没有找到你的图片" << endl;
			return -1;
		}
	
		imshow("输出窗口", src);
	
		demo d;
		d.channels_demo(src); 
		waitKey(0);// 设置图片显示时间
		destroyAllWindows();// 释放所有窗口
		return 0;
	}

6. 图像色彩空间转换

  • RGB色彩空间
  • HSV色彩空间
  • YUV色彩空间
  • YCrCb色彩空间

API知识点

  • 色彩空间转换cvtColor
  • 提取指定色彩范围区域inRange
	#include
	#include
	#include
	
	using namespace cv;
	using namespace std;
	
	
	class demo
	{
	public:
		void inrange_demo(Mat& image)
		{
			Mat hsv;
			cvtColor(image, hsv, COLOR_BGR2HSV);
			Mat mask;
			inRange(hsv, Scalar(0, 43, 46), Scalar(180, 255, 255), mask);
			imshow("mask", mask);
	
			Mat redback = Mat::zeros(Size(), image.type());
			redback = Scalar(40, 40, 200);
			bitwise_not(mask, mask);
			imshow("mask", mask);
			image.copyTo(redback, mask);
			imshow("roi区域提取", redback);
		}
	};
	int main(int argc, char** argv)
	{
		Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
		// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
		// namedWindow("输出窗口", WINDOW_FREERATIO);
		// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
		if (src.empty()) {
			cout << "没有找到你的图片" << endl;
			return -1;
		}
	
		imshow("输出窗口", src);
	
		demo d;
		d.inrange_demo(src); 
		waitKey(0);// 设置图片显示时间
		destroyAllWindows();// 释放所有窗口
		return 0;
	}

7. 图像像素值统计

知识点:像素值统计

  • 最小(min)
  • 最大(max)
  • 均值(mean)
  • 标准方差(standard deviation)

API知识点

  • 最大最小值minMaxLoc
  • 计算均值与标准方差meanStdDev
	#include
	#include
	#include
	
	using namespace cv;
	using namespace std;
	
	
	class demo
	{
	public:
		void pixel_statistic_demo(Mat& image)
		{
			double minv, maxv;
			Point minLoc, maxLoc;
			vector mv;
			split(image, mv);
			for (int i = 0; i < mv.size(); i++)
			{
				minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());
				cout << "No.channels:" << i << "min value:" << minv << "max value:" << maxv << endl;
			}		
			Mat mean, stddev;
			meanStdDev(image, mean, stddev);
			cout << "means:" << mean << endl;
			cout<<"stddev:" << stddev << endl;
		}
	};
	int main(int argc, char** argv)
	{
		Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
		// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
		// namedWindow("输出窗口", WINDOW_FREERATIO);
		// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
		if (src.empty()) {
			cout << "没有找到你的图片" << endl;
			return -1;
		}
	
		imshow("输出窗口", src);
	
		demo d;
		d.pixel_statistic_demo(src); 
		waitKey(0);// 设置图片显示时间
		destroyAllWindows();// 释放所有窗口
		return 0;
	}

8. 图像几何形状绘制

	#include
	#include
	#include
	
	using namespace cv;
	using namespace std;
	
	
	class demo
	{
	public:
		void drawing_demo(Mat& image)
		{
			Rect rect;
			rect.x = 300;
			rect.y = 200;
			rect.width = 100;
			rect.height = 100;
			rectangle(image, rect, Scalar(0, 0, 255), 2, 8, 0);
			// 2,绘制.  -1,填充
			circle(image, Point(150, 250), 50, Scalar(255, 0, 0), 2, 8, 0);
			line(image, Point(300, 200), Point(400, 300), 2, LINE_AA, 0);
			// LINE_AA 边缘融合
			RotatedRect rrt;
			rrt.center = Point(150, 150);
			rrt.size = Size(100, 200);
			rrt.angle = 90.0;
			ellipse(image, rrt, Scalar(0, 255, 255), 2, 8);
			imshow("图像演示", image);
		}
	};
	int main(int argc, char** argv)
	{
		Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
		// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
		// namedWindow("输出窗口", WINDOW_FREERATIO);
		// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
		if (src.empty()) {
			cout << "没有找到你的图片" << endl;
			return -1;
		}
	
		imshow("输出窗口", src);
	
		demo d;
		d.drawing_demo(src); 
		waitKey(0);// 设置图片显示时间
		destroyAllWindows();// 释放所有窗口
		return 0;
	}

这部分的内容是非常有趣的,但是我的建议是在学习这部分内容时,不仅要敲代码,更要结合官方的API文档辅助学习。

同时,关于文章内容有什么问题希望大家可以给予反馈,如果觉得还不错,可以点个关注。

谢谢大家,希望大家在快乐的编程中进步。

你可能感兴趣的:(OpenCV,opencv,计算机视觉,python,c++,人工智能)