数字图像处理(17): 直方图均衡化处理

您所在的位置:网站首页 灰度直方图envi 数字图像处理(17): 直方图均衡化处理

数字图像处理(17): 直方图均衡化处理

2023-11-11 09:47| 来源: 网络整理| 查看: 265

目录

1 直方图均衡化简介

1.1 直方图均衡化概念

1.2 直方图均衡化的理论基础

1.3 直方图均衡化的步骤

1.4 直方图均衡化应用场景

2 直方图均衡化-equalizeHist()

3 matplotlib.pyplot.subplot() 函数

4 matplotlib.pyplot.imshow() 函数

5 直方图均衡化对比

参考资料

 

1 直方图均衡化简介 1.1 直方图均衡化概念

直方图均衡化 (Histogram Equalization) 就是把一个已知灰度概率密度分布的图像经过一种变换,使之演变为一幅具有均匀灰度概率密度分布的新图像。

如下图所示,过暗和过亮的图像 经过直方图均衡化,使得图像变得清晰。

 

1.2 直方图均衡化的理论基础

前提:如果一幅图像占有全部可能的灰度级,并且均匀分布。

结论:该图像具有高对比度和多变的灰色色调。

外观:图像细节丰富,质量更高。

 

1.3 直方图均衡化的步骤

(1)计算累计直方图;

(2)将累计直方图进行区间转换;

(3)在累计直方图中,概率相近的原始值,会被处理为相同的值。

 

具体的例子如下:

如下图所示,已知一幅图像的像素分布为 7\times7,根据像素值,则可以计算出统计直方图

 

根据统计直方图,可以算出归一化直方图和累计直方图,如下图所示:

 

将累计直方图进行区间转换,如下图所示:

 

由上图的结果可知,原先8个灰度级转变成6个灰度级,那么原始直方图和均衡直方图为:

 

上面的灰度级是8,那灰度级转变成256,计算方法类似,如下图所示:

 

同样的,原始直方图和均衡直方图为:

 

由上图可以看出,虽然二者相似,但右侧均衡化后的直方图分布更均匀,相邻像素级概率和与高概率近似相等。如果将两张图的灰度级放在同一区间,可以看出差别更大,如下图所示:

 

1.4 直方图均衡化应用场景

(1)医学图像处理

(2)车牌照识别

(3)人脸识别

 

2 直方图均衡化-equalizeHist()

OpenCV库下,直方图均衡化使用  equalizeHist() 函数,函数用法如下所示:

dst=cv2.equalizeHist(src)

其中,参数:

dst 表示处理结果

src 表示原始图像

 

代码如下所示:

#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('zxp.jpg', cv2.IMREAD_GRAYSCALE) equ = cv2.equalizeHist(img) cv2.imshow("src", img) cv2.imshow("result", equ) plt.hist(img.ravel(), 256) plt.figure() plt.hist(equ.ravel(), 256) plt.show() cv2.waitKey(0) cv2.destroyAllWindows()

 

运行结果如下图所示:(左图为原始灰度图像,右图为均衡化后的图像)

 

3 matplotlib.pyplot.subplot() 函数

matplotlib.pyplot.subplot() 函数可以将多张图像放在一个窗口内,Pyhton下需要导入 matplotlib.pyplot 绘图包,其用法和Matlab中的subplot()函数用法类似。matplotlib 是一个强大的绘图包。subplot() 函数用法如下所示:

subplot(nrows, ncols, plot_number)

其中,参数:

nrows 表示行数;

ncols  表示列数;

plot_number 表示窗口序号。

例如:排列成两行三列的图像,如下图所示:

注:在实际应用中,如果每一个参数都小于10,三个数字可以连着直接写,不加标点,如 subplot(2,3,4) 可以写成 subplot(234)

 

代码如下所示:

#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('zxp.jpg', cv2.IMREAD_GRAYSCALE) equ = cv2.equalizeHist(img) plt.subplot(221),plt.imshow(img, 'gray'),plt.title('img'), plt.xticks([]),plt.yticks([]) plt.subplot(222),plt.imshow(equ, 'gray'),plt.title('equ'), plt.xticks([]),plt.yticks([]) plt.subplot(223),plt.hist(img.ravel(),256),plt.title('img_hist') plt.subplot(224),plt.hist(equ.ravel(),256),plt.title('equ_hist') plt.show() cv2.waitKey(0) cv2.destroyAllWindows()

 

运行结果如下图所示:

 

 

4 matplotlib.pyplot.imshow() 函数

imshow() 函数用法如下所示,同样的,Pyhton下需要导入 matplotlib.pyplot 绘图包。

imshow(X, cmap=None)

其中,参数:

X 表示要绘制的图像;

cmap 表示colormap,颜色图谱,默认为RGB(A)颜色空间:

    1)对于灰度图像,使用参数 “ cmap=plt.cm.gray ”;

    2)对于彩色图像,如果使用opencv读入的图像,默认空间为BRG,需要调整色彩空间为RGB。

 

下面是分别使用函数读取灰度图像和彩色图像例子。

(1)灰度图像

代码如下所示:

#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('zxp.jpg') img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) plt.subplot(221),plt.imshow(img),plt.title('img'), plt.axis('off') #坐标轴关闭 plt.subplot(222),plt.imshow(img, cmap=plt.cm.gray),plt.title('img_cmap'), plt.axis('off') plt.subplot(223),plt.imshow(img_gray),plt.title('img_gray'), plt.axis('off') plt.subplot(224),plt.imshow(img_gray, cmap=plt.cm.gray),plt.title('img_gray_cmap'),plt.axis('off')#正确用法 plt.show() cv2.waitKey(0) cv2.destroyAllWindows()

 

运行结果如下图所示:

 

 

(2)彩色图像

代码如下所示:

#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt img = cv2.imread('zxp.jpg') b,g,r=cv2.split(img) #通道分割 img_RGB=cv2.merge([r,g,b])#通道组合 plt.subplot(121),plt.imshow(img),plt.title('img_BGR'), plt.axis('off') #坐标轴关闭 plt.subplot(122),plt.imshow(img_RGB),plt.title('img_RGB'), plt.axis('off')

 

运行结果如下图所示:

 

 

5 直方图均衡化对比

直方图均衡化前后对比,使用前面提到的 matplotlib.pyplot.subplot() 函数 和 matplotlib.pyplot.imshow() 函数。

 

代码如下所示:

#encoding:utf-8 import cv2 import numpy as np import matplotlib.pyplot as plt img_gray = cv2.imread('zxp.jpg', cv2.IMREAD_GRAYSCALE) equ = cv2.equalizeHist(img_gray) plt.subplot(221),plt.imshow(img_gray, cmap=plt.cm.gray),plt.title('img_gray'), plt.axis('off') #坐标轴关闭 plt.subplot(222),plt.imshow(equ, cmap=plt.cm.gray),plt.title('equ'), plt.axis('off') #坐标轴关闭 plt.subplot(223),plt.hist(img_gray.ravel(),256),plt.title('img_gray_hist') plt.subplot(224),plt.hist(equ.ravel(),256),plt.title('equ_hist') plt.show() cv2.waitKey(0) cv2.destroyAllWindows()

 

运行结果如下图所示:

 

 

参考资料

[1] Python+OpenCV图像处理



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3