Python-图像处理-09-图像直方图

首先需要导入第三方的库:

打开cmd界面输入:

pip install matplotlib

等待安装即可

#图像直方图(histogram)
import cv2 as cv
from matplotlib import pyplot as plt
def plot_demo(image):
    plt.hist(image.ravel(),256,[0,256])
    plt.show("直方图")

def image_hist(image):
    color =('blue','green','red')
    for i,color in enumerate(color):
        hist =cv.calcHist([image],[i], None ,[256],[0,256])
        plt.plot(hist,color=color)
        plt.xlim([0,256])
    plt.show()
src =cv.imread("C:\\Users\\william\\Pictures\\go.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
image_hist(src)
cv.waitKey(0)
cv.destroyAllWindows()

hist()

参数非常多,但常用的就这五个,只有第一个是必须的,后面四个可选

arr: 需要计算直方图的一维数组

bins: 直方图的柱数,可选项,默认为10

normed: 是否将得到的直方图向量归一化。默认为0

facecolor: 直方图颜色

alpha: 透明度

返回值 :

n: 直方图向量,是否归一化由参数设定

bins: 返回各个bin的区间范围

patches: 返回每个bin里面包含的数据,是一个list

这里提醒一点一般这个hist用于计算灰度图像,也就是一维的图像

这里调用了image.ravel是为了降维(numpy.flatten()也可以降维)

两者的本质都是想把多维的数组降为1维。区别在于numpy.flatten()返回一份拷贝,对数据更改时不会影响原来的数组,而numpy.ravel()则返回视图,对数据更改时会影响原来的数组。

.enumerate() 

用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据下标和数据,一般用在 for 循环当中。

cv2.calcHist()

原型为:calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist

images参数表示输入图像,传入时应该用中括号[ ]括起来

channels参数表示传入图像的通道,如果是灰度图像,那就不用说了,只有一个通道,值为0,如果是彩色图像(有3个通道),那么值为0,1,2,中选择一个,对应着BGR各个通道。这个值也得用[ ]传入。

mask参数表示掩膜图像。如果统计整幅图,那么为None。主要是如果要统计部分图的直方图,就得构造相应的掩膜来计算。

histSize参数表示灰度级的个数,需要中括号,比如[256]

ranges参数表示像素值的范围,通常[0,256]。此外,假如channels为[0,1],ranges为[0,256,0,180],则代表0通道范围是0-256,1通道范围0-180。

plt.plot()

(x,y,format_string,**kwargs) 
x轴数据,y轴数据,format_string控制曲线的格式字串 format_string 由颜色字符,风格字符,和标记字符 

plt.xlim()

设置坐标的上下限

猜你喜欢

转载自blog.csdn.net/weixin_41445387/article/details/86707584