|
直方图均衡化
1 算法理论
均衡化的目的是将原来灰度值非均匀分布图像,通过灰度值变换,变成一幅灰度值均匀分布的图像。如下图,直方图均衡化的目标是找到下面的映射函数:
s=T(r)
其中:r, s分布为图像映射前后的灰度值(为了计算方便,这里s进行了归一化)。
图中浅蓝色分布为原图的灰度值分布图,p(r)为灰度值r对应的概率密度。根据概率分布理论,可以得到如下公式:
所以:
下面用一个实例进行直方图均衡化计算(参考:https://blog.csdn.net/qq_42593220/article/details/103227609),计算过程如下表:原图像的灰度值r_k分8级(0,1/7,2/7,3/7,4/7,5/7,6/7,1),n_k为对应的像素个数,Pr_k为灰度值分布概率,T(r_k)为灰度值映射,s_k’为映射后的灰度值向最近的灰度值等级靠近取值,s_k为映射后的灰度值等级(1/7,3/7,5/7,6/7,1),n_sk为每个等级的像素个数,P(s_k)为均衡后的灰度值概率分布。
下图为均衡化前后的直方图:
2 代码实验
2.1 python代码
from skimage import io,data,exposure
import matplotlib.pyplot as plt
img=data.moon()
plt.figure("hist",figsize=(8,8))
arr=img.flatten()
plt.subplot(231)
plt.imshow(img,plt.cm.gray)
plt.subplot(232)
plt.hist(arr, bins=256, density=True,edgecolor='None',facecolor='red')
plt.subplot(233)
plt.hist(arr,bins=256, density=True, cumulative=True, label='CDF', histtype='step')
img1=exposure.equalize_hist(img)
arr1=img1.flatten()
plt.subplot(234)
plt.imshow(img1,plt.cm.gray)
plt.subplot(235)
plt.hist(arr1*255, bins=256, density=True,edgecolor='None',facecolor='red')
plt.subplot(236)
plt.hist(arr1*255,bins=256, density=True, cumulative=True, label='CDF', histtype='step')
plt.show()
说明:
(1)图的上边分别为原图、灰度值概率分布和累计概率分布;
(1)图的上边分别为均衡化后的图像、灰度值概率分布和累计概率分布。
2.2 halcon代码
halcon自带实例:equ_histo_image.hdev
read_image (Vessel, 'vessel')
equ_histo_image(Vessel, ImageEquHisto)
说明:
(1)'vessel’代表halcon自带图像目录下的'vessel.png图像文件;
(2)左边为原图(上)和灰度直方图(下);
(3)右边为均衡化后的图像(上)和灰度直方图(下)。
注:本博客为本人讲授《机器人视觉识别技术》教案整理,使用教程为:《机器视觉算法与应用》,作者:[德]Carten Steger等,清华大学出版社,2019年第2版,ISBN 978-7-302-51905-8。实验软件如下:
(1)德国MVTec公司软件halcon 20.11.1.0,下载官网:https://www.mvtec.com/cn/products/halcon/free-halcon-trial,每月evaluation licenses下载地址:https://blog.csdn.net/qq_18620653/article/details/120033443。
(2)python环境和核心库:anaconda + pycharm,python:3.8.16,opencv-python:4.7.0.72
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-11-1 09:27
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社