首页 > 技术文章 > python实现直方图的应用

april0315 2020-09-27 10:12 原文

 

目录:

(一)调节图片对比度(均衡化)

(1)全局直方图均衡化------equalizeHist

(2)自适应的局部的直方图均衡化------createCLAHE

(二)图片的相似度比较

(三)直方图反向投影(实现对有颜色物体的跟踪)

(1)原理

(2)二维直方图的表示

A.直接显示

B.使用matplotlib

(3)直方图反向映射

A. def calcHist函数

B.roihist函数

C.归一化函数normalize详解

 

 

 

 

 

正文:

(一)调节图片对比度(均衡化)

(1)全局直方图均衡化------equalizeHist

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

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

3.cv2.equalizeHist函数原型:equalizeHist(src[, dst]) -> dst。函数equalizeHist的作用:直方图均衡化,提高图像质量。

1 def equalHist_demo(image):  #OpenCV直方图均衡化都是基于灰度图像
2     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
3     dst = cv.equalizeHist(gray) #直方图均衡化,对比度增强
4     cv.imshow("equalHist_demo",dst)

缺点:对比度太明显了!

(2)自适应的局部的直方图均衡化------createCLAHE

1.createCLAHE函数原型:createCLAHE([, clipLimit[, tileGridSize]]) -> retval clipLimit参数表示对比度的大小。 tileGridSize参数表示每次处理块的大小 。

1 def clahe_demo(image):  #OpenCV直方图均衡化都是基于灰度图像
2     gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
3     clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
4     dst = clahe.apply(gray)  #将灰度图像和局部直方图相关联
5     cv.imshow("clahe_demo",dst)

 (二)图片的相似度比较

 1 def create_rag_hist(image):
 2     h,w,c = image.shape
 3     rgbHist = np.zeros([16*16*16,1],np.float32)
 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
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))

(三)直方图反向投影(实现对有颜色物体的跟踪)

(1)原理

(2)二维直方图的表示

A.直接显示

1 def hist2D_demo(image):
2     hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
3     hist = cv.calcHist([image],[0,1],None,[289,286],[0,289,0,286])
4     cv.imshow("hist2D",hist)

B.使用matplotlib

1 def hist2D_demo(image):
2     hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)
3     hist = cv.calcHist([image],[0,1],None,[289,286],[0,289,0,286])
4     plt.imshow(hist,interpolation="nearest")
5     plt.title("2D Histogram")
6     plt.show()

(3)直方图反向映射

A. def calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None): # real signature unknown; restored from __doc__

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

 1 def back_projection_demo():
 2     sample = cv.imread("./s2.png")
 3     target = cv.imread("./b.png")
 4     roi_hsv = cv.cvtColor(sample,cv.COLOR_BGR2HSV)
 5     tar_hsv = cv.cvtColor(target,cv.COLOR_BGR2HSV)
 6 
 7     cv.imshow("sample",sample)
 8     cv.imshow("target",target)
 9 
10     roihist = cv.calcHist([roi_hsv], [0, 1], None, [324, 356], [0, 324, 0, 356])  #加红部分越小,匹配越放松,匹配越全面,若是bsize值越大,则要求得越精细,越不易匹配,所以导致匹配出来的比较小
11     cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX)  #规划到0-255之间
12     dst = cv.calcBackProject([tar_hsv],[0,1],roihist,[0,324,0,356],1)   #直方图反向投影
13     cv.imshow("back_projection_demo",dst)

 B.roihist = cv.calcHist([roi_hsv], [0, 1], None, [32, 46], [0, 324, 0, 356])  #这是两个通道,bsize变少了,但是他的匹配更加广了(对于匹配的局限放宽了)

C.归一化函数normalize详解

1. 归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

归一化函数cv2.normalize原型:normalize(src, dst[, alpha[, beta[, norm_type[, dtype[, mask]]]]]) -> dst 

src参数表示输入数组。

dst参数表示输出与src相同大小的数组,支持原地运算。

alpha参数表示range normalization模式的最小值。

beta参数表示range normalization模式的最大值,不用于norm normalization(范数归一化)模式。

norm_type参数表示归一化的类型。

norm_type参数可以有以下的取值:

NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。

NORM_INF:归一化数组的C-范数(绝对值的最大值)。

NORM_L1 :归一化数组的L1-范数(绝对值的和)。

NORM_L2 :归一化数组的(欧几里德)L2-范数。
2.反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。

函数cv2.calcBackProject用来计算直方图反向投影。

函数原型:calcBackProject(images, channels, hist, ranges, scale[, dst]) -> dst

images参数表示输入图像(是HSV图像)。传入时应该用中括号[ ]括起来。

channels参数表示用于计算反向投影的通道列表,通道数必须与直方图维度相匹配。

hist参数表示输入的模板图像直方图。

ranges参数表示直方图中每个维度bin的取值范围 (即每个维度有多少个bin)。

scale参数表示可选输出反向投影的比例因子,一般取1。

参考:

https://www.cnblogs.com/ssyfj/p/9270608.html

https://www.cnblogs.com/ssyfj/p/9271327.html

推荐阅读