1.基础概念

1.1 图像灰度直方图

灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。图像的对比度是通过灰度级范围来度量的,而灰度级范围可通过观察灰度直方图得到,灰度级范围越大代表对比度越高;反之对比度越低,低对比度的图像在视觉上给人的感觉是看起来不够清晰,所以通过算法调整图像的灰度值,从而调整图像的对比度是有必要的。

#获得图像的灰度直方图
def calGrayHist(img):h,w = img.shape[:2]gray_hist = np.zeros([256], np.uint64)for i in range(h):for j in range(w):gray_hist[img[i][j]] += 1return gray_hist

2.图像增强算法

2.1 线性变换

#线性变换图像增强
def linearTrans(a, b, img):assert isinstance(a, float) # 必须是浮点型,否则(np.uint8)会发生取余数操作output_img = a * img + boutput_img[output_img > 255] = 255output_img = np.around(output_img)output_img = output_img.astype(np.uint8)return output_img
output_img = linearTrans(2.0, 10, img) 

以上线性变换是对整个灰度级范围使用了相同的参数,有的时候也需要针对不同灰度级范围进行不同的线性变换,这就是常用的分段线性变换,经常用于降低较亮或较暗区域的对比度来增强灰度级处于中间范围的对比度,或者压低中间灰度级处的对比度来增强较亮或者较暗区域的对比度。

线性变换图像增强的缺点:需要根据不同的应用及图像自身的信息进行合理的选择,可能需要进行多次测试,所以选择合适的参数是相当麻烦的。直方图正规化就是基于当前图像情况自动选取a和b的值的方法。

2.2 直方图正规化

#直方图的正规化
#计算图像灰度级的最值
print("hist normal:")
def hist_normal(omin, omax, img):Imin = np.min(img)Imax = np.max(img)a = float(omax-omin)/float(Imax-Imin)b = omin-a * Iminoutput_img = a * img + boutput_img = np.around(output_img)output_img = output_img.astype(np.uint8)return output_img
output_img =  hist_normal(0, 255, img) 

2.3 伽马变换

假设输入图像为I,宽为W,高为H,首先将其灰度值归一化到[0,1]范围,对于8位图来说,除以255即可。I(r,c)代表归一化后的第r行第c列的灰度值,输出图像记为O,伽马变换就是O(r, c) = I(r,c)**gamma。当gamma = 1时,图像不变。如果图像整体或者感兴趣区域较暗,则令0<gamma<1 (像素值都被归一化到0-1之间)可以增加图像亮度,提高对比度;相反,如果图像整体或者感兴趣区域较亮,则令gamma > 1可以降低图像亮度,提高对比度。图像的伽马变换实质上是对图像矩阵中的每一个值进行幂运算,Numpy提供的幂函数power实现了该功能:out = np.power(img, gamma)。

2.4 全局直方图均衡化

直方图均衡化通常用来增加图像的局部对比度。对于背景和前景都太亮或者太暗的图像非常有用尤其是可以带来X光图像中更清晰的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。

1)获得图像对应的灰度图像,计算灰度图像的灰度直方图
2)计算灰度直方图的累加直方图
3)输入灰度级和输出灰度级之间的映射关系
4)根据映射关系循环输出图像的每一个像素的灰度级

#全局直方图均衡化
print("equalizeHist:")
#求取直方图均衡化的每个像素的映射关系:
def equalizeHist_map(img_gray):#输入必须是灰度图像h, w = img_gray.shape#计算灰度直方图gray_hist = calGrayHist(img_gray)#计算累加灰度直方图cumulative_hist = np.zeros([256], np.uint64)for p in range(256):if p == 0:cumulative_hist[p] = gray_hist[p]else:cumulative_hist[p] = cumulative_hist[p-1] + gray_hist[p]#根据累加灰度直方图得到输入灰度级和输出灰度级之间的映射关系relative_map = np.zeros([256], np.uint8)coff = 256.0/(h*w)for p in range(256):q = coff * float(cumulative_hist[p]) -1if q < 0:relative_map[p] = 0else:relative_map[p] = math.floor(q)return relative_map
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
relative_map = equalizeHist_map(img_gray)
img_result = np.zeros(img.shape, np.uint8)
h,w = img.shape[:2]
for i in range(h):for j in range(w):img_result[i][j] = relative_map[img[i][j]]

虽然全局直方图均衡化方法对提高对比度很有效,但是均衡化处理以后暗区域的噪声可能会被放大,变得清晰可见,而亮区域可能会损失信息。为了解决该问题,提出了自适应直方图均衡化(Aptive Histogram Equalization)方法

2.5 自适应直方图均衡化(Aptive Histogram Equalization)

自适应直方图均衡化首先将图像划分为不重叠的区域块,然后对每一个块分别进行直方图均衡化。在没有噪声影响的情况下,每一个小区域的灰度直方图会被限制在一个小的灰度级范围内;但是如果有噪声,每一个分割的区域块执行直方图均衡化后,噪声会被放大。为了避免出现噪声这种情况,提出了“限制对比度”(Contrast Limiting),如果直方图的bin超过了提前预设好的“限制对比度”,那么会被裁剪,然后将裁剪的部分均匀分布到其他的bin,这样就重构了直方图.代码见pyhton opencv createCLAHE函数。

线性变换,分段线性变换,伽马变换,直方图正规化,直方图均衡化,局部自适应直方图均衡化的原理以及python代码相关推荐

  1. OpenCV--Python 图像增强(线性变换,直方图正规化,伽马变换,全局直方图均衡化,限制对比度的自适应直方图均衡化)

    图像增强主要解决由于图像的灰度级范围较小造成的对比度较低的问题,目的就是将输出图像的灰度级放大到指定的程度,使得图像中的细节看起来增加清晰.对比度增强有几种常用的方法,如线性变换.分段线性变换.伽马变 ...

  2. 图像算法一:【图像点运算】灰度直方图、伽马变换、灰度阈值变换、分段线性变换、直方图均衡化

    灰度直方图:imhist() %描述了图像灰度统计信息,主要应用于图像分割和图像灰度变换.>>Img=imread( ' xxx.jpg' ); %读图>>I=imhist(I ...

  3. 数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换、对数变换、伽马变换和分段线性变换)

    数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换.对数变换.伽马变换和分段线性变换) 空间域处理是直接对像素进行操作的方法,这是相对于频率域处理而言的.空间域处理主要分为两大类:灰度变换 ...

  4. OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)

    人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台.每周免费提供 ...

  5. 图像的常用灰度变换——负片、伽马变换、对数变换、直方图均衡化、自适应灰度变换及其MATLAB实现

    灰度变换是图像预处理的重要手段,常见的变换方法如下,图文并茂和大家一起学习: %% 尝试灰度变换--伽马变换和对数变换.直方图均衡化clc,clear,close allf = imread('C:\ ...

  6. 图像增强算法汇总(直方图均衡化、拉普拉斯、Log变换、gamma伽马变换)附MATLAB代码

    一.图像增强算法介绍 图像增强算法常见于对图像的亮度.对比度.饱和度.色调等进行调节,增加其清晰度,减少噪点等.图像增强往往经过多个算法的组合,完成上述功能,比如图像去燥等同于低通滤波器,增加清晰度则 ...

  7. 图像增强算法(直方图均衡化、拉普拉斯、Log、伽马变换)

    一.图像增强算法原理 图像增强算法常见于对图像的亮度.对比度.饱和度.色调等进行调节,增加其清晰度,减少噪点等.图像增强往往经过多个算法的组合,完成上述功能,比如图像去燥等同于低通滤波器,增加清晰度则 ...

  8. 【OpenCV 例程200篇】44. 图像的灰度变换(伽马变换)

    [OpenCV 例程200篇]44. 图像的灰度变换(伽马变换) 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 线性 ...

  9. python 视频 灰度 伽玛_Python 图像处理实战 | 图像的灰度非线性变换之对数变换、伽马变换...

    作者 | 杨秀璋 来源 | CSDN博客 责编 | 夕颜 头图 | 付费下载自视觉中国 出品 | CSDN(ID:CSDNnews) 本篇文章主要讲解非线性变换,使用自定义方法对图像进行灰度化处理,包 ...

最新文章

  1. 动态标题_动态打印区域和打印标题
  2. java一个点围着另一个点转_Java:按指定的度数值旋转另一个
  3. python中get和set使用_Python中的__get__与__set__
  4. python 获取中文文件名的输出
  5. 写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的消息。
  6. c语言tmplink,为了便于阅读,偿试把BLHeli的汇编源程序改成C语言格式
  7. ae多线程渲染工具:BG Renderer MAX for Mac(AE插件)
  8. 工作流添加跟踪后,实例一启动就会自动关闭
  9. 快来被子里 看看我的夜光收钱码!
  10. 一个堆排我竟弄了 4 个动画
  11. 如何使用fiddler工具抓包?
  12. 【物联网控制技术复习】【复数的概念】【拉普拉斯变换】
  13. 网络流之dinic算法
  14. Java单例模式简单代码
  15. 数字电路设计: FPGA实现倍频
  16. bzoj 4484 [Jsoi2015]最小表示——bitset
  17. 阿里云安全组是什么?如何配置安全组(图文教程)?
  18. 【图像增强】基于matlab Frangi滤波器血管图像增强【含Matlab源码 2108期】
  19. 宇视科技POE摄像机供电方式
  20. 阿里智能运维实践|阿里巴巴DevOps实践指南

热门文章

  1. php查询ip归属地api接口_php调用新浪接口查询ip获取地理位置(ip归属地查询)
  2. XSS注入的原理与实现
  3. creator DrawCall 优化
  4. Golang 语言的排序、结构体排序
  5. Python 回调函数的简单实例
  6. 2023计算机毕业设计SSM最新选题之javajava二手书交易系统1rn8a
  7. 使用alibaba的easyexcel填充复杂模板,导出Excel,返回文件流
  8. 解决C语言下enumerator重复声明的问题
  9. Ruby Enumerator的各种迭代
  10. 第5课 布尔表达式