关于图像线性变换技术———灰度线性变换。g(x,y)=a*f(x,y)+b
|a|<0:图像变换对比度较少,|b|>0:图像的亮度增加;|b|<0:图像的亮度减少。相反的就不说了。
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
// 图像线性变换
Mat linearTransform(Mat srcImage, float a, int b)
{
if (srcImage.empty()) //判断是否为空
{
cout << "No data" << endl;
}
const int nRows = srcImage.rows;
const int nCols = srcImage.cols;
Mat resultImage = Mat::zeros(srcImage.size(), srcImage.type()); //生成一个和srcImage相同的零矩阵
//图像元素遍历,进行元素上的线性操作
for (int i = 0; i < nRows; i++)
{
for (int j = 0; j < nCols; j++)
{
for (int c = 0; c < 3; c++)
{
//图像检查,防止下标过界
resultImage.at<Vec3b>(i, j)[c] = saturate_cast<uchar>(a*(srcImage.at<Vec3b>(i, j)[c] + b));
}
}
}
return resultImage;
}
int main()
{
Mat srcImage = imread("2.jpg");
if (srcImage.empty())
return -1;
imshow("srcImage", srcImage);
waitKey(0);
float a = 1.2;
int b = 50;
Mat new_image = linearTransform(srcImage, a, b);
imshow("dst", new_image);
waitKey(0);
return 0;
}