zl程序教程

您现在的位置是:首页 >  后端

当前栏目

图像线性变换的原理及基于OpenCV的C++实现

OpencvC++原理 实现 基于 图像
2023-09-11 14:15:39 时间

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

图像的线性变换是图像处理的基本运算,通常应用在调整图像的画面质量方面,如图像对比度、亮度及反转等操作。对于输入图像f(x,y),输出图像g(x,y),其线性变换表达式为:

其中参数a表示图像对比度变化,b表示图像亮度变化。

当a<0时,图像变换代表反转操作,如a=-1、b=255,这是常见的8位灰度图像的反转操作设置参数;
当|a|>1时,图像变换代表对比度增加操作;
当|a|<1时,图像变换代表对比度减少操作。
当b>0时,表示图像变换操作是亮度增加操作;
b<0时,表示图像变换操作是亮度减少操作。

线性变换的OpenCV源代码如下图所示:

​源码中用到的图像的下载链接:
https://pan.baidu.com/s/1i4Dvm2h

 

//博主微信/QQ 2487872782
//有问题可以联系博主交流
//有图像处理需求也可联系博主
//图像处理技术交流QQ群 271891601

#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;
}

运行结果如下图所示:

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601