【OpenCV 例程300篇】47. 直方图处理之直方图匹配

『youcans 的 OpenCV 例程300篇 - 总目录』


【youcans 的 OpenCV 例程300篇】47. 直方图处理之直方图匹配


图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数。

直方图均衡直接对图像全局进行均衡化,生成具有均匀直方图的图像,并不考虑局部图像区域的具体情况。对于一幅图像的局部区域、具体缺陷,有时需要生成具有特殊形状直方图的图像。

直方图匹配又称为直方图规定化,是指将图像的直方图调整为规定的形状。 例如,将一幅图像或某一区域的直方图匹配到另一幅影像上,使两幅影像的色调保持一致。

这就需要在直方图均衡的基础上,再进行一次反变换,将均匀形状的直方图调整为规定的形状。

直方图匹配的主要步骤为:

(1)通过规定图像 z 的直方图 p z ( z ) p_z(z) pz(z),计算其直方图均衡变换的 s k s_k sk

(2)通过 s k s_k sk 计算图像 z 的直方图均衡变换函数 G G G G ( z q ) = s k G(z_q)=s_k G(zq)=sk

(3)计算变换函数 G G G 的逆变换函数 G − 1 G^{-1} G1 z q = G − 1 ( s k ) z_q=G^{-1}(s_k) zq=G1(sk)

(4)对输入图像 r 进行直方图均衡得到均衡图像 s,然后再用逆变换函数 G − 1 G^{-1} G1 将其映射到 p z ( z ) p_z(z) pz(z),得到直方图匹配图像 z。本步骤中的两次变换,也可以合并为一次完成。


例程:1.59 灰度图像直方图匹配

    # 1.59 灰度图像直方图匹配
    img = cv2.imread("../images/imgGaia.tif", flags=0)  # flags=0 读取为灰度图像
    imgRef = cv2.imread("../images/Fig0307a.tif", flags=0)  # 匹配模板图像, matching template

    # imgOut = calcHistMatch(img, imgRef)  # 子程序:直方图匹配

    # 计算累计直方图
    histImg, bins = np.histogram(img.flatten(), 256)  # 计算原始图像直方图
    histRef, bins = np.histogram(imgRef.flatten(), 256)  # 计算匹配模板直方图
    cdfImg = histImg.cumsum()  # 计算原始图像累积分布函数 CDF
    cdfRef = histRef.cumsum()  # 计算匹配模板累积分布函数 CDF

    # 计算直方图匹配转换函数
    transM = np.zeros(256)
    for i in range(256):
        index = 0
        vMin = np.fabs(cdfImg[i] - cdfRef[0])
        for j in range(256):
            diff = np.fabs(cdfImg[i] - cdfRef[j])
            if (diff < vMin):
                index = int(j)
                vMin = diff
        transM[i] = index

    # 直方图匹配
    # imgOut = np.zeros_like(img)
    imgOut = transM[img].astype(np.uint8)

    fig = plt.figure(figsize=(10,7))
    plt.subplot(231), plt.title("Original image"), plt.axis('off')
    plt.imshow(img, cmap='gray')  # 原始图像
    plt.subplot(232), plt.title("Matching template"), plt.axis('off')
    plt.imshow(imgRef, cmap='gray')  # 匹配模板
    plt.subplot(233), plt.title("Matching output"), plt.axis('off')
    plt.imshow(imgOut, cmap='gray')  # 匹配结果
    histImg, bins = np.histogram(img.flatten(), 256)  # 计算原始图像直方图
    plt.subplot(234, yticks=[]), plt.bar(bins[:-1], histImg)
    histRef, bins = np.histogram(imgRef.flatten(), 256)  # 计算匹配模板直方图
    plt.subplot(235, yticks=[]), plt.bar(bins[:-1], histRef)
    histOut, bins = np.histogram(imgOut.flatten(), 256)  # 计算匹配结果直方图
    plt.subplot(236, yticks=[]), plt.bar(bins[:-1], histOut)
    plt.show()

在这里插入图片描述

(本节完)


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125112487)
Copyright 2022 youcans, XUPT
Crated:2021-11-18

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

youcans_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值