【OpenCV3.3+Python3.6】图像直方图的应用

31 篇文章 1 订阅
31 篇文章 0 订阅

直方图的应用

 

直方图均衡化

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

 

直方图局部均衡化

全局直方图均衡化可能得到是一种全局意义上的均衡化,但是有的时候这种操作并不是很好,会把某些不该调整的部分给调整了。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)两张相同图片的直方图的比较

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Demo.demo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值