对数变换的三种实现方法

#include <opencv2/core/core.hpp>        
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp>  
#include <iostream> 
using namespace cv;
// 对数变换方法1
cv::Mat logTransform1(cv::Mat srcImage, int c)
{
    // 输入图像判断
    if(srcImage.empty())
        std::cout<< "No data!" <<std::endl;  
    cv::Mat resultImage = 
      cv::Mat::zeros(srcImage.size(), srcImage.type());
    // 计算 1 + r
    cv::add(srcImage, cv::Scalar(1.0), srcImage);
    // 转换为32位浮点数
    srcImage.convertTo(srcImage, CV_32F); 
    // 计算 log(1 + r)
    log(srcImage, resultImage);
    resultImage = c * resultImage;
    // 归一化处理
    cv::normalize(resultImage,resultImage,
        0,255,cv::NORM_MINMAX);
    cv::convertScaleAbs(resultImage,resultImage);
    return resultImage;
}
// 对数变换方法2
cv::Mat logTransform2(Mat srcImage,float c)  
{  
    // 输入图像判断
    if(srcImage.empty())
        std::cout<< "No data!" <<std::endl;
    cv::Mat resultImage = 
      cv::Mat::zeros(srcImage.size(), srcImage.type());  
    double gray = 0;
    // 图像遍历分别计算每个像素点的对数变换  
    for(int i = 0;i < srcImage.rows;i++){  
        for(int j = 0; j < srcImage.cols; j++){  
            gray = (double)srcImage.at<uchar>(i,j); 
            gray = c*log((double)(1 + gray));  
            resultImage.at<uchar>(i,j)=saturate_cast<uchar>(gray); 
        }  
    }
    // 归一化处理
    cv::normalize(resultImage,resultImage,
        0,255,cv::NORM_MINMAX);
    cv::convertScaleAbs(resultImage,resultImage);
    return resultImage; 
}
// 对数变换方法3
cv::Mat logTransform3(Mat srcImage, float c)  
{  
    // 输入图像判断
    if(srcImage.empty())
        std::cout<< "No data!" <<std::endl;
    cv::Mat resultImage = 
      cv::Mat::zeros(srcImage.size(), srcImage.type());  
    srcImage.convertTo(resultImage,CV_32F);
    resultImage = resultImage + 1;
    cv::log(resultImage,resultImage);
    resultImage = c * resultImage;
    cv::normalize(resultImage,resultImage,0,255,cv::NORM_MINMAX);
    cv::convertScaleAbs(resultImage,resultImage);
    return resultImage; 
}
int main()
{
    // 读取灰度图像及验证
    cv::Mat srcImage = cv::imread("..\\images\\lakeWater.jpg",0); 
    if(!srcImage.data) 
        return -1;
    // 验证三种不同方式的对数变换速度
    cv::imshow("srcImage", srcImage); 
    float c = 1.1;
    cv::Mat resultImage;
    double tTime;
    tTime = (double)getTickCount();
    const int nTimes = 100;
    for(int i  = 0;  i < nTimes; i++)
    {
        resultImage = logTransform3(srcImage, c); 
    }
    tTime = 1000*((double)getTickCount() - tTime)/
    getTickFrequency();
    tTime /= nTimes;
    std::cout << tTime << std::endl;   
    cv::imshow("resultImage", resultImage);
    cv::waitKey(0);
    return 0;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值