直方图的应用
直方图均衡化
如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像元取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。
直方图局部均衡化
全局直方图均衡化可能得到是一种全局意义上的均衡化,但是有的时候这种操作并不是很好,会把某些不该调整的部分给调整了。Opencv中还有一种直方图均衡化,它是一种局部直方图均衡化,也就是是说把整个图像分成许多小块(比如按10*10作为一个小块),那么对每个小块进行均衡化。
直方图比较
利用巴氏距离,相关性,卡方来比较两张图片的相似性
巴氏距离越小越相似 cv2.compareHist(hist1,hist2,cv2.HISTCMP_CORREL)
相关性越大越相似 cv2.compareHist(hist1,hist2,cv2.HISTCMP_CORREL)
卡方越小越相似 cv2.compareHist(hist1,hist2,cv2.HISTCMP_CHISQR)
看代码
# 直方图应用:统计图片中的属性值的频次,比如RGB三色值出现的次数
# 直方图均衡化 : 调整图像的对比度 让暗的地方更暗,让亮的地方更亮
# 直方图比较
# 巴氏距离,相关性,卡方
import cv2
import numpy as np
def equalHist_demo(image): #直方图均衡化
gray =cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#转灰度图 ,opencv的直方图均衡化要基于单通道灰度图像
cv2.imshow("gray",gray)#灰度图的显示
dst =cv2.equalizeHist(gray)#图片直方图均衡化 自动调整图像对比度,把图像变得更清晰
cv2.imshow("equalHist_demo", dst)#均衡后的图片显示
def clahe_demo(image): # 分块局部均衡化
gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#转灰度图
clahe=cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
# createCLAHE([, clipLimit[, tileGridSize]])
# clipLimit参数表示对比度的大小。
# tileGridSize参数表示每次处理块的大小
dst=clahe.apply(gray) #应用
cv2.imshow("clahe_demo", dst)
def create_rgb_hist(image):
h, w, c = image.shape
rgbHist = np.zeros([16*16*16, 1],np.float32)#直方图初始化,16,16,16指的3通道的数量
bsize = 256 / 16
for row in range(h):
for col in range(w):
b = image[row, col, 0]
g = image[row, col, 1]
r = image[row, col, 2]
index = np.int(b/bsize)*16*16+np.int(g/bsize)*16+np.int(g/bsize) #
rgbHist[np.int(index), 0]=rgbHist[np.int(index), 0]+1
return rgbHist
def hist_campare(image1,image2): #直方图的比较
hist1=create_rgb_hist(image1) #直方图1
hist2=create_rgb_hist(image2) #直方图1
match1=cv2.compareHist(hist1,hist2,cv2.HISTCMP_BHATTACHARYYA)#获取巴氏距离,越小越相似
match2=cv2.compareHist(hist1,hist2,cv2.HISTCMP_CORREL) #获取相关性,越大越相似
match3=cv2.compareHist(hist1,hist2,cv2.HISTCMP_CHISQR) #获取卡方,越大越不相似
print("巴氏距离:%s, 相关性: %s, 卡方: %s"%(match1,match2,match3))
print("------Hello------")
src=cv2.imread("mi.png")
src1=cv2.imread("lena.jpg")
src2=cv2.imread("lena_tmpl.jpg")
cv2.imshow("source_image1",src1)
cv2.imshow("source_image2",src2)
hist_campare(src1,src2)
equalHist_demo(src)
clahe_demo(src1)
cv2.waitKey(0)
cv2.destroyAllWindows()
(1)原图
(2)灰度图
(3)直方图均衡化
(4)直方图局部均衡化
(5)直方图的比较
(6)两张相同图片的直方图的比较