对于图像处理,直方图均衡是一种很常用的图像增强技术,可以将一幅图像中灰度较低的区域和灰度较高的区域之间的灰度值差异增强,达到提高图像对比度的目的。Python中也有相关库函数可以实现直方图均衡,这篇文章将从多个方面对其进行详细讲解。
一、简介
直方图是描述图像灰度级分布的函数,表示图像中各个强度级所具有的像素数目。一般来说,我们可以通过直方图了解图像的亮度分布情况。直方图均衡化是一种增强图像对比度的方法,通过对直方图进行变换来实现,使得分布在低灰度区域的像素值均匀分布在整个灰度级范围内,从而提高图像的对比度。
Python中,通过PIL库中的ImageOps模块可以直接调用已经封装好的直方图均衡函数equalize()实现图像的直方图均衡化。
from PIL import Image, ImageOps
image = Image.open("example.jpg")
image_enhanced = ImageOps.equalize(image)
二、实现过程
在实现直方图均衡过程中,需要分别进行如下三个步骤:
1.计算直方图
计算图像的灰度级分布情况,即直方图。可以利用Python中的numpy和matplotlib库来实现计算和绘制直方图。
import numpy as np
import matplotlib.pyplot as plt
image = plt.imread("example.jpg")
hist, bins = np.histogram(image.flatten(), 256, [0,255])
plt.plot(hist)
plt.show()
2.计算累计概率分布函数
根据计算出来的直方图,计算出累计概率分布函数(CDF),即各个灰度级所占比例的累积分布情况。
cdf = hist.cumsum()
cdf_normalized = cdf / cdf.max()
plt.plot(cdf_normalized)
plt.show()
3.计算映射表
根据累计概率分布函数,计算出映射表,即原图像中每个像素值对应的新像素值。
cdf_m = np.ma.masked_equal(cdf,0)
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
cdf = np.ma.filled(cdf_m,0).astype('uint8')
image_enhanced = np.interp(image, bins[:-1], cdf)
三、示例代码
预处理,包括读取及灰度转换
from PIL import Image
import numpy as np
image = Image.open("example.jpg")
image = image.convert("L")
计算直方图
import matplotlib.pyplot as plt
hist, bins = np.histogram(image.flatten(), 256, [0,255])
plt.plot(hist)
plt.show()
计算累计概率分布函数
cdf = hist.cumsum()
cdf_normalized = cdf / cdf.max()
plt.plot(cdf_normalized)
plt.show()
计算映射表
cdf_m = np.ma.masked_equal(cdf,0)
cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())
cdf = np.ma.filled(cdf_m,0).astype('uint8')
image_enhanced = np.interp(image, bins[:-1], cdf)
使用PIL库进行直方图均衡
from PIL import ImageOps
image_enhanced_pil = ImageOps.equalize(image)
image_enhanced_pil.show()
四、应用场景
直方图均衡是提高图像对比度的一种有效方法,可用于各种图像处理领域中,如计算机视觉、图像识别等。
在特定应用场景中,如军事侦察、安保等,对于图像的清晰度要求很高,直方图均衡技术可以提高图像的对比度、增强细节信息,有利于图像的分析和处理。
五、总结
直方图均衡是一种常用的图像增强技术,Python中也有相关库函数可以实现图像的直方图均衡。通过计算直方图、累计概率分布函数和映射表,可以实现对图像的直方图均衡,从而增强图像对比度、提高细节信息的清晰度。
原创文章,作者:PGEWJ,如若转载,请注明出处:https://www.506064.com/n/375581.html