图像增强算法(直方图均衡化、拉普拉斯、Log、伽马变换)
一、图像增强算法原理
图像增强算法常见于对图像的亮度、对比度、饱和度、色调等进行调节,增加其清晰度,减少噪点等。图像增强往往经过多个算法的组合,完成上述功能,比如图像去燥等同于低通滤波器,增加清晰度则为高通滤波器,当然增强一副图像是为最后获取图像有用信息服务为主。一般的算法流程可为:图像去燥、增加清晰度(对比度)、灰度化或者获取图像边缘特征或者对图像进行卷积、二值化等,上述四个步骤往往可以通过不同的步骤进行实现,后续将针对此方面内容进行专题实验,列举其应用场景和处理特点。
本文章是一篇综合性文章,算是一篇抛砖引玉的文章,有均衡化、提高对比度、降低对比度的算法。
1.1 基于直方图均衡化的图像增强
图像对比度增强的方法可以分为两种:直接对比度增强方法,间接对比度增强方法。直方图拉伸和直方图均衡化是常见的间接对比度增强方法。直方图拉伸是利用对比度拉伸对直方图进行调整,扩大前景和背景灰度的差别,这种方法可以通过线性和非线性的方法来实现,其中ps中就是利用此方法提高对比度;直方图均衡化则是利用累积函数对灰度值进行调整,实现对比度的增强。
直方图均衡化处理原理:将原始图像的灰度图从比较集中的某个灰度区间均匀分布在整个灰度空间中,实现对图像的非线性拉伸,重新分配图像像素值。
算法应用场景:
1、算法的本质是重新分布图像的像素值,增加了许多局部的对比度,整体的对比度没有进行太大改变,所以应用图像为图像有用数据的对比度相近是,例如:X光图像,可以将曝光过度或曝光不足照片进行更好的显示,或者是背景及前景太亮或太暗的图像非常有用。
2、算法当然也有缺点,具体表现为:变换后的图像灰度级减少,某些细节减少;某些图像有高峰值,则处理后对比度不自然的过分增强。
算法实现特点:
1、均衡化过程:直方图均衡化保证在图像像素映射过程中原来的大小关系保持不变,即较亮的区域依旧较亮,较暗的依旧较暗,只是对比度增加,不能明暗颠倒;保证像素映射函数的值域在0和255之间。累积分布函数是单增长函数,并且值域是0到1。
2、累积分布函数实现过程:
比较概率分布函数和累积分布函数,前者的二维图像是参差不齐的,后者是单调递增的。直方图均衡化过程中,映射方法是
其中,n是图像中像素的总和,是当前灰度级的像素个数,L是图像中可能的灰度级总数。
来看看通过上述公式怎样实现的拉伸。假设有如下图像:
得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:
映射后的图像如下所示:
算法伪代码:
1、计算原始灰度图像的像素概率分布
2、根据像素概率分布获取图像累积分布函数
3、根据映射函数获取变换后的图像
算法matlab代码:
- %直方图均衡化
- I = imread('rice.png');
- [height,width] = size(I);
- figure
- subplot(221)
- imshow(I)%显示原始图像
- subplot(222)
- imhist(I)%显示原始图像直方图
- %进行像素灰度统计;
- NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级
- for i = 1:height
- for j = 1: width
- NumPixel(I(i,j) + 1) = NumPixel(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一
- end
- end
- %计算灰度分布密度
- ProbPixel = zeros(1,256);
- for i = 1:256
- ProbPixel(i) = NumPixel(i) / (height * width * 1.0);
- end
- %计算累计直方图分布
- CumuPixel = zeros(1,256);
- for i = 1:256
- if i == 1
- CumuPixel(i) = ProbPixel(i);
- else
- CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);
- end
- end
- %累计分布取整
- CumuPixel = uint8(255 .* CumuPixel + 0.5);
- %对灰度值进行映射(均衡化)
- for i = 1:height
- for j = 1: width
- I(i,j) = CumuPixel(I(i,j));
- end
- end
- subplot(223)
- imshow(I)%显示原始图像
- subplot(224)
- imhist(I)%显示原始图像直方图
1.2 基于拉普拉斯算子的图像增强
利用拉普拉斯算子进行图像增强本质是利用图像的二次微分对图像进行蜕化,在图像领域中微分是锐化,积分是模糊,利用二次微分对图像进行蜕化即利用邻域像素提高对比度。在opencv中也有拉普拉斯函数,但那时生成了灰度图像,更多的求取边缘,具体源码还没研究,其中原理可以参考我前一篇文章,针对拉普拉斯有个详细的介绍。
本次实验应用的卷积核为:
1.3 基于对象Log变换的图像增强
对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到强调图像低灰度部分的目的。变换方法:
对数变换对图像低灰度部分细节增强的功能过可以从对数图上直观理解:
x轴的0.4大约对应了y轴的0.8,即原图上0~0.4的低灰度部分经过对数运算后扩展到0~0.8的部分,而整个0.4~1的高灰度部分被投影到只有0.8~1的区间,这样就达到了扩展和增强低灰度部分,压缩高灰度部分的值的功能。
从上图还可以看到,对于不同的底数,底数越大,对低灰度部分的扩展就越强,对高灰度部分的压缩也就越强。
1.4 基于伽马变换的图像增强
伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算:
伽马变换对图像的修正作用其实就是通过增强低灰度或高灰度的细节实现的,从伽马曲线可以直观理解:
γ值以1为分界,值越小,对图像低灰度部分的扩展作用就越强,值越大,对图像高灰度部分的扩展作用就越强,通过不同的γ值,就可以达到增强低灰度或高灰度部分细节的作用。
伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于于相机过曝)情况下的图像增强效果明显。
二、测试代码
根据上述讲解,本文利用python进行编程实验,代码如下:
- def preprocess(filename, i):
- image = cv2.imread(filename)
- image_gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
- # 直方图均衡增强
- image_equal = cv2.equalizeHist(image_gray)
- r,g,b = cv2.split(image)
- r1 = cv2.equalizeHist(r)
- g1 = cv2.equalizeHist(g)
- b1 = cv2.equalizeHist(b)
- image_equal_clo = cv2.merge([r1, g1, b1])
- # 拉普拉斯算法增强
- kernel = np.array([ [0, -1, 0],
- [-1, 5, -1],
- [0, -1, 0] ])
- image_lap = cv2.filter2D(image,cv2.CV_8UC3 , kernel)
- # 对象算法增强
- image_log = np.uint8(np.log(np.array(image) +1))
- cv2.normalize(image_log, image_log,0,255,cv2.NORM_MINMAX)
- # 转换成8bit图像显示
- cv2.convertScaleAbs(image_log,image_log)
- # 伽马变换
- fgamma = 2
- image_gamma = np.uint8(np.power((np.array(image)/255.0),fgamma)*255.0)
- cv2.normalize(image_gamma, image_gamma, 0, 255, cv2.NORM_MINMAX)
- cv2.convertScaleAbs(image_gamma, image_gamma)
三、实验结果及分析
(src) (log)
(laplus) (gamma)
(equal)
(src) (log)
(laplus) (gamma)
(equal)
实验结果分析为:
1、log函数变化对图像增强来讲,更多是对图像的对比度有所减弱,毕竟函数表现形式为像素值小的变大点,像素值大的变小点,所以对比度减小,亮度增加,正如图像所显示。所以目前看来log函数还是慎用,如果提高函数可以利用分段函数啊。
2、gamma函数图像增强,这个函数原理可以看出,当r大于1时,可以当做指数函数,小于则为log函数。在试验中我们常用r>1,实现图像对比度增强。从图像中可以看出,黑色更黑,白色更白。
3、laplus函数图像增强,本质是微分,所以为图像锐化,在图像锐化是明显凸显图像的细节,进而直观上提高图像对比度。
4、equal函数本质是重新分布图像的像素值,直观我们发现图像颜色发生变化,但对比度是有所提高,当然对于这组的图像的作用,没有体现。
总结:图像增强方法不同,应用领域不同,更好的应用需要掌握灵活多变的方法。
四、参考文章
1、OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma):本文基本在此基础上进行编程实现,原理可以参考这,同时自己对里面的概念问题进行详解。
2、直方图均衡化原理:本文详细介绍了直方图均衡化的原理,并通过opencv进行函数实现。
3、直方图均衡化详解及编程实现:文中对直方图均衡化的应用特点和缺点进行分析,并根据算法原理通过matlab实现了算法。
图像增强算法(直方图均衡化、拉普拉斯、Log、伽马变换)的更多相关文章
- 对比度增强(二):直方图正规划与伽马变换 cv.normal()函数使用及原理
直方图正规化: 图像为I,宽为W,高为H,I(r,c)代表I的第r行第c列的灰度值:输出图像记为O,为使得输出图像的灰度值在[Omin,Omax]范围里,可用如下公式: ...
- 基础图像处理之混合空间增强——(Java:拉普拉斯锐化、Sobel边缘检测、均值滤波、伽马变换)
相信看过冈萨雷斯第三版数字图像处理的童鞋都知道,里面涉及到了很多的基础图像处理的算法,今天,就专门借用其中一个混合空间增强的案例,来将常见的几种图像处理算法集合起来,看能发生什么样的化学反应 首先,通 ...
- C++数字图像处理(1)-伽马变换
https://blog.csdn.net/huqiang_823/article/details/80767019 1.算法原理 伽马变换(幂律变换)是常用的灰度变换,是一种简单的图像增强算法 ...
- OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)
如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 下面 ...
- 伽马变换(一些基本的灰度变换函数)基本原理及Python实现
1. 基本原理 变换形式 $$s=cr^{\gamma}$$ c与$\gamma$均为常数 可通过调整$\gamma$来调整该变换,最常用于伽马校正与对比度增强 2. 测试结果 图源自skimage ...
- OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)
http://blog.csdn.net/dcrmg/article/details/53677739 1. 基于直方图均衡化的图像增强 直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶 ...
- 灰度图像--图像增强 直方图均衡化(Histogram equalization)
灰度图像--图像增强 直方图均衡化(Histogram equalization) 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些 ...
- 图像增强 | CLAHE 限制对比度自适应直方图均衡化
1 基本概述 CLAHE是一个比较有意思的图像增强的方法,主要用在医学图像上面.之前的比赛中,用到了这个,但是对其算法原理不甚了解.在这里做一个复盘. CLAHE起到的作用简单来说就是增强图像的对比度 ...
- 【图像增强】CLAHE 限制对比度自适应直方图均衡化
文章目录: 目录 1 基本概述 2 竞赛中的CLAHE实现 3 openCV绘制直方图 4 对比度Contrast 5 Contrast Stretching 6 Histogram Equaliza ...
随机推荐
- odoo开发笔记 -- 日常开发注意点小节
onchange depends区别 视图字段增加readonly属性
- java ant 编译打包build.xml完整配置范例
java ant 编译打包build.xml完整配置范例 <?xml version="1.0" encoding="UTF-8" ?> <p ...
- (转)python高级FTP
原文地址:http://www.itnose.net/detail/6754889.html高级FTP服务器1. 用户加密认证2. 多用户同时登陆3. 每个用户有自己的家目录且只能访问自己的家目录4. ...
- 使用Jenkins部署.Net应用程序
首先从 https://jenkins.io/download/ 下载所需的版本 这里选择Windows版本来测试. 直接安装jenkins.msi,安装完后使用Win+R输入services.msc ...
- Method 'initializationerror' not found.Opening the test classs JUnit4单元测试报错问题解决办法(图文详解)
不多说,直接上干货! 问题现象 今天使用JUnit 4进行单元测试时,测试程序一直运行不起来,报method initializationerror not found错误,如下: 问题分析 网上说版 ...
- jdk8-lambda-stream的使用
1, 认识stream(声明式编程) Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator, 原始版本的Iterator,用户只能一个一 ...
- Linux-(ping,traceroute,ss)
ping命令 1.命令格式: ping [参数] [主机名或IP地址] 2.命令功能: ping命令用于:确定网络和各外部主机的状态:跟踪和隔离硬件和软件问题:测试.评估和管理网络.如果主机正在运行并 ...
- CentOS7 下安装 iSCSI Target(tgt) ,使用 Ceph rbd
目录 一.iSCSI 介绍 1. iSCSI 定义 2. 几种常见的 iSCSI Target 3. 优缺点比较 二.安装步骤 1. 关闭防火墙 2. 关闭selinux 3. 通过 yum 安装 t ...
- log4jdbc 与 logback 集合打印日志过多的解决
在项目中使用了log4jdbc,可以很方便的把sql的参数也打印出来,便于问题调试.比如原始sql: select * from t_order where order_id = ? : 经过log4 ...
- 玩转mongodb(七):索引,速度的引领(全文索引、地理空间索引)
本篇博文主要介绍MongoDB中一些常用的特殊索引类型,主要包括: 用于简单字符串搜索的全文本索引: 用于球体空间(2dsphere)和二维平面(2d)的地理空间索引. 一.全文索引 MongoDB有 ...