直方图均衡化
在图像处理中,经常用到直方图,如颜色直方图、灰度直方图等。 图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。 图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:其中,横 坐标是灰度级,纵坐标是该灰度级出现的频率。
目录
一、直方图
- 直方图反映了图像中像素的灰度分布规律。它描述每个灰度级具有的像素个数,但不包含这些像素在图像中的位置信息。
- 图像直方图不关心像素所处的空间位置,因此不受图 像旋转和平移变化的影响,可以作为图像的特征。
- 任何一幅特定的图像都有唯一的直方图与之对应,但不同的图像可以有相同的直方图。
- 如果一幅图像有两个不相连的区域组成,并且每个区域的直方图已知,则整幅图像的 直方图是该两个区域的直方图之和。
二、直方图均衡化
直方图均衡化是将原图像的直方图通过变换函数变为均匀的直方图,然后按均匀直方图修改原 图像,从而获得一幅灰度分布均匀的新图像。直方图均衡化就是用一定的算法使直方图大致平 和的方法直方图均衡化的作用是图像增强。
1.灰度直方图的均衡化
使用自带的函数接口求取灰度图像的直方图
- 灰度直方图的求解
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 获取灰度图像
img = cv2.imread("lena.png", 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("image_gray", gray)
# 灰度图像的直方图
plt.figure()
plt.hist(gray.ravel(), 256)
plt.show()
# 灰度图直方图均衡化
result_gray = cv2.equalizeHist(gray)
2.彩色图像直方图均衡化的效果
# 绘制三通道彩色图像的直方图
image = cv2.imread("lena.png")
cv2.imshow("lena", image)
chans = cv2.split(image)
colors = ("b", "g", "r")
plt.figure()
plt.title("RGB Histogram")
plt.xlabel("Bins")
plt.ylabel("Pixels")
for (chan, color) in zip(chans, colors):
hist = cv2.calcHist([chan],[0],None,[256],[0,256])
plt.plot(hist, color=color)
plt.xlim([0, 256])
plt.show()
# 彩色图像直方图的均衡化
import cv2
image = cv2.imread("lena.png")
chans = cv2.split(image)
bh = cv2.equalizeHist(chans[0])
gh = cv2.equalizeHist(chans[1])
rh = cv2.equalizeHist(chans[2])
result = cv2.merge((bh, gh, rh))