创客出手

目录

OpenCV Python 灰度和色彩图片的均衡化直方图(equalizeHist)

本示例使用的OpenCV版本是:OpenCV 4.1.1
运行Python的编辑器:Jupyter notebook 6.0.0

实现目的

均衡化图片为的是归一化图像亮度和增强图像对比度,在本示例我们会使用 cv2.equalizeHist 函数进行处理灰度图像和彩色图像,然后再展示均衡化后的直方图,看其形状。

file

实现代码

1,加载所需要的库

import cv2
import numpy as np
import matplotlib.pyplot as plt

2,以灰度模式读取图片并显示原图

# 以灰度模式读取图片
img_gray = cv2.imread('dog.png',0)
# 显示原始图片
plt.imshow(img_gray,cmap='gray')

file

3,均衡化图像

由于灰度图像只有一个通道,所以可以直接使用 cv2.equalizeHist

# 使用 <code>cv2.equalizeHist</code> 函数进行归一化图像亮度和增强图像对比度
img_gray = cv2.equalizeHist(img_gray)

4,显示图像

plt.imshow(img_gray,cmap='gray')

可以看出以下图像的对比度明显增强了。

file

5,计算并显示直方图

hist, bins = np.histogram(img_gray, 256, [0, 255])
plt.fill_between(range(256), hist, 0)
plt.xlabel('pixel value')
plt.show()

看直方图的形状均以一个较平均的过度分布

file

6,以彩色模式读取并显示图片

img_color = cv2.imread('dog.png')
# OpenCV读取的图片模式是BGR,所以如果要使用plt显示图片颜色正常就需要转换成RGB色彩空间
img_color = cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)
# 显示图片
plt.imshow(img_color)

7,均衡化RGB三个通道

彩色图片有别与灰度图的区别是有三个通道,我把三个通道分别都均衡化了,小伙伴们可以试试只均衡一个或两个通道看看效果如何

# 0 -> R -> red 红色通道均衡化
img_color[...,0] = cv2.equalizeHist(img_color[..., 0])
# 1 -> G -> green 绿色通道均衡化
img_color[...,1] = cv2.equalizeHist(img_color[..., 1])
# 2 -> B -> blue 蓝色通道均衡化
img_color[...,2] = cv2.equalizeHist(img_color[..., 2])

8,显示均衡化后的图片

plt.imshow(img_color)

file

9,计算衡化后的图片的图片的直方图

hist, bins = np.histogram(img_color, 256, [0, 255])

10,显示直方图

plt.fill_between(range(256), hist, 0)
plt.xlabel('pixel value')
plt.show()

file

程序说明

我们演示了如何使用cv.equalizeHist 对灰度图进行均衡化,该函数只接受单通道图像,在彩色图像中我分离了RGB色彩的三个通道,分别均衡,也许会比较麻烦。小伙伴也可以尝试使用HVS色彩空间模式(HSV即色相、饱和度、明度(英语:Hue, Saturation, Value))的均衡化,HVS只需要改变一个明度通道就能全彩应用,是非常方便的,记得最后转回RGB色彩模式。

cv.equalizeHist 的详细用法请参考:
https://docs.opencv.org/4.1.1/d6/dc7/group__imgproc__hist.html#ga7e54091f0c937d49bf84152a16f76d6e

更多关于 的文章
关注创客出手公众号

关注创客出手