C++opencv进行图像处理(三)图像的基本操作

1.图像像素的加法

         主要包含了图像的像素加法,当像素增加,会使得图像变亮,当像素减少会使得图像变暗。除法操作会变暗,结果如下所示:

左边是原图,右边是像素相加后的。

在前面的代码模块中增加的代码为:


void QuickDemo::pixel_operators_demo(Mat &image){
	Mat dst;
	dst = image + Scalar(50, 50, 50);
	imshow("像素加法操作", dst);
}

2.滚动条操作调整图像的亮度

通过滚动进度条调节图像的亮度,代码如下所示:

Mat src,dst, m;
int lightness = 50;
static void on_track(int, void*) {
	m = Scalar(lightness, lightness, lightness);
	add(src, m, dst);
	imshow("亮度调整",dst);
}
void QuickDemo::tracking_bar_demo(Mat &image) {
	//创建一个窗口进行亮度调节
	namedWindow("亮度调节", WINDOW_AUTOSIZE);
	dst = Mat::zeros(image.size(), image.type());
	m = Mat::zeros(image.size(), image.type());
	int max_value = 100;

	//在窗口上创建createTrackbar函数
	createTrackbar("Value Bar:", "亮度调节", &lightness, max_value, on_track);
	on_track(50, 0);
}

3.生成矩形

void QuickDemo::bitwise_demo(Mat& image) {
	Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);
	Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);
	//对于m1图像画矩形,左上角的坐标是(100,100),矩形的大小是(80*80),矩形的颜色scalar是(255,255,0)
	//thickness参数大于0表示绘制矩形,小于0表示填充矩形
	rectangle(m1, Rect(100, 100, 80, 80), Scalar(255,255,0),-1, LINE_8, 0);
	rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);
	imshow("m1", m1);
	imshow("m2", m2);
}

结果如下所示:

C++opencv进行图像处理(三)图像的基本操作_第1张图片

4.通道分离

//主要完成通道分离与通道合并
void QuickDemo::channels_demo(Mat &image) {
	//由于有多个通道,所以用集合容器,把多个通道放进容器
	std::vector mv;
	split(image, mv);
	imshow("蓝色", mv[0]);
	imshow("绿色", mv[1]);
	imshow("红色", mv[2]);

}

上图分别是原图,蓝绿红。有的人说这不都是灰色图吗?其实不然。如果我们要是想彰显每个通道的颜色,只需要把其他通道设置为0,那么只剩下你想要彰显的通道颜色,如下所示,可以把函数增加如下几行代码:

void QuickDemo::channels_demo(Mat &image) {
	//由于有多个通道,所以用集合容器,把多个通道放进容器
	std::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);
}

C++opencv进行图像处理(三)图像的基本操作_第2张图片

其他通道的就不再赘述。

5.颜色空间转换

void QuickDemo::inrange_demo(Mat& image) {
	Mat hsv;
	cvtColor(image, hsv, COLOR_BGR2HSV);
	Mat mask;
	//inRange()函数OpenCV中的inRange()函数可实现二值化功能,更关键的是可以同时针对多通道进行操作,使用起来非常方便!
	//主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作。
	//第一个Scalar是绿色hsv三个参数的最小值,第二个是最大值,可以把背景为绿色的去掉,转化为二值化图像
	inRange(hsv, Scalar(35,43,46), Scalar(77,255,255), mask);
	imshow("mask", mask);
}

           C++opencv进行图像处理(三)图像的基本操作_第3张图片

6.图像像素值的统计计算均值和方差

          (1) 对于灰度图单通道的图像可以如下这么做进行统计,但是对于彩色图不行。

void QuickDemo::pixel_statistic_demo(Mat& image) {
	double minv, maxv;
	Point minLoc, maxLoc;
	minMaxLoc(image, &minv, &maxv, &minLoc, &maxLoc, Mat());
	std::cout << "min value:" << minv << "max value:" << maxv << std::endl;
	//求取均值和方差
	Mat mean, stddev;
	meanStdDev(image, mean, stddev);
	std::cout << "means:" << mean << "stddev:" << stddev << std::endl;
}

        (2)对于彩色图三通道做法如下:需要分别统计每一个通道的像素均值和方差,代码如下:

void QuickDemo::pixel_statistic_demo(Mat& image) {
	double minv, maxv;
	Point minLoc, maxLoc;
	std::vector mv;
	split(image, mv);
	for (int i = 0; i < mv.size(); i++) {
		minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());
		std::cout << "min value:" << minv << "max value:" << maxv << std::endl;
	}
	//求取均值和方差
	Mat mean, stddev;
	meanStdDev(image, mean, stddev);
	std::cout << "means:" << mean << "stddev:" << stddev << std::endl;
}

结果如下所示:

C++opencv进行图像处理(三)图像的基本操作_第4张图片

7.在图像上画矩形框

void QuickDemo::drawing_demo(Mat& image) {
	Rect rect;
	rect.x = 200;
	rect.y = 200;
	rect.width = 100;
	rect.height = 100;
	rectangle(image, rect, Scalar(0, 0, 255),2, 8, 0);
	imshow("绘制演示", image);
}

你可能感兴趣的:(c++opencv图像处理,计算机视觉-图像处理,opencv,计算机视觉,c++)