直方图均衡化
直方图均衡化是将原图像的直方图通过变换函数变为均匀的直方图,然后按均匀直方图修改原图像,从而获得一幅灰度分布均匀的新图像。直方图均衡化就是用一定的算法使直方图大致平 和的方法
直方图均衡化的作用是图像增强(大概实现效果如下,实际上不会这么平整)
代码展示(包含不同方式展示直方图):
# -*- coding:utf-8 -*-
"""
@author: 绯雨千叶
equalizeHist—直方图均衡化
函数原型: equalizeHist(src, dst=None)
src:图像矩阵(单通道图像)
dst:默认即可
"""
import cv2
import numpy as np
from matplotlib import pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure()
img = cv2.imread("../img/lrn.jpg")
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 获取灰度图像
img2 = cv2.equalizeHist(img1) # 灰度图像直方图均衡化
plt.subplot(221) # 灰度图像均衡化后的直方图,方法一
plt.title("方法一均衡化")
hist = cv2.calcHist([img2], [0], None, [256], [0, 256]) # 计算直方图
plt.plot(hist)
plt.subplot(222) # 灰度图像均衡化后的直方图,方法二
plt.title("方法二均衡化")
plt.hist(img2.ravel(), 256)
plt.subplot(223) # 灰度图像原图
plt.title("方法一原图")
hist = cv2.calcHist([img1], [0], None, [256], [0, 256]) # 计算直方图
plt.plot(hist)
plt.subplot(224)
plt.title("方法二原图")
plt.hist(img1.ravel(), 256)
cv2.imshow("Gray histogram equalization", np.hstack([img1, img2])) # np.hstack将参数元组的元素数组按水平方向进行叠加
# 彩色图像均衡化,需要分解通道
(b, g, r) = cv2.split(img) # 分离出图片的B,R,G颜色通道
bH = cv2.equalizeHist(b) # 对每一个通道均衡化
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
img3 = cv2.merge((bH, gH, rH))
cv2.imshow("Color histogram equalization", np.hstack([img,img3]))
plt.show()
cv2.waitKey(0)
效果展示: