对数变换的通用形式为:

对数函数的一般形状的任何曲线,都能完成图像灰度级的扩展/压缩;但幂律变换对于这个目的更为通用;

代码实现:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;

//注意opencv中的log函数只能处理灰度图片,或单层图片
//基于源图像的方法1
Mat logTransform1(Mat srcImage, int c)
{
    if (srcImage.empty())
        cout << "No data" << endl;
    Mat resultImage = Mat::zeros(srcImage.size(), srcImage.type());
    add(srcImage, Scalar(1.0), srcImage);  //计算 r+1
    srcImage.convertTo(srcImage, CV_32F);  //转化为32位浮点型
    log(srcImage, resultImage);            //计算log(1+r)
    resultImage = c*resultImage;
    //归一化处理
    normalize(resultImage, resultImage, 0, 255, NORM_MINMAX);
    convertScaleAbs(resultImage, resultImage);
    return resultImage;

}
//方法2
Mat logTransform2(Mat srcImage, float c)
{
    if (srcImage.empty())
        cout << "No data" << endl;
    Mat resultImage = 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);
        }
    }
    //归一化处理
    normalize(resultImage, resultImage, 0, 255, NORM_MINMAX);
    convertScaleAbs(resultImage, resultImage);
    return resultImage;
}

//方法3
Mat logTransform3(Mat srcImage, float c)
{
    if (srcImage.empty())
        cout << "No data" << endl;
    Mat resultImage = Mat::zeros(srcImage.size(), srcImage.type());
    srcImage.convertTo(resultImage, CV_32F);  //图像类型转换
    resultImage = resultImage + 1;            //图像矩阵元素加1
    log(resultImage,resultImage);
    resultImage = c*resultImage;
    //归一化处理
    normalize(resultImage, resultImage, 0, 255, NORM_MINMAX);
    convertScaleAbs(resultImage, resultImage);
    return resultImage;
}

int main()
{
    Mat srcImage = imread("123.tif", IMREAD_GRAYSCALE);
    if (!srcImage.data)
        return -1;
    imshow("srcImage", srcImage);
    float c = 1.2;
    Mat resultImage;
    resultImage = logTransform3(srcImage, c);

imshow("resultImage", resultImage);
    waitKey(0);
    return 0;
}

下图为原图像、log增强后的图像

下面代码可处理彩色图像:

代码如下:

// log.cpp

/*
 * 对数函数的一般形状的任何曲线,都能完成图像灰度级的扩展/压缩;但幂律变换对于这个目的更为通用;
 * s = c*log(1+r)
 * 注意Opencv 中的log函数只能处理灰度图片,或单层图片
 */
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;

Mat logTransform(Mat srcImage, float c_log)
{
    if (srcImage.empty())
        cout << "No data" << endl;
    CV_Assert(srcImage.channels() == 3);
    Mat imageLog = Mat::zeros(srcImage.size(), srcImage.type());
    srcImage.convertTo(imageLog, CV_32F);  //图像类型转换

for (int i = 0; i < srcImage.rows; i++) {
        for (int j = 0; j < srcImage.cols; j++){
            imageLog.at<Vec3f>(i, j)[0] = c_log*log(1 + srcImage.at<Vec3b>(i, j)[0]);
            imageLog.at<Vec3f>(i, j)[1] = c_log*log(1 + srcImage.at<Vec3b>(i, j)[1]);
            imageLog.at<Vec3f>(i, j)[2] = c_log*log(1 + srcImage.at<Vec3b>(i, j)[2]);
        }
    }
    //归一化到0~255
    normalize(imageLog, imageLog, 0, 255, CV_MINMAX);
    //转换成8bit图像显示
    convertScaleAbs(imageLog, imageLog);
    return imageLog;
}

int main(int argc, char *argv[])
{
    Mat image = imread("image.jpg", IMREAD_COLOR);
    Mat dst =logTransform(image, 1);
    imshow("Soure", image);
    imshow("after", dst);
    waitKey();

return 0;
}

结果如下:

OpenCV图像增强之对数变换log C++相关推荐

  1. OpenCV图像增强(一)——多尺度视网膜增强

    前言 1.在处理摄像头时,或者在图像中物体轮廓提取时,常常会碰到一些背景偏暗的图像,为了更好的得到效果,那么图像增强会是一个不错的选择. 2.我这里使用的库OpenCV版本是3.30,关于opencv ...

  2. OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法

    所谓图像增强就是把对比度低,看不清楚的图片处理成为对比度高,比较清楚的图片. 下面有三种增强方式,其中log和gamma变换是要自己实现的,效果的好与坏是需要自己调整参数的!!!! 1.均衡直方图 上 ...

  3. OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)

    1. 基于直方图均衡化的图像增强 这个博客总结的特别好,分清楚每个方法适用于什么样的情况. 直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像 ...

  4. OpenCV图像增强(二)——Retinex图像增强

    前言 1.Retinex图像增强是一种高动态范围图像的新色调映射技术.而基础理论是,物体的颜色是由物体对长波(红色).中波(绿色).短波(蓝色)光线的反射能力来决定的,而不是由反射光强度的绝对值来决定 ...

  5. python2.7图像局部增强_Python OpenCV图像增强

    图像增强传统方式有线性增强.非线性增强.直方图均衡化.局部增强等. 线性增强: # 亮度.对比度 # alpha为图像增益,表示放大倍率,取值范围(0.1-3.0)默认值1 # beta为偏置值用来调 ...

  6. <数字图像处理(2)> 图像增强(二)对数变换

    使用对数变换将图像中低灰度值部分扩展,并压缩高灰度值部分,达到强调低灰度的目的,可用于图像偏暗的图像增强.其逆变换可以强调高灰度.与前述直方图均衡化类似,其对应灰度变换函数: s=c∗logv+1(1 ...

  7. opencv 图像增强_图像增强、锐化,利用 Python-OpenCV 帮你实现 4 种方法!

    图像增强目的使得模糊图片变得更加清晰.图片模糊的原因是因为像素灰度差值变化不大,如片各区域产生视觉效果似乎都是一样的, 没有较为突出的地方,看起来不清晰的感觉 解决这个问题的最直接简单办法,放大像素灰 ...

  8. [Python图像处理] 三十八.OpenCV图像增强和图像去雾万字详解(直方图均衡化、局部直方图均衡化、自动色彩均衡化)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. opencv图像增强python_python 基于opencv实现图像增强

    为了得到更加清晰的图像我们需要通过技术对图像进行处理,比如使用对比度增强的方法来处理图像,对比度增强就是对图像输出的灰度级放大到指定的程度,获得图像质量的提升.本文主要通过代码的方式,通过OpenCV ...

最新文章

  1. [并发编程] - Executor框架#ThreadPoolExecutor源码解读03
  2. MongoDB 数据库、集合创建删除与文档插入
  3. 模块化操作(es5写法)
  4. Python学习笔记 ---第三章
  5. 服务器上次文件命令,服务器上次文件命令
  6. Reddit程序员的酒后真言
  7. android 调用百度sdk后运行不了,解决android程序中oncreate方法中调用百度地图MKSearchListener接口不执行的问题...
  8. yyb要填的各种总结的坑
  9. varchar 求和 非数值_考研线性代数 解题方法汇总(非知识点汇总)
  10. 新建word 无法切换输入法_WORD系列-1认识与保存
  11. 第 1 章 Readme
  12. java 发送邮件_Spring Boot (十二):Spring Boot 邮件服务
  13. [转载] 【Python】set() 集合操作与运算 元素输出顺序
  14. [BX]和loop指令06 - 零基础入门学习汇编语言28
  15. 解决谷歌浏览器安装插件失败:无法从该网站添加应用、扩展程序和用户脚本
  16. python使用matplotlib超全画图
  17. 财务分析中三张财务报表计算公式
  18. Gabor滤波器详解
  19. Electron播放 RTMP流 实现
  20. 【图像修复】基于滤波实现损坏图像修复含Matlab源码

热门文章

  1. 使用flex 布局时,英文不自动换行
  2. 网页骨架屏自动生成方案(dps)(转载)
  3. 乐高(LEGO)儿童数码系列电子产品
  4. 接受一个整型值(无符号),按照顺序打印它 的每一位。
  5. Android 程序员不得不收藏的 90+ 个人博客(持续更新,android开发面试
  6. 东北大学大学物理实验报告——2.4分光计的调节与使用
  7. 专业的CMMI认证咨询机构-CMMI实施流程
  8. 重装Ubuntu时如何保留/home分区中的数据
  9. 微处理器走进多内核时代
  10. 画交叉验证的ROC曲线,多个样本不同的ROC重叠。