当前位置:   article > 正文

【OpenCV--直方图】_opencv 直方图

opencv 直方图

目录

一、直方图是什么?

1.描述:

2.相关术语:

二、直方图的计算和绘制

三、掩膜的应用

四、直方图均衡化:

五、自适应的直方图均衡化

一、直方图是什么?

1.描述:

1>直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的bin(直条/组距)当中。bin的数值可以是梯度、方向、色彩或任何其他特征。

2>图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数。其横坐标的左侧为较暗的区域,而右侧为较亮的区域。因此一张较暗图片的直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。

注意: 直方图是根据灰度图进行绘制的,而不是彩色图像,

2.相关术语:

1>dims:需要统计的特征数,dims=1指只统计了灰度值

2>bins:每个特征空间的子区段的数目

3>range:要统计的特征取值范围

二、直方图的计算和绘制

1.使用OpenCV中的方法统计直方图,再使用matplotlib进行绘制

cv.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])

参数:

1>images:原图像,当传入函数时[img]形式进行表示
2>channels:如果输入图像是灰度图,它的值就是[0]; 如果是彩色图像,传入的参数可以是[0],[1],[2]它们分别对应着通道B, G, R.
3>mask: 掩模图像,要统计整幅图像的直方图就把它设为None,若统计图像某一部分的直方图的话,需要制作一个掩膜图像

4> histSize:bin的数目,[256]形式进行表示
5>ranges: 像素值范围,通常为[0, 256]

2.示例:

  1. import numpy as np
  2. import cv2 as cv
  3. import matplotlib.pyplot as plt
  4. img=cv.imread('cat.png',0)
  5. #显示灰度图
  6. #plt.imshow(img,cmap=plt.cm.gray)
  7. #plt.show()
  8. #统计直方图
  9. hist=cv.calcHist([img],[0],None,[256],[0,256])
  10. #绘制直方图
  11. plt.figure(figsize=(10,8))
  12. plt.plot(hist)
  13. plt.show()

 三、掩膜的应用

1.什么是掩膜:掩膜是用选定的图像、图形或物体,对要处理的图像进行遮挡,来控制图像处理的区域,在数字图像处理中,通常使用二维矩阵进行掩膜,掩膜是由0和1组成的一个二进制图像,利用该掩膜对要处理的图像进行掩膜,其中值为1的区域被处理,0区域被屏蔽,不会处理

2.掩膜的作用:我们使用cv.calcHist()查找完整图像的直方图,当要查找图像某些区域的直方图,只需要在查找直方图的区域上创建一个白色的掩膜图像,否则创建黑色,将其作为掩码mask传递

3.示例:

  1. import numpy as np
  2. import cv2 as cv
  3. import matplotlib.pyplot as plt
  4. img=cv.imread('cat.png',0)
  5. #plt.imshow(img,cmap=plt.cm.gray)
  6. #plt.show()
  7. #创建掩膜模板数据
  8. mask=np.zeros(img.shape[:2],np.uint8)
  9. #感兴趣设置成白色
  10. mask[0:200,200:300]=1
  11. #plt.imshow(mask,cmap=plt.cm.gray)
  12. #plt.show()
  13. #将掩膜与原图像进行与操作
  14. mask_img=cv.bitwise_and(img,img,mask=mask)
  15. plt.imshow(mask_img,cmap=plt.cm.gray)
  16. plt.show()

 四、直方图均衡化:

 1.概念描述:如果一幅图像整体很亮,那所有的像素值的取值个数应该都会很高。需要将此图像的直方图做一个横向拉伸,就可以扩大图像像素值的分布范围,提高图像的对比度,这就是直方图均衡化,在X光图像中使用广泛,可以提高骨架结构的显示,另外在曝光过度或不足的图像中可以更好的突出细节。

2.API:

dst=cv.equalizeHist(img)#输出结果就是均衡化的直方图

3.示例:

  1. import numpy as np
  2. import cv2 as cv
  3. import matplotlib.pyplot as plt
  4. img=cv.imread('cat.png',0)
  5. #plt.imshow(img,cmap=plt.cm.gray)
  6. #plt.show()
  7. dst=cv.equalizeHist(img)
  8. plt.imshow(dst,cmap=plt.cm.gray)
  9. plt.show()

 五、自适应的直方图均衡化

1.描述:

直方图均衡化中,考虑的是图像全局的对比度,许多情况下,会由于均衡化而丢失许多信息,为了解决此问题,需要使用自适应的直方图均衡化,此时,整幅图片被分成许多小块,称为tiles(在OpenCV中tiles的大小默认是8x8),然后再对每一个小块分别进行直方图均衡化。如果有噪声的话,噪声会被放大。为了避免这种情况的出现要使用对比度限制。对于每个小块来说,如果直方图中的bin超过对比度的上限的话,就把其中的像素点均匀分散到其他bins中,然后在进行直方图均衡化。最后使用双线性差值,对每一小块进行拼接

2.API:

cv.createCLAHE(clipLimit,tileGridSize)

参数:

clipLimit:对比度限制,默认是40

tileGridSize:分块的大小,默认8*8

3.示例:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import cv2 as cv
  4. img=cv.imread('cat.png',0)
  5. #创建一个自适应均衡化对象
  6. cl=cv.createCLAHE(2.0,(8,8))
  7. #将其应用于图像
  8. clahe=cl.apply(img)
  9. plt.imshow(clahe,cmap=plt.cm.gray)
  10. plt.show()

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/46679
推荐阅读
相关标签
  

闽ICP备14008679号