OpenCV图像增强之对数变换log C++

OpenCV图像增强之对数变换log C++

对数变换的通用形式为:

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

代码实现:

#include

#include

#include

#include

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(i, j);

gray = c*log((double)(1 + gray));

resultImage.at(i, j) = saturate_cast(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

#include

#include

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(i, j)[0] = c_log*log(1 + srcImage.at(i, j)[0]);

imageLog.at(i, j)[1] = c_log*log(1 + srcImage.at(i, j)[1]);

imageLog.at(i, j)[2] = c_log*log(1 + srcImage.at(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++相关教程

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

  1. 【OpenCV 例程200篇】50. 图像增强—直方图统计量图像增强

    [OpenCV 例程200篇]50. 图像增强-直方图统计量图像增强 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 ...

  2. java.util.ServiceConfigurationError: org.apache.juli.logging.Log: Provider org.eclipse.jetty.apache.

    在用maven项目的时候,项目原本部署在 Tomcat 服务器上,一切正常,但是部署到 Jetty 后,启动报错.关键错误信息为 "java.lang.NoClassDefFoundErro ...

  3. opencv 实现等值线_OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)...

    1. 基于直方图均衡化的图像增强 直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像主观视觉效果的目的.对比度较低的图像适合使用直方图均衡化方 ...

  4. OpenCV图像增强之对数变换log C++

    对数变换的通用形式为: 对数函数的一般形状的任何曲线,都能完成图像灰度级的扩展/压缩:但幂律变换对于这个目的更为通用: 代码实现: #include <opencv2/core/core.hpp ...

  5. 如何用java取对数_使用Java中的Math.log获取自然对数值

    要获取数字的自然对数,我们使用java.lang.Math.log()方法.Math.log()方法返回自然对数,即log以double值的底数e为底.如果传递的值为NaN或负数,则结果为NaN.如果 ...

  6. retinex 的水下图像增强算法_图像增强论文:腾讯优图CVPR2019

    Underexposed Photo Enhancement using Deep Illumination Estimation 基于深度学习优化光照的暗光下的图像增强 论文地址:Underexpo ...

  7. 关于java中对数的计算

    最近为了计算文档间的相关性需要用到对数的计算,在网上找到下面的方法: 其中的关键是:1 java标准包提供了自然对数的计算方法,2 其他的对数计算可以转换为自然对数的计算. 下面是转贴:但不知道谁是原 ...

  8. python图像增强算法_retinex图像增强算法的研究

    图像增强方面我共研究了Retinex.暗通道去雾.ACE等算法.其实,它们都是共通的.甚至可以说,Retinex和暗通道去雾就是同一个算法的两个不同视角,而ACE算法又是将Retinex和灰度世界等白 ...

  9. 对数 java_关于java中对数的计算

    最近为了计算文档间的相关性需要用到对数的计算,在网上找到下面的方法: 其中的关键是:1 java标准包提供了自然对数的计算方法,2 其他的对数计算可 以转换为自然对数的计算. 下面是转贴:但不知道谁是 ...

  10. Java | 使用对数器判断自己的程序是否正确(generateRandomArray)

    对数器:利用系统产生多个随机样本,将系统排序的结果和自己写的程序输出结果进行比对,判断是否正确. 目录结构 SelectionSort.java DataChecker.java 1 选择排序程序完整 ...

最新文章

  1. 网络安全界永恒不变的10大安全法则
  2. android fragment 弹出对话框,Android DialogFragment弹框实现
  3. wireshark抓包常见提示含义解析
  4. 纯js上传文件 很好用
  5. (计算机组成原理题目题型总结)第二章:数据的表示和运算
  6. C语言手写自定义三维数组
  7. 李礼辉:如何进行必要的数字金融制度建设等问题值得关注
  8. 苹果应用审核走进中国!
  9. vsftp匿名访问目录_怎么更改vsftp匿名用户的默认登录目录/var/ftp?
  10. access建立er图_ER图的构建
  11. ADS学习笔记—3.仿真实例
  12. java冒泡排序和插入排序
  13. 我奋斗了18年才和你坐在一起喝咖啡
  14. 解决云帆小说下载阅读器不能下载https网址的问题
  15. python四分位数_Python:获取四分位数的数组索引
  16. 持续分化的 NFT 市场:新的金字塔正在形成
  17. N-S图、PAD图(例题)
  18. 如何随意复制网页上的文字
  19. Android实现直播的博文和流程(全过程,超详细/附源码)
  20. C - Monthly Expense

热门文章

  1. 云计算与大数据技术 第一章
  2. ToC和ToB有啥区别
  3. ToB和ToC端产品分别指什么
  4. Learning to Fuse Asymmetric Feature Maps in Siamese Trackers 论文与代码笔记
  5. 2021年中国钢铁行业发展现状分析,“双碳”背景下行业转型步伐加快「图」
  6. 如何添加使用微信小程序,教程在这里,微信小程序怎样添加使用
  7. LM2596DC -DC模块测试记录
  8. 一步一步理解欧拉公式
  9. 发现Chrome小恐龙彩蛋的第n+1个使用者
  10. HDMI设计9--Video Mixer IP