1. 直方图:
直方图统计图像中各个灰度级出现的次数,横坐标为各个像素点的灰度级,纵坐标是具有该灰度级的像素个数。
上面这个九宫格我们可以想象成一张图像,里面的数字代表当前像素的灰度等级。
用图表显示:X轴代表灰度级,Y轴代表统计次数。
在实际处理中,X轴代表8位的256个灰度级[0-255],Y轴代表具有相应的灰度级的像素点的个数。
示例: 统计这个纯白色背景下的黑色8的图像的直方图
2. 绘制直方图:
模块matplotlib.pyplot 提供了一个类似 MATLAB 的绘图框架,其中hist()函数可以用来绘制直方图。
hist( X,BINS)
- X为数据源,必须是一维的,二维图像需要通过ravel()函数转换为一维数组之后传入hist()函数。
- BINS为灰度的分组情况,相当于前面的Y。
上代码:
import cv2
import matplotlib.pyplot as plt
o=cv2.imread("image\\8.bmp")
cv2.imshow("original",o)
# 显示直方图
plt.hist(o.ravel(),256) # 将o转换为一维数组,然后显示256个等级【0-255】
cv2.waitKey()
cv2.destroyAllWindows()
3. OpenCV中绘制直方图:
hist = cv2.calcHist( images, channels, mask, histSize, ranges, accumulate )
- hist返回一个一维数组,数组中是每个灰度等级的像素个数。
- images为原始图像,注意用[]括起来。
- channels为通道,单通道为[0],彩色通道分别用[0],[1],[2]表示B,G,R。
- mask为掩模,没有掩模的时候传None。
- histSize表示BINS子集,注意用[]括起来。
- ranges表示像素范围,比如单通道[0,255]。
- accumlate暂时为空。
上代码:
import cv2
import numpy as np
img=cv2.imread("image\\hist.png")
# 计算直方图
hist = cv2.calcHist([img],[0],None,[2],[0,256]) # 这里像素范围[0,255]只能返回0灰
# 度等级的像素数,至于原因求高手分析???
print(hist)
cv2.waitKey()
cv2.destroyAllWindows()
运行:
使用plot分通道提取直方图代码:
import cv2
import matplotlib.pyplot as plt
o=cv2.imread("image\\girl.bmp")
cv2.imshow("original",o)
histb = cv2.calcHist([o],[0],None,[256],[0,255]) # channels中[0][1][2]分别代表BGR通道
histg = cv2.calcHist([o],[1],None,[256],[0,255])
histr = cv2.calcHist([o],[2],None,[256],[0,255])
plt.plot(histb,color='b')
plt.plot(histg,color='g')
plt.plot(histr,color='r')
plt.show()
运行:
4. 掩模后绘制直方图:
与运算:
当M=1时:O AND M = 原图O
当N=0时:O AND M = 0(零)
构造一个掩模图像
import cv2
import numpy as np
mask=np.zeros([600,600],np.uint8) #构造一个像素为0的二维数组
mask[200:400,200:400]=255 # 将X200-X400、Y200-Y400之间的数组值改为255
cv2.imshow('mask',mask)
cv2.waitKey()
cv2.destroyAllWindows()
运行:
绘制一个掩模后的图像的直方图:
import cv2
import numpy as np
import matplotlib.pyplot as plt
image=cv2.imread("image\\girl.bmp",cv2.IMREAD_GRAYSCALE)
# 创建一个原图一个大小的二维数组,元素0黑色
mask=np.zeros(image.shape,np.uint8)
# 掩模,改变200-400区域为白色
mask[200:400,200:400]=255
# 将原图和掩模图进行与运算,黑色区域被消除
m=cv2.bitwise_and(image,mask)
# 计算原图和掩模后图像的直方图
histImage=cv2.calcHist([image],[0],None,[256],[0,255])
histMI=cv2.calcHist([image],[0],mask,[256],[0,255])
plt.plot(histImage,color='r')
plt.plot(histMI,color='g')
cv2.imshow("o",image)
cv2.imshow("mask",mask)
cv2.imshow("maskImg",m)
cv2.waitKey()
cv2.destroyAllWindows()
运行:
Over。。。。。。。。。。。。。。。