调整图像的对比度和亮度

知识点:

  • 访问像素值
  • 用零初始化矩阵
  • 了解cv :: saturate_cast的作用以及它有用的原因
  • 获取有关像素转换的一些很酷的信息
  • 在实际例子中提高图像的亮度

理论知识:

图像处理

  • 一般图像处理操作符是获取一个或多个输入图像并产生输出图像的功能。
  • 图像变换可以看作:
    点运算符(像素变换)
    邻域(基于区域)运营商

像素转换

  • 在这种图像处理变换中,每个输出像素的值仅取决于相应的输入像素值(加上,可能还有一些全局收集的信息或参数)。
  • 这种算子的例子包括亮度和对比度调整以及颜色校正和变换。

亮度和对比度调整

  • 两个常用的点过程是乘法和加法与常量:

                    G(X )= α ˚F(x )+ β
    
  • 参数和\ beta通常称为增益和偏差参数; 有时这些参数据说分别控制对比度和亮度。α > 0,β是增益变量

  • 您可以将视为源图像像素,将g(x)视为输出图像像素。然后,我们可以更方便地将表达式编写为:F(x )G(x )

                   G(i ,j )= α · f(i ,j )+ β
    

    其中和j表示像素位于第i行和第j列
    其中 α>0,β是增益变量

一些函数

 Mat new_image = Mat::zeros(image.size(),image.type());    
    cv :: Mat :: zeros返回一个基于image.size()和image.type()的Matlab样式的零初始值设定项
 image.convertTO(new_image,-1,alpha,beta);  
	其中cv::Mat::convertTo将有效地执行* new_image = a * image + beta *。下面的两种方法都给出相同的结果,但convertTo更优化,工作速度更快

例子:

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;

int main(int argc, char** argv) {

	Mat srcImage, dst;

	srcImage = imread("E:/image/6.jpg");

	if (srcImage.empty()) {
		printf("没有找到图片");
		return -1;
	}
	namedWindow("input image", WINDOW_AUTOSIZE);
	imshow("input image", srcImage);

	dst = Mat::zeros(srcImage.size(), srcImage.type());
	float alpha = 1.2;
	float beta = 30;
	int heigth = srcImage.rows;
	int width = srcImage.cols;
	int nc = srcImage.channels();

	for (int row = 0; row < heigth; row++) {
		for (int col = 0; col < width; col++) {
			if (nc == 1) {
				float v = srcImage.at<uchar>(row, col);    //获取像素值
				dst.at<uchar>(row, col) = saturate_cast<uchar>(alpha*v + beta);     //像素值取反赋值
			}
			else if (nc == 3) {
				float b = srcImage.at<Vec3b>(row, col)[0];
				float g = srcImage.at<Vec3b>(row, col)[1];
				float r = srcImage.at<Vec3b>(row, col)[2];

				
				dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha*b + beta);
				dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha*g + beta);
				dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha*r + beta);

			}
		}
	}

	namedWindow("调整图像亮度和对比度", WINDOW_AUTOSIZE);
	imshow("调整图像亮度和对比度", dst);
	waitKey(0);
	return 0;
}

效果图:效果图

  • 第二个例子:
#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;

int main(int argc, char** argv) {

	Mat srcImage, dst;

	srcImage = imread("E:/image/6.jpg");

	if (srcImage.empty()) {
		printf("没有找到图片");
		return -1;
	}
	namedWindow("input image", WINDOW_AUTOSIZE);
	imshow("input image", srcImage);

	dst = Mat::zeros(srcImage.size(), srcImage.type());
	float alpha = 1.2;
	float beta = 30;
	
	srcImage.convertTo(dst, -1, alpha, beta);
	
	namedWindow("调整图像亮度和对比度", WINDOW_AUTOSIZE);
	imshow("调整图像亮度和对比度", dst);
	waitKey(0);
	return 0;
}

效果图:效果图

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值