直方图统计增强方法
直方图统计增强方法的原理:
直方图统计增强是一种基于像素值分布的图像增强技术,通过调整像素值的分布来增强图像的对比度和细节。其原理是根据图像的直方图信息,将原始像素值映射到一个新的像素值域,从而改变图像的亮度和对比度。
直方图统计增强方法的意义:
这种方法的目的是改善图像的视觉效果,使得图像中的细节更加清晰可见,从而提高图像在视觉上的识别和分析能力。通过将图像的像素值重新分布,使得图像的动态范围更好地覆盖了整个像素值域,凸显了图像中的细节,增强了图像的信息内容。
适用场景:
直方图统计增强方法在以下场景中特别适用:
- 低对比度图像: 当图像的亮度范围分布不均匀,即图像的对比度较低时,直方图统计增强可以使得图像的像素值分布更加均匀,增强图像的对比度。
- 局部对比度调整: 有时候图像的一部分区域可能亮度较低,另一部分区域亮度较高。直方图统计增强可以通过针对不同区域使用不同的增强参数,实现局部对比度的调整。
- 图像细节增强: 当图像中的细节由于亮度过低或过高而不易分辨时,直方图统计增强可以突出这些细节,使得它们更加清晰可见。
公式:
直方图统计增强的基本公式如下:
给定一个原始图像
I
(
x
,
y
)
I(x, y)
I(x,y),其像素值为
i
i
i,进行直方图统计增强后的图像为
I
enhanced
(
x
,
y
)
I_{text{enhanced}}(x, y)
Ienhanced(x,y),其像素值为
i
′
i'
i′。增强函数可以表示为:
i
′
=
T
(
i
)
=
round
(
c
⋅
i
)
i' = T(i) = text{round}(c cdot i)
i′=T(i)=round(c⋅i)
其中,
c
c
c是增强常数,可以通过调整来控制增强的强度。一般情况下,
c
>
1
c > 1
c>1 用于增强亮度,
c
<
1
c < 1
c<1用于降低亮度。函数 ( text{round} ) 将结果四舍五入到最接近的整数,确保结果在合法的像素值范围内。
另外,为了避免像素值越界,通常还会使用截断操作将增强后的像素值 ( i’ ) 限制在图像像素值域的合法范围内(通常是 [0, 255]):
i
′
=
{
0
if
c
⋅
i
<
0
255
if
c
⋅
i
>
255
round
(
c
⋅
i
)
otherwise
i' = begin{cases} 0 & text{if } c cdot i < 0 \ 255 & text{if } c cdot i > 255 \ text{round}(c cdot i) & text{otherwise} end{cases}
i′=⎩
⎨
⎧0255round(c⋅i)if c⋅i<0if c⋅i>255otherwise
这样,直方图统计增强就可以通过调整增强常数
c
c
c 来改变图像的亮度和对比度,从而实现图像的增强,代码如下所示:
import cv2
import matplotlib.pyplot as plt
import numpy as np
def enhanceHistStat(image, const):
enhanced_image = np.clip(image * const, 0, 255).astype(np.uint8)
return enhanced_image
def enhance_Histstat(image):
# 读取图像
image = cv2.imread(image, flags=0)
if image is None:
print('Unable to load input_image!')
return
else:
# 计算比例因子
maxImg = image.max()
maxROI = image[12:120, 12:120].max()
const = maxImg / maxROI
# 调用增强函数
image_HSE = enhanceHistStat(image, const)
image_Equ=cv2.equalizeHist(image)
plt.figure(figsize=(10,6))
plt.subplot(131),plt.title("Original image"),plt.axis('off')
plt.imshow(image,cmap='gray',vmin=0,vmax=255)
plt.subplot(132),plt.title("Global equalize histogram"),plt.axis('off')
plt.imshow(image_Equ,cmap='gray',vmin=0,vmax=255)
plt.subplot(133),plt.title("Histogram statistic enhance"),plt.axis('off')
plt.imshow(image_HSE,cmap='gray',vmin=0,vmax=255)
plt.show()
imgfile1='./Images/cat.jpg'
enhance_Histstat(imgfile1)