【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.示例:

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

 三、掩膜的应用

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

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

3.示例:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img=cv.imread('cat.png',0)
#plt.imshow(img,cmap=plt.cm.gray)
#plt.show()
#创建掩膜模板数据
mask=np.zeros(img.shape[:2],np.uint8)
#感兴趣设置成白色
mask[0:200,200:300]=1
#plt.imshow(mask,cmap=plt.cm.gray)
#plt.show()
#将掩膜与原图像进行与操作

mask_img=cv.bitwise_and(img,img,mask=mask)
plt.imshow(mask_img,cmap=plt.cm.gray)
plt.show()

 四、直方图均衡化:

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

2.API:

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

3.示例:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img=cv.imread('cat.png',0)
#plt.imshow(img,cmap=plt.cm.gray)
#plt.show()
dst=cv.equalizeHist(img)
plt.imshow(dst,cmap=plt.cm.gray)
plt.show()

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

1.描述:

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

2.API:

cv.createCLAHE(clipLimit,tileGridSize)

参数:

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

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

3.示例:

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

 

猜你喜欢

转载自blog.csdn.net/m0_70964767/article/details/127163262