C++ opencv 图像代数运算——对比度调整和背景相减

对比度调整

实验要求:

设计一个Sigmoid函数,实现对图像的对比度调整;

–使用opencv窗口系统的slider控件,交互改变Sigmoid函数的参数,实现不同程度的对比度调整;

 

对比度含义:

 

调整之后的 sigmoid函数:

实验思路:

我构建了 sigmoid函数,使用了三层for循环,一层遍历行,一层遍历列,还有一层遍历通道数(3通道),加入滑动条来传入对比度和亮度的参数,然后 在相应位置乘以了c_p(决定对比度),b_value(决定亮度),并使用了saturate_cast<uchar>函数来防止溢出。

 

 

效果图:

 

              

 

 

 

其中 sigmoid 函数的 参数可以自己调制

 

#include <opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include"opencv2/imgproc/imgproc.hpp"
#include<cmath>
#include <iostream>
using namespace std;
using namespace cv;


int c_p;
int b_value;
Mat image, mask;

void IntensityAndContrast(int, void *)
{
	namedWindow("原图", WINDOW_AUTOSIZE);
	for (int y = 0; y < image.rows; y++)
	{
		for (int x = 0; x < image.cols; x++)
		{
			for (int c = 0; c < 3; c++)
			{
				double u = ((image.at<Vec3b>(y, x)[c] - 127.0) / 255.00)*c_p*0.1;
				mask.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(image.at<Vec3b>(y, x)[c] * ((1.00 / (1.00 + exp(-u))) + 0.4) + b_value-100);

			}
		}
	}
	imshow("原图", image);
	imshow("效果图", mask);
}
int main()
{
	image = imread("G:\\图片\\longmao7.jpg");

	if (!image.data)
	{
		cout << "图片读取失败!" << endl;
		return false;
	}
	//cvtColor(image,image,CV_BGR2GRAY);
	namedWindow("效果图", WINDOW_AUTOSIZE);
	mask = Mat::zeros(image.size(), image.type());
	//cvtColor(mask, mask, CV_BGR2GRAY);

	c_p = 20;
	b_value =100;

	createTrackbar("Contrast", "效果图", &c_p, 100, IntensityAndContrast);
	createTrackbar("Intensity", "效果图", &b_value, 200, IntensityAndContrast);

	IntensityAndContrast(c_p, 0);
	IntensityAndContrast(b_value, 0);

	waitKey(0);
	return 0;

}

 

背景相减

 

对图像I和对应的背景图B,基于背景相减检测I中的前景区域,并输出前景的mask.

分析你的方法可能产生误检的情况,并上网查阅背景相减的改进方法,设法改进结果。

测试数据见群文件bgs-data.zip

思路:

一、首先必须判断图片是否存在,还要判断读取的两张图片图像I和对应的背景图B,长宽是否相同。

二、使用三重for循环,一重循环行,一重循环列,一重循环通道数(读取三通道),读取出来的像素,I(x,y)-B(x,y),进行区域相减,再进行平方求和,最后开根号,即下图的的公式显示:

三、选择一个阈值进行判断,如果 sum值大于阈值,则为需要提取的图像,像素则设为255(白色),如果sum小于阈值,像素值则设为0(黑色),最后再输出图像即可

背景图

         

效果图:

 

       

代码如下:

 

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<cmath>
#include<iostream>
using namespace std;
using namespace cv;

Mat a_img, b_img;
Mat mask;
int value;
void test(int, void*) {
	double su;
	for (int y = 0; y < a_img.rows; y++) {
		for (int x = 0; x < a_img.cols; x++) {
			su = 0.0;
			for (int c = 0; c < 3; c++) {
				// 求平方和
				su += pow((a_img.at<Vec3b>(y, x)[c] - b_img.at<Vec3b>(y, x)[c]), 2);

			}

			su = sqrt(su);

			//  01_bg.jpg 阈值为110   
			//	02_bg.jpg 阈值为90
			//  07_bg.jpg 阈值为100
			//  08_bg.jpg 阈值为 100
			//13_bg.jpg 阈值为120
			if (su >= value) {
				for (int c = 0; c < 3; c++) {
					mask.at<Vec3b>(y, x)[c] = 255;
				}
			}
			else {
				for (int c = 0; c < 3; c++) {
					mask.at<Vec3b>(y, x)[c] = 0;
				}
			}
		}
	}
	imshow("效果图", mask);
}


int main() {
	a_img = imread("F:\\计算机视觉\\实验三图片\\02.jpg");
	b_img = imread("F:\\计算机视觉\\实验三图片\\02_bg.jpg");
	namedWindow("效果图", WINDOW_AUTOSIZE);
	namedWindow("原图", WINDOW_AUTOSIZE);

	if (!a_img.data || !b_img.data) {
		cout << "读图失败" << endl;
		return -1;
	}
	if (a_img.rows != b_img.rows || a_img.cols != b_img.cols) {
		cout << "图片长度和宽度不符合" << endl;
		return -1;
	}
	value = 100;
	mask = Mat::zeros(a_img.size(), a_img.type());

	createTrackbar("背景相减", "效果图", &value, 200, test);
	test(value, 0);

	imshow("原图", a_img);
	imshow("背景图", b_img);
	waitKey(0);
	system("pause");
	return 0;
}

 

 

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C++中,可以使用OpenCV库来实现图像的亮度、对比度和伽马值调整。下面是一个简单的示例代码: ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; // 亮度和对比度调整函数 void adjustBrightnessContrast(Mat& image, double alpha, int beta) { // 遍历图像的每个像素 for (int y = 0; y < image.rows; y++) { for (int x = 0; x < image.cols; x++) { for (int c = 0; c < image.channels(); c++) { // 对每个通道的像素进行亮度和对比度调整 image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(alpha * image.at<Vec3b>(y, x)[c] + beta); } } } } // 伽马值调整函数 void adjustGamma(Mat& image, double gamma) { // 建立查找表 unsigned char lut[256]; for (int i = 0; i < 256; i++) { lut[i] = saturate_cast<uchar>(pow((double)i / 255.0, gamma) * 255.0); } // 应用查找表 image = image.clone(); LUT(image, Mat(1, 256, CV_8UC1, lut), image); } int main() { // 读取图像 Mat image = imread("input.jpg"); if (image.empty()) { std::cerr << "Failed to read image." << std::endl; return -1; } // 调整亮度和对比度 double alpha = 1.5; // 亮度调整参数 int beta = 30; // 对比度调整参数 adjustBrightnessContrast(image, alpha, beta); // 调整伽马值 double gamma = 1.5; // 伽马值调整参数 adjustGamma(image, gamma); // 显示结果图像 imshow("Adjusted Image", image); waitKey(0); return 0; } ``` 在这个示例代码中,我们首先定义了两个函数:`adjustBrightnessContrast`和`adjustGamma`,分别用于亮度和对比度、伽马值的调整。然后在`main`函数中,我们读取了一张图像,然后分别调用这两个函数进行图像处理。最后,将处理后的图像显示出来。 请确保在编译和运行代码之前,已经安装了OpenCV库,并将示例代码中的`input.jpg`替换为你自己的图像路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值