OpenCV之改变图像的对比度和亮度

图像处理

  • 一般来说,图像处理算子是带有一幅或多幅输入图像、产生一幅输出图像的函数。
  • 图像变换可分为以下两种:
    • 点算子(像素变换)
    • 邻域(基于区域的)算子

像素变换

  • 在这一类图像处理变换中,仅仅根据输入像素值(有时可加上某些全局信息或参数)计算相应的输出像素值。
  • 这类算子包括 亮度和对比度调整 ,以及颜色校正和变换。

亮度和对比度调整

  • 两种常用的点过程(即点算子),是用常数对点进行 乘法加法 运算:
                                                          

  • 两个参数 一般称作 增益偏置 参数。我们往往用这两个参数来分别控制 对比度亮度
  • 你可以把f(x)看成源图像像素,把g(x)看成输出图像像素。这样一来,上面的式子就能写得更清楚些:

其中,i和j表示像素位于 第i行第j列


示例代码

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main()
{
	Mat src,dst;
	double alpha =2;
	double beta = 50;

	src = imread("fruits.jpg");
	if(!src.data)
	{
		cout<<"Failed to load image!"<<endl;
		return -1;
	}

	namedWindow("Orignal Image");
	imshow("Orignal Image",src);

	dst = Mat::zeros(src.size(),src.type());
	for (int i = 0;i<src.rows;++i)
		for(int j= 0;j<src.cols;++j)
			for(int k = 0;k<3;++k)
				dst.at<Vec3b>(i,j)[k] = saturate_cast<uchar>(src.at<Vec3b>(i,j)[k]*alpha+beta);

	namedWindow("Handled Image");
	imshow("Handled Image",dst);
	waitKey();
	return 0;
}

Mat::zeros初始化零矩阵

C++: staticMatExpr Mat::zeros(int rows, intcols, inttype)

C++: staticMatExpr Mat::zeros(Size size, inttype)

C++: staticMatExpr Mat::zeros(int ndims, const int*sz, inttype)

 

Parameters:

  • ndims –维度.
  • rows – 行数.
  • cols – 列数.
  • size –大小.
  • sz –  指定数组形状的整数数组
  • type – 创造矩阵的类型.

 

该方法返回一个 Matlab 式的零数组初始值设定项。它可以用于快速形成一个常数数组作为函数参数,作为矩阵的表达式或矩阵初始值设定项的一部分。

e.g

Mat A;

A = Mat::zeros(3, 3, CV_32F);

上面的示例中,只要A不是3X3的浮点型矩阵,就会重新分配内存;否则现有矩阵填充为0。


类型转换模板saturate_cast

C++: template<...> _Tp saturate_cast(_Tp2 v)

 

V --- 输入参数

功能:用于把输入类型精确转换为另一个类型

该函数把C++中原有的cast函数进行组合,具有溢出保护功能,大概类似于以下代码:

  if(data<0)  

          data=0;  

  else if(data>255)  

      data=255; 

e.g.

uchar a = saturate_cast<uchar>(-100);// a = 0 (UCHAR_MIN)

short b = saturate_cast<short>(33333.33333);// b = 32767 (SHRT_MAX)

当目标类型为unsigned char , signed char , unsigned short or signedshort时进行溢出保护,对32-bit integers没有保护


实验结果




  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值