跟我学Python丨图像增强及运算:局部直方图均衡化和自动色彩均衡化处理
摘要:本文主要讲解图像局部直方图均衡化和自动色彩均衡化处理。这些算法可以广泛应用于图像增强、图像去噪、图像去雾等领域。
本文分享自华为云社区《[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:Eastmount import 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()