47. 直方图处理之直方图匹配

灰度变换与直方图索引

一、直方图匹配

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

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

  • 直方图匹配又称为直方图规定化,是指将图像的直方图调整为规定的形状。
    例如,将一幅图像或某一区域的直方图匹配到另一幅影像上,使两幅影像的色调保持一致。
    这就需要在直方图均衡的基础上,再进行一次反变换,将均匀形状的直方图调整为规定的形状。

二、主要步骤

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

  • (1)通过规定图像 z 的直方图p_z(z),计算其直方图均衡变换的 s_k

  • (2)通过s_k, 计算图像 z 的直方图均衡变换函数G, G(z_q)=s_k

  • (3)计算变换函数 G 的逆变换函数 G^{-1}z_q=G^{-1}(s_k)

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

三、例程

  • 1.59 灰度图像直方图匹配
import cv2
import numpy as np
from matplotlib import pyplot as plt

# 1.59 灰度图像直方图匹配
img = cv2.imread(r"e:/opencv/bgra.png", flags=0)  # flags=0 读取为灰度图像
imgRef = cv2.imread(r"e:/opencv/gradient.png", 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_的博客:
https://blog.csdn.net/youcans/article/details/121587348
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • """1.个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消息应非常简单,如“Hello ...
    她即我命阅读 3,246评论 0 5
  • 为了让我有一个更快速、更精彩、更辉煌的成长,我将开始这段刻骨铭心的自我蜕变之旅!从今天开始,我将每天坚持阅...
    李薇帆阅读 1,867评论 0 2
  • 似乎最近一直都在路上,每次出来走的时候感受都会很不一样。 1、感恩一直遇到好心人,很幸运。在路上总是...
    时间里的花Lily阅读 1,327评论 0 1
  • 1、expected an indented block 冒号后面是要写上一定的内容的(新手容易遗忘这一点); 缩...
    庵下桃花仙阅读 489评论 0 1
  • 一、工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)矩形、椭圆选框工具 【M】移动工具 【V...
    墨雅丫阅读 513评论 0 0