OpenCV图像增强之对数变换log C++
对数变换的通用形式为:
对数函数的一般形状的任何曲线,都能完成图像灰度级的扩展/压缩;但幂律变换对于这个目的更为通用;
代码实现:
#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++相关推荐
- OpenCV图像增强(一)——多尺度视网膜增强
前言 1.在处理摄像头时,或者在图像中物体轮廓提取时,常常会碰到一些背景偏暗的图像,为了更好的得到效果,那么图像增强会是一个不错的选择. 2.我这里使用的库OpenCV版本是3.30,关于opencv ...
- OpenCV - 均衡直方图、Log变换、伽马变换3种图像增强方法
所谓图像增强就是把对比度低,看不清楚的图片处理成为对比度高,比较清楚的图片. 下面有三种增强方式,其中log和gamma变换是要自己实现的,效果的好与坏是需要自己调整参数的!!!! 1.均衡直方图 上 ...
- OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)
1. 基于直方图均衡化的图像增强 这个博客总结的特别好,分清楚每个方法适用于什么样的情况. 直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像 ...
- OpenCV图像增强(二)——Retinex图像增强
前言 1.Retinex图像增强是一种高动态范围图像的新色调映射技术.而基础理论是,物体的颜色是由物体对长波(红色).中波(绿色).短波(蓝色)光线的反射能力来决定的,而不是由反射光强度的绝对值来决定 ...
- python2.7图像局部增强_Python OpenCV图像增强
图像增强传统方式有线性增强.非线性增强.直方图均衡化.局部增强等. 线性增强: # 亮度.对比度 # alpha为图像增益,表示放大倍率,取值范围(0.1-3.0)默认值1 # beta为偏置值用来调 ...
- <数字图像处理(2)> 图像增强(二)对数变换
使用对数变换将图像中低灰度值部分扩展,并压缩高灰度值部分,达到强调低灰度的目的,可用于图像偏暗的图像增强.其逆变换可以强调高灰度.与前述直方图均衡化类似,其对应灰度变换函数: s=c∗logv+1(1 ...
- opencv 图像增强_图像增强、锐化,利用 Python-OpenCV 帮你实现 4 种方法!
图像增强目的使得模糊图片变得更加清晰.图片模糊的原因是因为像素灰度差值变化不大,如片各区域产生视觉效果似乎都是一样的, 没有较为突出的地方,看起来不清晰的感觉 解决这个问题的最直接简单办法,放大像素灰 ...
- [Python图像处理] 三十八.OpenCV图像增强和图像去雾万字详解(直方图均衡化、局部直方图均衡化、自动色彩均衡化)
该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...
- opencv图像增强python_python 基于opencv实现图像增强
为了得到更加清晰的图像我们需要通过技术对图像进行处理,比如使用对比度增强的方法来处理图像,对比度增强就是对图像输出的灰度级放大到指定的程度,获得图像质量的提升.本文主要通过代码的方式,通过OpenCV ...
最新文章
- [并发编程] - Executor框架#ThreadPoolExecutor源码解读03
- MongoDB 数据库、集合创建删除与文档插入
- 模块化操作(es5写法)
- Python学习笔记 ---第三章
- 服务器上次文件命令,服务器上次文件命令
- Reddit程序员的酒后真言
- android 调用百度sdk后运行不了,解决android程序中oncreate方法中调用百度地图MKSearchListener接口不执行的问题...
- yyb要填的各种总结的坑
- varchar 求和 非数值_考研线性代数 解题方法汇总(非知识点汇总)
- 新建word 无法切换输入法_WORD系列-1认识与保存
- 第 1 章 Readme
- java 发送邮件_Spring Boot (十二):Spring Boot 邮件服务
- [转载] 【Python】set() 集合操作与运算 元素输出顺序
- [BX]和loop指令06 - 零基础入门学习汇编语言28
- 解决谷歌浏览器安装插件失败:无法从该网站添加应用、扩展程序和用户脚本
- python使用matplotlib超全画图
- 财务分析中三张财务报表计算公式
- Gabor滤波器详解
- Electron播放 RTMP流 实现
- 【图像修复】基于滤波实现损坏图像修复含Matlab源码