通过直方图你可以对政府图象的灰度分布有一个整体的了解。直方图其实也是对图象的另一种解释,我们可以对图象的对比度,亮度和灰度分布有一个直观的认识。
那么我们可以从opencv和numpy的函数得到图象的灰度直方图。先说opencv的函数cv2.calcHist()。
cv2.calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None)
第一参数是输入的图像,不过要加上中括号;第二个是信道,灰度图的话是零也要加上中括号形如:[0];第三个是掩模图像,没有的话为None;第四个是BNG的数目也要加上中括号的;第五个是像素的范围一般是[0,256],中括号。其他的可以忽略了。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/dell/Desktop/00.jpg',0)
hist=cv2.calcHist([img1],[0],None,[256],[0,256])
plt.plot(hist),plt.title('gray hist')
plt.xticks([0,256])
plt.show()
最简单的直接用matplotlib的函数
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/dell/Desktop/00.jpg',0)
plt.hist(img.ravel(),256,[0,256])
plt.show()
接下来看看用numpy的函数先说一个运行速度最快的np.bincount()函数
np.bincount(x, weights=None, minlength=None)
第一个参数是输入的以为数组;第二个参数可以忽略;第三个参数是数据的范围最好设置一下。
np.histogram(a, bins=10, range=None, normed=False, weights=None,
density=None)
a是代指数据;bins代指分类区间的个数;range是区间的范围(最小值,最大值)。返回的值有每个区间内数据的个数,区间的个数(+1)。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/dell/Desktop/00.jpg',0)
hists=np.bincount(img1.ravel(),minlength=256)
hist,bin=np.histogram(img1.ravel(),256,[0,256])
plt.subplot(1,2,1),plt.plot(hists),plt.title('bincount')
plt.subplot(1,2,2),plt.plot(hist),plt.title('histogram')
plt.show()
虽然显示的效果是一样的,但是运行速度最快的还是opencv的函数。
下面这个例子显示的是图象的三个信道的直方图。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/dell/Desktop/00.jpg')
color=('b','g','r')
for i,col in enumerate(color):#enumerate是枚举函数同时得到数组的索引和值
histr=cv2.calcHist([img1],[i],None,[256],[0,256])
plt.plot(histr,color=col)
plt.xlim([0,256])
plt.show()
下面一段程序是使用前面的掩码求一部分区域的直方图。
import cv2
import numpy as np
import matplotlib.pyplot as plt
img1=cv2.imread('C:/Users/dell/Desktop/00.jpg',0)
#the shape of the photo(300, 300, 3)
mask=np.zeros((300,300),np.uint8)
mask[100:200,100:200]=255
masked_img=cv2.bitwise_and(img1,img1,mask=mask)
hist_full=cv2.calcHist([img1],[0],None,[256],[0,256])
hist_mask=cv2.calcHist([img1],[0],mask,[256],[0,256])
plt.subplot(2,2,1),plt.imshow(img1,'gray')
plt.subplot(2,2,2),plt.imshow(mask,'gray')
plt.subplot(2,2,3),plt.imshow(masked_img,'gray')
plt.subplot(2,2,4),plt.plot(hist_full),plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()