1,什么是直方图?
图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(BIN)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。该图像的直方图可以使用hist()函数绘制。
2,什么是直方图均衡化?
直方图均衡化是将一幅图像的灰度直方图变平,使变平后的图像中每个灰度值的分布概率都相同。直方图均衡化可以用来对图像灰度值进行归一化处理,并且可以增强图像的对比度。
3,直方图及其均衡化实现及其效果
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from PCV.tools import imtools #abc
image = Image.open("2.jpg").convert("L")#转化为灰度图像
image_array = np.array(image)
plt.subplot(2,2,1)
plt.hist(image_array.flatten(),256)#将数组转化为一维数组
plt.subplot(2,2,2)
plt.imshow(image,cmap=cm.gray)
plt.axis("off")
a = imtools.histeq(image_array) # 利用刚定义的直方图均衡化函数对图像进行均衡化处理
plt.subplot(2,2,3)
plt.hist(a[0].flatten(),256)
plt.subplot(2,2,4)
plt.imshow(Image.fromarray(a[0]),cmap=cm.gray)
plt.axis("off")
plt.show()
4,遇到的问题
(1)由于hist()只接受一维数组作为输入,所以在绘制图像直方图之前,必须先对图像进行压平处理。fatten()方法可以将任意数组按照行优先准则转成一维数组。
(2)出现pycharm Unresolved reference 'xxx' 问题;这是由于python库里没有这个文件因此我用Anaconda 安装了第三方库,安装路径为pcv文件路径。
pip install C:\Users\pcv-book-code-master\PCV
(3)出现NameError: name 'imtool' is not defined 问题,原因:在import时把名字写错了
(4)DeprecationWarning 类型错误,原因:我用的python版本是3.7版本的与PCV库中python的版本为2.7的不同
PCV:
imhist,bins=histogram(im.flatten(),nbr_bins,normed=True)
更改后:
hist,bin=np.histogram(im.flatten(),256,[0,256])