前提条件
使用工具python3.x
使用库 :numpy、opencv,
api简介
1.cv.equalizeHist
使用cv.cvtColor(image, cv.COLOR_BGR2GRAY)将图片转为gray,以gray为参数,使用cv.equalizeHist(gray)可以得到对比度更强的图。
2.cv.createCLAHE
自动化直方图,主要是对图片进行局部直方化,对比强度与原图差别不大,显得更自然。
3.cv.compareHist
利用图像的直方图,分析图片的相似性。cv2.compareHist(H1, H2, Methods)
H1,H2 为图片转换后的直方图,Methods是比较方式
关于图片直方化,原理及用处等可参考这里
https://baike.baidu.com/item/%E7%9B%B4%E6%96%B9%E5%9B%BE%E5%9D%87%E8%A1%A1%E5%8C%96?fr=aladdin
代码示例
import cv2 as cv
import numpy as np
#直方图均衡化 equalHist_demo clahe_demo
def equalHist_demo(image): #直方图均衡化,对比度增强
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
dst = cv.equalizeHist(gray) #用gray
cv.imshow('equalHist_demo', dst)
def clahe_demo(image):
gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
clahe = cv.createCLAHE(clipLimit=5.0, tileGridSize=(8, 8))
dst = clahe.apply(gray)
cv.imshow('clahe_demo',dst)
#直方图比较
def create_rgb_hist(image):
h, w, c = image.shape
rgbHist = np.zeros([16*16*16,1], np.float32)
bsize = 256/16
for row in range(h):
for col in range(w):
#构造 r g b 通道
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(r/bsize)
rgbHist[np.int(index), 0] = rgbHist[np.int(index), 0] + 1
return rgbHist #返回三通道的直方图
#巴氏距离
def hist_compare(image1, image2):
hist1 = create_rgb_hist(image1)
hist2 = create_rgb_hist(image2)
match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)
match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)
match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)
print("巴氏距离: %s, 相关性:%s, 卡方:%s" %(match1, match2, match3))
#巴氏距离:很小,很相似。相关性:越接近一越相似。卡方:越小相似度越高
src=cv.imread("D:/openCV_image/image/6.png")
# src=cv.imread("D:/openCV_image/image/2_2.png")
# print(src)
# cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
# cv.imshow("input image",src)
# equalHist_demo(src)
# clahe_demo(src)
image1=cv.imread("D:/openCV_image/image/2_2.png")
image2=cv.imread("D:/openCV_image/image/7.png")
cv.imshow("input1",image1)
cv.imshow("input image2",image2)
hist_compare(image1, image2) #图片相似性分析
cv.waitKey(0)
cv.destroyAllWindows()
原图:
1.直方图均衡化效果比较:
clahe_demo(src)
equalHist_demo(src)
2.hist_compare的效果:
由巴氏距离可知图片相似性很低