写点什么

图像增强及运算:局部直方图均衡化和自动色彩均衡化处理

  • 2023-01-17
    中国香港
  • 本文字数:3376 字

    阅读完需:约 11 分钟

图像增强及运算:局部直方图均衡化和自动色彩均衡化处理

本文分享自华为云社区《[Python从零到壹] 五十四.图像增强及运算篇之局部直方图均衡化和自动色彩均衡化处理》,作者: eastmount。

一.局部直方图均衡化


前文通过调用 OpenCV 中 equalizeHist()函数实现直方图均衡化处理,该方法简单高效,但其实它是一种全局意义上的均衡化处理,很多时候这种操作不是很好,会把某些不该调整的部分给均衡处理了。同时,图像中不同的区域灰度分布相差甚远,对它们使用同一种变换常常产生不理想的效果,实际应用中,常常需要增强图像的某些局部区域的细节。


为了解决这类问题,Pizer 等提出了局部直方图均衡化的方法(AHE),但 AHE 方法仅仅考虑了局部区域的像素,忽略了图像其他区域的像素,且对于图像中相似区域具有过度放大噪声的缺点。为此 K. Zuiderveld 等人提出了对比度受限 CLAHE 的图像增强方法,通过限制局部直方图的高度来限制局部对比度的增强幅度,从而限制噪声的放大及局部对比度的过增强,该方法常用于图像增强,也可以被用来进行图像去雾操作[1-2]。


在 OpenCV 中,调用函数 createCLAHE()实现对比度受限的局部直方图均衡化。它将整个图像分成许多小块(比如按 10×10 作为一个小块),那么对每个小块进行均衡化。这种方法主要对于图像直方图不是那么单一的(比如存在多峰情况)图像比较实用。其函数原型如下所示:


retval = createCLAHE([, clipLimit[, tileGridSize]])


  • clipLimit 参数表示对比度的大小

  • tileGridSize 参数表示每次处理块的大小


调用 createCLAHE()实现对比度受限的局部直方图均衡化的代码如下:


# -*- coding: utf-8 -*-# By:Eastmountimport cv2  import numpy as np  import matplotlib.pyplot as plt #读取图片img = cv2.imread('lena.bmp')
#灰度转换gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #局部直方图均衡化处理clahe = cv2.createCLAHE(clipLimit=2, tileGridSize=(10,10))
#将灰度图像和局部直方图相关联, 把直方图均衡化应用到灰度图 result = clahe.apply(gray)
#显示图像plt.subplot(221)plt.imshow(gray, cmap=plt.cm.gray), plt.axis("off"), plt.title('(a)') plt.subplot(222)plt.imshow(result, cmap=plt.cm.gray), plt.axis("off"), plt.title('(b)') plt.subplot(223)plt.hist(img.ravel(), 256), plt.title('(c)') plt.subplot(224)plt.hist(result.ravel(), 256), plt.title('(d)') plt.show()
复制代码


输出结果如图 1 所示,图 1(a)为原始图像,对应的直方图为图 1©,图 1(b)和图 1(d)为对比度受限的局部直方图均衡化处理后的图像及对应直方图,它让图像的灰度值分布更加均衡。可以看到,相对于全局的直方图均衡化,这个局部的均衡化似乎得到的效果更自然一点。


二.自动色彩均衡化


Retinex 算法是代表性的图像增强算法,它根据人的视网膜和大脑皮层模拟对物体颜色的波长光线反射能力而形成,对复杂环境下的一维条码具有一定范围内的动态压缩,对图像边缘有着一定自适应的增强。自动色彩均衡(Automatic Color Enhancement,ACE)算法是在 Retinex 算法的理论上提出的,它通过计算图像目标像素点和周围像素点的明暗程度及其关系来对最终的像素值进行校正,实现图像的对比度调整,产生类似人体视网膜的色彩恒常性和亮度恒常性的均衡,具有很好的图像增强效果[3-4]。


ACE 算法包括两个步骤,一是对图像进行色彩和空域调整,完成图像的色差校正,得到空域重构图像;二是对校正后的图像进行动态扩展。ACE 算法计算公式如下:



其中,W 是权重参数,离中心点像素越远的 W 值越小;g 是相对对比度调节参数,其计算方法如公式(22-2)所示,a 表示控制参数,值越大细节增强越明显。



图 2 是条形码图像进行 ACE 图像增强后的效果图,通过图像增强后的图(b)对比度更强,改善了原图像的明暗程度,增强的同时保持了图像的真实性。



由于 OpenCV 中暂时没有 ACE 算法包,下面的代码是借鉴“zmshy2128”老师的文章,修改实现的彩色直方图均衡化处理[5]。


# -*- coding: utf-8 -*-# By:Eastmount# 参考zmshy2128老师文章import cv2import numpy as npimport mathimport matplotlib.pyplot as plt
#线性拉伸处理#去掉最大最小0.5%的像素值 线性拉伸至[0,1]def stretchImage(data, s=0.005, bins = 2000): ht = np.histogram(data, bins); d = np.cumsum(ht[0])/float(data.size) lmin = 0; lmax=bins-1 while lmin<bins: if d[lmin]>=s: break lmin+=1 while lmax>=0: if d[lmax]<=1-s: break lmax-=1 return np.clip((data-ht[1][lmin])/(ht[1][lmax]-ht[1][lmin]), 0,1)
#根据半径计算权重参数矩阵g_para = {}def getPara(radius = 5): global g_para m = g_para.get(radius, None) if m is not None: return m size = radius*2+1 m = np.zeros((size, size)) for h in range(-radius, radius+1): for w in range(-radius, radius+1): if h==0 and w==0: continue m[radius+h, radius+w] = 1.0/math.sqrt(h**2+w**2) m /= m.sum() g_para[radius] = m return m
#常规的ACE实现def zmIce(I, ratio=4, radius=300): para = getPara(radius) height,width = I.shape #Python3报错如下 使用列表append修改 zh = [] zw = [] n = 0 while n < radius: zh.append(0) zw.append(0) n += 1 for n in range(height): zh.append(n) for n in range(width): zw.append(n) n = 0 while n < radius: zh.append(height-1) zw.append(width-1) n += 1 #print(zh) #print(zw) Z = I[np.ix_(zh, zw)] res = np.zeros(I.shape) for h in range(radius*2+1): for w in range(radius*2+1): if para[h][w] == 0: continue res += (para[h][w] * np.clip((I-Z[h:h+height, w:w+width])*ratio, -1, 1)) return res
#单通道ACE快速增强实现def zmIceFast(I, ratio, radius): print(I) height, width = I.shape[:2] if min(height, width) <=2: return np.zeros(I.shape)+0.5 Rs = cv2.resize(I, (int((width+1)/2), int((height+1)/2))) Rf = zmIceFast(Rs, ratio, radius) #递归调用 Rf = cv2.resize(Rf, (width, height)) Rs = cv2.resize(Rs, (width, height)) return Rf+zmIce(I,ratio, radius)-zmIce(Rs,ratio,radius)
#rgb三通道分别增强 ratio是对比度增强因子 radius是卷积模板半径 def zmIceColor(I, ratio=4, radius=3): res = np.zeros(I.shape) for k in range(3): res[:,:,k] = stretchImage(zmIceFast(I[:,:,k], ratio, radius)) return res
#主函数if __name__ == '__main__': img = cv2.imread('test01.png') res = zmIceColor(img/255.0)*255 cv2.imwrite('Ice.jpg', res)
复制代码


运行结果如图 3 和图 4 所示,ACE 算法能有效进行图像去雾处理,实现图像的细节增强。


三.总结


本文主要讲解图像局部直方图均衡化和自动色彩均衡化处理。这些算法可以广泛应用于图像增强、图像去噪、图像去雾等领域。


参考文献:


  • [1]王浩,张叶,沈宏海,张景忠.图像增强算法综述[J].中国光学,2017,10(04):438-448.

  • [2]李艳梅. 图像增强的相关技术及应用研究[D].电子科技大学,2013.

  • [3]S. Bidon, Olivier Besson, J. Y. Tourneret. The Adaptive Coherence Estimator is the Generalized Likelihood Ratio Test for a Class of Heterogeneous Environments[J]. IEEE Signal Processing Letters, 2008, 15: 281-284.

  • [4]eastmount. [Python 图像处理] 三十八.OpenCV 图像增强和图像去雾万字详解(直方图均衡化、局部直方图均衡化、自动色彩均衡化)[EB/OL]. (2021-03-12). https://blog.csdn.net/ Eastmount/article/details/114706950.

  • [5]zmshy2128. 自动色彩均衡(ACE)快速算法[EB/OL]. (2016-12-05). https://www.cnblogs.com/zmshy2128/p/6135551.html.


点击关注,第一时间了解华为云新鲜技术~

发布于: 2023-01-17阅读数: 10
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
图像增强及运算:局部直方图均衡化和自动色彩均衡化处理_Python_华为云开发者联盟_InfoQ写作社区