OpenCV---直方图的应用(均衡化和图像比较)
一:全局直方图均衡化(对比度增强)equalizeHist
def equalHist_demo(image): #OpenCV直方图均衡化都是基于灰度图像 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) dst = cv.equalizeHist(gray) #直方图均衡化,对比度增强 cv.imshow("equalHist_demo",dst)
1.cv2.equalizeHist函数原型:equalizeHist(src[, dst]) -> dst。函数equalizeHist的作用:直方图均衡化,提高图像质量。
2.直方图均衡化:如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。 它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像元取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。
3.全局直方图均衡化可能得到是一种全局意义上的均衡化,但是有的时候这种操作并不是很好,会把某些不该调整的部分给调整了。 Opencv中还有一种直方图均衡化,它是一种局部直方图均衡化,也就是是说把整个图像分成许多小块(比如按10*10作为一个小块),那么对每个小块进行均衡化。
全局的对比度太强
二:自适应的局部的直方图均衡化createCLAHE
def clahe_demo(image): #OpenCV直方图均衡化都是基于灰度图像 gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8)) dst = clahe.apply(gray) #将灰度图像和局部直方图相关联 cv.imshow("clahe_demo",dst)
1.createCLAHE函数原型:createCLAHE([, clipLimit[, tileGridSize]]) -> retval clipLimit参数表示对比度的大小。 tileGridSize参数表示每次处理块的大小 。
三:直方图的比较
def create_rag_hist(image): h,w,c = image.shape rgbHist = np.zeros([16*16*16,1],np.float32) bsize = 256/16 #间隔是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(r/bsize) rgbHist[np.int(index),0] = rgbHist[np.int(index),0] + 1 return rgbHist def hist_compare(image1,image2): hist1 = create_rag_hist(image1) hist2 = create_rag_hist(image2) match1 = cv.compareHist(hist1,hist2,cv.HISTCMP_BHATTACHARYYA) #巴氏距离比较,越小越相似 match2 = cv.compareHist(hist1,hist2,cv.HISTCMP_CORREL) #相关性比较(最大为1):越接近1越相似 match3 = cv.compareHist(hist1,hist2,cv.HISTCMP_CHISQR) #卡方比较,越小越相似 print("巴氏:%s 相关性:%s 卡方:%s"%(match1,match2,match3))
hist_compare(src,src) #当我们使用两张一样的图像比较
巴氏:0.0 相关性:1.0 卡方:0.0