Python3+OpenCV(六):基于直方图处理的图像增强


    • 1、绘制直方图
      • (1) Matplotlib绘制直方图
      • (2) OpenCV绘制直方图
    • 2、直方图均衡化
      • (1) 灰度图像直方图均衡化
      • (2) 彩色图像直方图均衡化


灰度直方图是图像的一种统计表达,反映了该图中不同灰度级出现的统计概率。设图像具有L个灰度级,图像中的像素点的个数为n,它的第k个灰度级nk出现的次数为
在这里插入图片描述
出现概率为
在这里插入图片描述

1、绘制直方图

(1) Matplotlib绘制直方图

matplotlib.pyplot.hist(
x, bins=10, range=None, normed=False, 
weights=None, cumulative=False, bottom=None, 
histtype=u'bar', align=u'mid', orientation=u'vertical', 
rwidth=None, log=False, color=None, label=None, stacked=False, 
hold=None, **kwargs)

作用:绘制直方图
常用参数说明
x:数据集
bins:条形数
color:条状图的颜色(“r”,“g”,“y”,“c”)
density:是否以密度的形式显示
range:x轴的范围
bottom:y轴的起始位置
histtype:直方图的类型(“bar”:方形,“barstacked”:柱形,“step”:“未填充线条”,“stepfilled”:“填充线条”)
align:对齐方式(“left”:左,“mid”:中间,“right”:右)
orientation:直方图的方向(“horizontal”:水平,“vertical”:垂直)
log:单位是否以科学计术法

numpy.ravel(a, order)
# ravel()

作用:将多维数组降为一维数组
a:要进行改变形状的数组
order:order参数可以是C_contiguous或F_contiguous,其中C order对数组进行行上涨,而F order对列进行操作

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

# 绘制直方图-Matplotlib
img = cv2.imread("D:/Study/digital image processing/test/Lena.bmp",0)
cv2.imshow("img",img)

# ravel()函数将多维数组降为一维数组
# img.ravel() 数据集x
plt.hist(img.ravel(),256,[0,256])
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

Python3+OpenCV(六):基于直方图处理的图像增强_第1张图片

(2) OpenCV绘制直方图

calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None)

作用:计算每个像素块在图像中的数量
常用参数说明
images:必须用括号括起来表示,即[image]
chanels:用于计算直方图的通道,使用灰度图计算直方图,所以就直接使用第一个通道;对于彩色可以通过[0],[1],[2]分别计算蓝色、绿色或红色通道的直方图
mask:如果计算完整图像的直方图,它将设为None。但是如果想找到图像特定区域的直方图,则必须为它创建一个蒙版图像作为蒙版。
histSize:表示这个直方图分成多少份(即多少个直方柱)。对于满量程,设置为[256]
ranges:表示直方图中各个像素的值,通常设为[0,256]

img = cv2.imread("D:/Study/digital image processing/test/LenaRGB.bmp",1)
cv2.imshow("img",img)

histB = cv2.calcHist([img],[0],None,[256],[0,256])
histG = cv2.calcHist([img],[1],None,[256],[0,256])
histR = cv2.calcHist([img],[2],None,[256],[0,256])

plt.plot(histB,color='b')
plt.plot(histG,color='g')
plt.plot(histR,color='r')
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

Python3+OpenCV(六):基于直方图处理的图像增强_第2张图片

2、直方图均衡化

直方图均衡化是将原始图像的直方图变换为均匀分布的形式,从而增加图像灰度的动态范围,达到增强图像对比度的效果。经过均衡化处理的图像,其灰度级出现的概率相同,此时图像的熵最大,图像所包含的信息量最大。

(1) 灰度图像直方图均衡化

equalizeHist(src, dst)

作用:直方图均衡化,用于提高图像的质量
src:源图像
dst:直方图均衡化后的图像

# 灰度图像直方图均衡化
img = cv2.imread("D:/Study/digital image processing/biaozhun/aerial.bmp",0)
cv2.imshow("img",img)
plt.hist(img.ravel(),256,[0,256])
# plt.show()

dst = cv2.equalizeHist(img)
cv2.imshow("dst",dst)
plt.hist(dst.ravel(),256,[0,256])
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

Python3+OpenCV(六):基于直方图处理的图像增强_第3张图片
Python3+OpenCV(六):基于直方图处理的图像增强_第4张图片

蓝色部分为源图像的直方图,可以看到像素级分布比较集中;橙色部分为直方图均衡化后的直方图,像素级的分布范围比较广。从两幅图像来看,进行均衡化后,图像对比度得到改善。

(2) 彩色图像直方图均衡化

对于函数 equalizeHist(src, dst) 输入图像必须是 8 位的单通道图像,返回图像也是一个 8 位的单通道图像,对于彩色图像必须逐一通道处理。

# 彩色图像直方图均衡化
img = cv2.imread("D:/Study/digital image processing/biaozhun/goldhill.bmp",1)
cv2.imshow("img",img)
plt.hist(img.ravel(),256,[0,256])
# plt.show()

# 彩色图像均衡化,需要分解通道并对每一个通道均衡化
(b,g,r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
res = cv2.merge((bH,gH,rH))
cv2.imshow("dst",res)
plt.hist(res.ravel(),256,[0,256])
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

Python3+OpenCV(六):基于直方图处理的图像增强_第5张图片

对RGB 图像中的每个通道的图像单独应用直方图均衡不太可能给出美观的效果。一种可能比较好的方法是,将图像转换到 LAB 颜色空间,然后再将直方图均衡应用于亮度通道。
Python3+OpenCV(六):基于直方图处理的图像增强_第6张图片

参考博客
https://geekdigging.blog.csdn.net/article/details/107755924
https://www.cnblogs.com/zyg123/p/10504645.html

你可能感兴趣的:(OpenCV,opencv,python)