灰度图像的对数变换原理及OpenCV代码实现
图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601
对数变换的公式为:
其中c为常数,r>=0
对数变换目前我知道的有两个作用:
①因为对数曲线在像素值较低的区域斜率较大,像素值较高的区域斜率比较低,所以图像经过对数变换之后,在较暗的区域对比度将得到提升,因而能增强图像暗部的细节。
②图像的傅里叶频谱其动态范围可能宽达0~10^6。直接显示频谱的话显示设备的动态范围往往不能满足要求,这个时候就需要使用对数变换,使得傅里叶频谱的动态范围被合理地非线性压缩。
在OpenCV中,图像对数变换的实现可以直接通过对图像中每个元素运算上述公式完成,也可以通过矩阵整体操作来完成。下面的代码中给了三种方法,其中方法一和方法三都是通过矩阵整体操作来完成,第二种方法是对图像中每个元素操作来完成。方法一和方法三的区别是前者是对源图像作对数运算,后者是对目标图像作对数运算!
源代码如下(代码中用到的图像下载链接 http://pan.baidu.com/s/1i4Dvm2h):
//OpenCV版本2.4.9
//图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
//图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601#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 + rcv::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("lakeWater.jpg",0); if(!srcImage.data) return -1;// 验证三种不同方式的对数变换速度cv::imshow("srcImage", srcImage); float c = 1.2;cv::Mat resultImage;double tTime;tTime = (double)getTickCount();const int nTimes = 10;for(int i = 0; i < nTimes; i++){resultImage = logTransform1(srcImage, c); }tTime = 1000*((double)getTickCount() - tTime)/getTickFrequency();tTime /= nTimes;std::cout << "第一种方法耗时:"<<tTime << std::endl; cv::imshow("resultImage", resultImage);cv::waitKey(0);return 0;
}
运行结果如下图所示:
可见,第二种方法将来在做具体应用的时候是肯定要放弃的!
图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601
灰度图像的对数变换原理及OpenCV代码实现相关推荐
- RANSAC(随机采样一致算法)原理及openCV代码实现
<RANSAC(随机采样一致算法)原理及openCV代码实现> 原文: http://www.lai18.com/content/1046939.html 本文转自:http://b ...
- 图像的OTSU阈值化、双阈值化、半阈值化的原理及OpenCV代码实现
本文的基础是OpenCV的函数threshold(),关于函数threshold()的详细介绍,大家可以参考下面这篇博文: https://www.hhai.cc/thread-162-1-1.htm ...
- 利用OpenCV实现旋转文本图像矫正的原理及OpenCV代码
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 对图像进行旋转矫正,关键是要获取旋转角度是多少! ...
- 利用霍夫变换做直线检测的原理及OpenCV代码实现
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 霍夫变换的原理大家可以参考博文 霍夫变换_tie ...
- 利用Canny边缘检测算子进行边缘检测的原理及OpenCV代码实现
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 Canny算子是John Canny在1986年 ...
- 图像的线性变换的原理及OpenCV代码实现~
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像的线性变换是图像处理的基本运算,通常应用在调 ...
- 图像的Gamma(伽玛)校正的原理及OpenCV代码实现
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 Gamma校正的原理很简单,就一个很简单的表达式 ...
- 图像特征检测描述(一):SIFT、SURF、ORB、HOG、LBP特征的原理概述及OpenCV代码实现
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 什么叫特征检测?就是检测图像中目标的特征呗,所谓 ...
- 利用霍夫梯度法进行圆检测的原理概要及OpenCV代码实现
图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 霍夫圆变换的基本原理与霍夫线变换原理类似,对直线 ...
最新文章
- 在Ubuntu上源码安装MySQL+安装问题解决+安全优化
- linux远程用户登陆监控
- IDEA开发工具的学习
- “天才”少年!4位90后摘得全球顶尖数学大奖,90%获奖者不满30岁
- Nacos 发布0.3.0版本,迄今为止最好看的版本
- linux mint 向“显示(display)”面板添加没有提供的分辨率选项,使虚拟机中的linux mint可以全屏显示...
- 深入理解Python中赋值、深拷贝(deepcopy)、浅拷贝(copy)
- 220.存在重复元素III
- 高质量C编程00-汇总
- VS code 快捷键常用
- 遗传算法求解带时间窗的VRP问题(python)
- html实现画板的基本操作,JavaScript操作Canvas实现画板实例分析
- 基于android的希腊字母读音手机软件,希腊字母表app下载
- 李国庆与当当,一个中国网络书店的传奇
- 计算机一级证件照尺寸,照相馆不会告诉你的哪些事:常用证件照尺寸汇总
- 找个好人就嫁了吧 - 刘思伟
- Hazelcast IMDG参考中文版手册-第一章-前言
- 电网设备股集体上涨,国家电网称将推进电网数字化转型
- 黑马程序员—must 8k,黑马真男人,平均9k宿舍~~~~求围观,求给力!!!!
- React基础(2)—— React函数式组件使用ref
热门文章
- php和python哪个工资高-学python和php哪个前景好
- 自学python还是报班-Python应该自学还是报班好?
- python循环语句-python语句中Python循环语句(附代码)
- 下面不属于python第三方库的安装方法的是-python第三方库的pip安装方法
- python 如何查看模块所有方法-如何查看python的模块
- python简单代码表白-python浪漫表白源码
- python利器怎么用-Python爬虫利器二之Beautiful Soup的用法
- python自动化测试视频百度云-python接口自动化测试视频教程全集
- 想学python有什么用-学python日常工作有什么用?
- python要学多久-python需要学多久?自学两年也很难达到企业标准!