原理讲解
输入的图像为I,宽为W,高为H,输出图像记为O,图像的线性变换可以利用以下公式定义:
当a=1,b=0时,O为I的一个副本;
如果a>1则输出图像O的对比度比I有所增大;
如果0<a<1,则O的对比度比I有所减小;
而b值的改变,影响的是输出的亮度,当b>0时,亮度增加;当b<0时,亮度减小。
举例:假设图像的灰度级范围是[50,100],通过a=2,b=0的线性变换,可以将输出图像的灰度级拉伸到[100,200],灰度级范围有所增加, 从而提高了对比度;而如果令a=0.5,b=0,则输出图像的灰度级会压缩到[25,50],灰度级范围有所减小,则降低了对比度。
实现方式
在OpenCV中实现一个常数与矩阵相乘有多种方式。
第一种方式:通过Mat的成员函数
Mat::convertTo(OutputArray m, int rtype,double alpha=1,double beta=0)
实现线性变换,该函数参数之间的关系如下:
m(x,y)=saturate_cast<rtype>(alpha(*this)(x,y)+beta)
其中参数m代表输出矩阵,参数rtype是输出矩阵m的数据类型,参数alpha和beta分别可以理解为线性变换中的a和b.利用该函数实现线性变换的示例代码如下:
Mat I = (Mat_<uchar>(2,2)<<0,200,23,4);
Mat O;
I.convertTo(0,CV_8UC1,2.0,0);
其中输入的I的数据类型为uchar,打印输出O的值,结果为:[[0,255],[46,