十 直方图

Posted pacino12134

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十 直方图相关的知识,希望对你有一定的参考价值。

技术分享图片

一、直接使用直方图

 1 import matplotlib.pyplot as plt
 2 import cv2 as cv
 3 def plot_demo(image):
 4     print(image.ravel())  ##ravel将图像3维转一维数组,便于统计频率
 5     # 统计为256个bin,直方图显示[0,256]所有的bin,意思是全部显示,我们可以设置只显示一部分[0,200]也可以
 6     plt.hist(image.ravel(), 256, [0, 256])  
 7     plt.show()
 8 src = cv.imread(1.jpg)
 9 cv.imshow(inputimage,src)
10 plot_demo(src)
11 cv.waitKey(0)
12 cv.destroyAllWindows()

hist是256x1数组,每个值对应于该图像中其像素数与其相应像素值的数量。

技术分享图片技术分享图片

二、使用opencv直方图

calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None):

images:输入图像
channels:需要统计直方图的第几通道
mask:掩膜,,计算掩膜内的直方图 ...Mat()
histSize:指的是直方图分成多少个区间,就是 bin的个数
ranges: 统计像素值得区间
hist:输出的直方图数组

accumulate=false:在多个图像时,是否累计计算像素值得个数

 1 import cv2 as cv
 2 import matplotlib.pyplot as plt
 3 def hist_image(image):
 4     colors = (blue,green,red)
 5     for i,color in enumerate(colors):
 6         hist = cv.calcHist([image],[i],None,[256],[0,256])
 7         plt.plot(hist,color=color)
 8         plt.xlim([0,256])
 9     plt.show()
10 img = cv.imread(1.jpg)
11 cv.imshow(img,img)
12 hist_image(img)
13 cv.waitKey(0)
14 cv.destroyAllWindows()

技术分享图片技术分享图片

根据直方图的波峰可以判断图像的主要特征,可以用于图像的分割,根据各个波峰

四、直方图应用(均衡化和图像比较)

OpenCV直方图均衡化都是基于灰度图像

1、全局直方图均衡化(对比度增强)equalizeHist

函数equalizeHist的作用:直方图均衡化,提高图像质量。

直方图均衡化:如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。 它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像元取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。

全局直方图均衡化可能得到是一种全局意义上的均衡化,但是有的时候这种操作并不是很好,会把某些不该调整的部分给调整了。 Opencv中还有一种直方图均衡化,它是一种局部直方图均衡化,也就是是说把整个图像分成许多小块(比如按10*10作为一个小块),那么对每个小块进行均衡化。

全局的对比度太强

 1 import cv2 as cv
 2 import matplotlib.pyplot as plt
 3 
 4 img = cv.imread(1.jpg)    #OpenCV直方图均衡化都是基于灰度图像
 5 gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
 6 cv.imshow(gray,gray)
 7 dst = cv.equalizeHist(gray) #直方图均衡化,对比度增强
 8 cv.imshow(equalizehist,dst)
 9 cv.waitKey(0)
10 cv.destroyAllWindows()

技术分享图片技术分享图片

2、自适应的局部的直方图均衡化createCLAHE

createCLAHE([, clipLimit[, tileGridSize]]) -> retval

clipLimit参数表示对比度的大小。

tileGridSize参数表示每次处理块的大小 。

 

1 img = cv.imread(1.jpg)    #OpenCV直方图均衡化都是基于灰度图像
2 gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
3 cv.imshow(gray,gray)
4 clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
5 dst = clahe.apply(gray)     #将灰度图像和局部直方图相关联,把直方图均衡化应用到灰度图 这两行必须搭配起来使用才可以
6 cv.imshow(dis,dst)
7 cv.waitKey(0)
8 cv.destroyAllWindows()

技术分享图片技术分享图片

五、直方图比较

 1 def create_rag_hist(image):
 2     h,w,c = image.shape
 3     rgbHist = np.zeros([16*16*16,1],np.float32)  #注意,np.array二维以上的,每个元素是一个数组
 4     bsize = 256/16  #间隔是16
 5     for row in range(h):
 6         for col in range(w):
 7             b = image[row,col,0]
 8             g = image[row,col,1]
 9             r = image[row,col,2]
10             index = np.int(b/bsize)*16*16 + np.int(g/bsize)*16 + np.int(r/bsize)
11             rgbHist[np.int(index),0] = rgbHist[np.int(index),0] + 1   #二维的,所以是rgbhist[n,0]只不过每个数组只有一个元素,所以用0
12     return rgbHist
13 
14 def hist_compare(image1,image2):
15     hist1 = create_rag_hist(image1)
16     hist2 = create_rag_hist(image2)
17     match1 = cv.compareHist(hist1,hist2,cv.HISTCMP_BHATTACHARYYA)   #巴氏距离比较,越小越相似
18     match2 = cv.compareHist(hist1,hist2,cv.HISTCMP_CORREL)   #相关性比较(最大为1):越接近1越相似
19     match3 = cv.compareHist(hist1,hist2,cv.HISTCMP_CHISQR)   #卡方比较,越小越相似
20     print("巴氏:%s    相关性:%s  卡方:%s"%(match1,match2,match3))

hist_compare(src,src)  #当我们使用两张一样的图像比较

巴氏:0.0 相关性:1.0 卡方:0.0

 







以上是关于十 直方图的主要内容,如果未能解决你的问题,请参考以下文章

灰度图像直方图变换的一些代码

十matplotlib统计图

灰度图像直方图变换的一些代码

OpenCV 学习笔记(颜色直方图计算 calcHist)

SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段

OpenCV图像处理10图像直方图