opencv实现滑动条控制图片的对比度和亮度变换

一般的图像处理算子都是一个函数,它接受一个或多个输入图像,并产生输出图像。


图像亮度和对比度的调整操作,其实属于图像处理变换中比较简单的一种——点操作。点操作有一个特点,仅仅根据输入像素值(有时可加上某些全局信息或参数),来计算相应的输出像素值。这类算子包括亮度(brightness)和对比度(contrast)调整,以及颜色校正(colorcorrection)和变换(transformations)。最简单的式子表示图像的对比度和亮度变换可表示如下:


参数:

1.f(x)表示原图像,既输入图像;g(x)表示变换输出的图像。

2.a可用来控制图像f(x)对比度。

3.b可用来控制图像f(x)亮度

实现以上操作需要设计图像像素点的访问,因此进一步改写该式子为:

             G(x )= a*F(i,j) + b;

图像像素点遍历算法如下:

//遍历像素点并执行g=a*f+b操作
	for (int y = 0;y < image.rows;y++) {
		for (int x = 0;x < image.cols;x++) {
			for (int c = 0;c < 3;c++) {
				new_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>
					((a*0.01)*(image.at<Vec3b>(y, x)[c]) + b);
			}
		}
	}
其中访问RGB图像顺序位GBR,(x,y,c)代表第x行,第y列,第c通道

整体代码如下:

#include"stdafx.h"
#include <opencv2/core/utility.hpp>
#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

void listPixel_Operate(int, void*);

// 定义全局变量
int a, b;
Mat image, new_image;

int main() {
	//读取图片
	image = imread("E:\\pictures\\For_Project\\New_opencv\\Sceen\\12.jpg");
	//创建新的和原图片一样大小的空白图片用于接收对比度和亮度变换
	new_image = Mat::zeros(image.size(), image.type());
	//变换系数初值
	a = 100;
	b = 100;

	namedWindow("【效果图窗口】", 1);
	//创建滑动条
	createTrackbar("对比度", "【效果图窗口】", &a, 300, listPixel_Operate);
	createTrackbar("亮 度", "【效果图窗口】", &b, 300, listPixel_Operate);
	//调用回调函数
	listPixel_Operate(a, 0);
	listPixel_Operate(b, 0);
	//等待键盘按键‘q’退出
	while (char(waitKey(1)) != 'q') {}
	return 0;
}

void listPixel_Operate(int,void*) {
	namedWindow("【原图窗口】", 1);

	//遍历像素点并执行g=a*f+b操作
	for (int y = 0;y < image.rows;y++) {
		for (int x = 0;x < image.cols;x++) {
			for (int c = 0;c < 3;c++) {
				new_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>
					((a*0.01)*(image.at<Vec3b>(y, x)[c]) + b);
			}
		}
	}

	imshow("【原图】", image);
	imshow("【效果图窗口】", new_image);
}
效果图:



  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用OpenCV和C来实现图片对比度亮度和伽马值调节,可以按照以下步骤进行: 1. 加载图片 使用OpenCV中的cvLoadImage函数来加载图片,例如: ```c IplImage* img = cvLoadImage("image.jpg", CV_LOAD_IMAGE_COLOR); ``` 2. 调整亮度 亮度可以通过修改图像中所有像素的像素值来实现。可以使用以下代码来增加或减少亮度: ```c int brightness = 50; // 亮度增加值 for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = *pixel + brightness; *pixel = (value > 255) ? 255 : (uchar)value; } } } ``` 3. 调整对比度 对比度可以通过修改图像中的像素值范围来实现。可以使用以下代码来增加或减少对比度: ```c float contrast = 1.5; // 对比度增加值 for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = (int)(*pixel - 128) * contrast + 128; *pixel = (value > 255) ? 255 : ((value < 0) ? 0 : (uchar)value); } } } ``` 4. 调整伽马值 伽马值可以通过将图像中的像素值进行幂运算来实现。可以使用以下代码来调整伽马值: ```c float gamma = 0.5; // 伽马值 for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = pow((float)(*pixel / 255.0), gamma) * 255; *pixel = (value > 255) ? 255 : ((value < 0) ? 0 : (uchar)value); } } } ``` 5. 保存图片 使用OpenCV中的cvSaveImage函数来保存修改后的图片,例如: ```c cvSaveImage("result.jpg", img); ``` 完整代码如下: ```c #include <cv.h> #include <highgui.h> #include <math.h> int main(int argc, char** argv) { IplImage* img = cvLoadImage("image.jpg", CV_LOAD_IMAGE_COLOR); // 调整亮度 int brightness = 50; for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = *pixel + brightness; *pixel = (value > 255) ? 255 : (uchar)value; } } } // 调整对比度 float contrast = 1.5; for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = (int)(*pixel - 128) * contrast + 128; *pixel = (value > 255) ? 255 : ((value < 0) ? 0 : (uchar)value); } } } // 调整伽马值 float gamma = 0.5; for (int i = 0; i < img->height; i++) { for (int j = 0; j < img->width; j++) { for (int k = 0; k < img->nChannels; k++) { uchar* pixel = &((uchar*)(img->imageData + img->widthStep*i))[j*img->nChannels + k]; int value = pow((float)(*pixel / 255.0), gamma) * 255; *pixel = (value > 255) ? 255 : ((value < 0) ? 0 : (uchar)value); } } } cvSaveImage("result.jpg", img); cvReleaseImage(&img); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值