从头学习opencv(10)--直方图应用

直方图均衡化

直方图均衡化(即调整图像的对比度)
直方图即统计各像素点的频次

#直方图的应用    直方图均衡化(即调整图像的对比度)   直方图即统计各像素点的频次
#全局化直方图均衡化
def equalHist_demo(image):
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    # opencv的直方图均衡化要基于单通道灰度图像
    #cv.imshow("gray", gray)#与均衡化后的做个对比,效果更明显
    dst=cv.equalizeHist(gray)
    # 自动调整图像对比度,把图像变得更清晰
    cv.imshow("equalHist_demo",dst)


#局部化直方图均衡化
def clahe_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    #cv.imshow("gray", gray)
    clahe=cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
    dst = clahe.apply(gray)
    cv.imshow("clahe_demo", dst)

注意:https://www.cnblogs.com/FHC1994/p/9118351.html

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

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

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

4.createCLAHE函数原型:createCLAHE([, clipLimit[, tileGridSize]]) -> retval

clipLimit参数表示对比度的大小。

tileGridSize参数表示每次处理块的大小 。

5.clahe = cv.createCLAHE(5, (8,8))

dst = clahe.apply(gray) #猜测:把clahe这种局部直方图均衡化应用到灰度图gray

直方图比较

#创建rgb直方图
def creat_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):
            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=creat_rgb_hist(image1)
    hist2=creat_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))

完整代码

import cv2 as cv
import numpy as np

#直方图的应用    直方图均衡化(即调整图像的对比度)   直方图即统计各像素点的频次
#全局化直方图均衡化
def equalHist_demo(image):
    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    # opencv的直方图均衡化要基于单通道灰度图像
    #cv.imshow("gray", gray)#与均衡化后的做个对比,效果更明显
    dst=cv.equalizeHist(gray)
    # 自动调整图像对比度,把图像变得更清晰
    cv.imshow("equalHist_demo",dst)


#局部化直方图均衡化
def clahe_demo(image):
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    #cv.imshow("gray", gray)
    clahe=cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
    dst = clahe.apply(gray)
    cv.imshow("clahe_demo", dst)


#创建rgb直方图
def creat_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):
            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=creat_rgb_hist(image1)
    hist2=creat_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/opencv/sources/samples/data/demo.png")
src1 = cv.imread("D:/OpenCV/opencv/sources/samples/data/left.jpg")
src2 = cv.imread("D:/OpenCV/opencv/sources/samples/data/right.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
cv.imshow("src1", src1)
cv.imshow("src2", src2)
#equalHist_demo(src)
#clahe_demo(src)
hist_compare(src1,src2)
cv.waitKey(0)
cv.destroyAllWindows()
print("Hi,python!")

结果分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
由结果可以看出,
巴氏距离离0很大,说明相似度小
相关性离1很小,说明相似度小
卡方很大,说明相似度小

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值