图像的线性变换的原理及OpenCV代码实现~
图像的线性变换是图像处理的基本运算,通常应用在调整图像的画面质量方面,如图像对比度、亮度及反转等操作。对于输入图像f(x,y),输出图像g(x,y),其线性变换表达式为:
其中参数a表示图像对比度变化,b表示图像亮度变化。当a<0时,图像变换代表反转操作,如a=-1、b=255,这是常见的8位灰度图像的反转操作设置参数;当|a|>1时,图像变换代表对比度增加操作;当|a|<1时,图像变换代表对比度减少操作。当b>0时,表示图像变换操作是亮度增加操作;b<0时,表示图像变换操作是亮度减少操作。
线性变换的OpenCV源代码如下图所示:
源码中用到的图像的下载链接为:http://pan.baidu.com/s/1i4Dvm2h
图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号”qxsf321”,并关注!
//OpenCV版本2.4.9
//图像处理开发资料、图像处理开发需求、图像处理接私活挣零花钱,可以搜索公众号"qxsf321",并关注!
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
// 图像线性变换操作
cv::Mat linearTransform(cv::Mat srcImage, float a, int b)
{
if(srcImage.empty()){
std::cout<< "No data!" <<std::endl;
}
const int nRows = srcImage.rows;
const int nCols = srcImage.cols;
cv::Mat resultImage =
cv::Mat::zeros(srcImage.size(), srcImage.type());
// 图像元素遍历
for( int i = 0; i < nRows; i++ )
{
for( int j = 0; j < nCols; j++ )
{
for( int c = 0; c < 3; c++ )//如果源图像是灰度图,那么把这里改为c<1即可
{
// 矩阵at操作,检查下标防止越界
resultImage.at<Vec3b>(i,j)[c] =
saturate_cast<uchar>(a *
(srcImage.at<Vec3b>(i,j)[c]) + b);
}
}
}
return resultImage;
}
int main()
{
// 图像获取及验证
cv::Mat srcImage = cv::imread("lakeWater.jpg");
if(!srcImage.data)
return -1;
cv::imshow("srcImage", srcImage);
//cv::waitKey(0);
// 线性变换
float a = 1.2;
int b = 50;
cv::Mat new_image = linearTransform(srcImage, a, b);
cv::imshow("dst", new_image);
cv::waitKey(0);
return 0;
}
运行结果如下图所示:
还没有评论,来说两句吧...