直方图均衡化 就是调整图像的对比度,让图像显示更清晰,一般有两种方法:全局调整和局部自适应,局部自适应的数值一般是2**n
直方图均衡化都是基于灰度图
#全局调整
def equalizeHist_demo(img):
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
dst = cv.equalizeHist(gray)
cv.imshow(
'equalizeHist_demo',dst)
#局部自适应
def clahe_dome(img):
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
clahe = cv.createCLAHE(
clipLimit=
5.0,
tileGridSize=(
8,
8))
#clipLimit 的值默认是40 值越大对比度越大
dst = clahe.apply(gray)
cv.imshow(
'clahe_dome',dst)
可以看出来,全局均衡化,对比度提升的太大,容易造成一些地方与背景同化,所以一般用局部自适应均衡化
另一种应用是直方图比较,比较两张图片的相似度
直方图的比较方法有四种:按照图像顺序排列:卡方、相关性、交叉、巴氏距离
在进行直方图比较前,先做一个rgb的直方图
#做一个rgb的直方图
def create_rgb_hist(img):
h, w, c = img.shape
rgbHist = np.zeros([
16*
16*
16,
1],np.float32)
# blue 16个 green 16个 red16个
bsize =
256/
16
# 直方图有256个bins 除以16 =16
for row
in
range(h):
for col
in
range(w):
b = img[row, col,
0]
g = img[row, col,
1]
r = img[row, col,
2]
index = np.int(b/bsize)*
16*
16 + np.int(g/bsize)*
16 + np.int(r/bsize)
#降维操作 把256*256*256 转成16*16*16
rgbHist[np.int(index),
0] +=
1
return rgbHist
之后再进行RGB直方图的比较
def hist_compare(img1,img2):
hist1 = create_rgb_hist(img1)
hist2 = create_rgb_hist(img2)
match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA) # 巴氏距离 越小图片的相似度越高
match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL) # 相关性 越大图片的相似度越高
match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR) # 卡方 越小图片相似度越高
match4 = cv.compareHist(hist1, hist2, cv.HISTCMP_INTERSECT)
#巴氏距离和相关性数值都在0 1之间 所以一般用他们两个来比较
print('巴氏距离: %s, 相关性: %s, 卡方: %s, 交叉: %s' % (match1,match2,match3,match4))