当前位置: 首页 > 面试题库 >

python2.x中两幅图像的直方图匹配?

蔡弘扬
2023-03-14
问题内容

我正在尝试匹配两个图像的直方图(在MATLAB中,这是可以做到的)
使用
imhistmatch).
标准Python库中是否有可用的等效函数?我已经
查看了OpenCV、scipy和numpy,但没有看到任何类似的功能。


问题答案:

我以前写过一个答案
这里解释如何做
图像直方图的分段线性插值
高光/中音/阴影的特定比率。
相同的基本原则是[直方图]的基础
匹配两人之间
图像。基本上,你要计算出你的源和目标的累积直方图
模板图像,然后线性插值,以找到唯一的像素值
与唯一像素的分位数最接近的模板图像
源图像中的值:

import numpy as np

def hist_match(source, template):
    """
    Adjust the pixel values of a grayscale image such that its histogram
    matches that of a target image

    Arguments:
    -----------
        source: np.ndarray
            Image to transform; the histogram is computed over the flattened
            array
        template: np.ndarray
            Template image; can have different dimensions to source
    Returns:
    -----------
        matched: np.ndarray
            The transformed output image
    """

    oldshape = source.shape
    source = source.ravel()
    template = template.ravel()

    # get the set of unique pixel values and their corresponding indices and
    # counts
    s_values, bin_idx, s_counts = np.unique(source, return_inverse=True,
                                            return_counts=True)
    t_values, t_counts = np.unique(template, return_counts=True)

    # take the cumsum of the counts and normalize by the number of pixels to
    # get the empirical cumulative distribution functions for the source and
    # template images (maps pixel value --> quantile)
    s_quantiles = np.cumsum(s_counts).astype(np.float64)
    s_quantiles /= s_quantiles[-1]
    t_quantiles = np.cumsum(t_counts).astype(np.float64)
    t_quantiles /= t_quantiles[-1]

    # interpolate linearly to find the pixel values in the template image
    # that correspond most closely to the quantiles in the source image
    interp_t_values = np.interp(s_quantiles, t_quantiles, t_values)

    return interp_t_values[bin_idx].reshape(oldshape)

For example:

from matplotlib import pyplot as plt
from scipy.misc import lena, ascent

source = lena()
template = ascent()
matched = hist_match(source, template)

def ecdf(x):
    """convenience function for computing the empirical CDF"""
    vals, counts = np.unique(x, return_counts=True)
    ecdf = np.cumsum(counts).astype(np.float64)
    ecdf /= ecdf[-1]
    return vals, ecdf

x1, y1 = ecdf(source.ravel())
x2, y2 = ecdf(template.ravel())
x3, y3 = ecdf(matched.ravel())

fig = plt.figure()
gs = plt.GridSpec(2, 3)
ax1 = fig.add_subplot(gs[0, 0])
ax2 = fig.add_subplot(gs[0, 1], sharex=ax1, sharey=ax1)
ax3 = fig.add_subplot(gs[0, 2], sharex=ax1, sharey=ax1)
ax4 = fig.add_subplot(gs[1, :])
for aa in (ax1, ax2, ax3):
    aa.set_axis_off()

ax1.imshow(source, cmap=plt.cm.gray)
ax1.set_title('Source')
ax2.imshow(template, cmap=plt.cm.gray)
ax2.set_title('template')
ax3.imshow(matched, cmap=plt.cm.gray)
ax3.set_title('Matched')

ax4.plot(x1, y1 * 100, '-r', lw=3, label='Source')
ax4.plot(x2, y2 * 100, '-k', lw=3, label='Template')
ax4.plot(x3, y3 * 100, '--r', lw=3, label='Matched')
ax4.set_xlim(x1[0], x1[-1])
ax4.set_xlabel('Pixel value')
ax4.set_ylabel('Cumulative %')
ax4.legend(loc=5)

对于一对RGB图像,您可以将此函数分别应用于每个图像频道。根据你想要达到的效果,你可能想要
首先将图像转换为不同的颜色空间。例如,你可以转换成HSV空间然后呢如果你想匹配亮度,就在V频道上进行匹配,但不是色调或饱和度。



 类似资料:
  • 本文向大家介绍python 对一幅灰度图像进行直方图均衡化,包括了python 对一幅灰度图像进行直方图均衡化的使用技巧和注意事项,需要的朋友参考一下 图1:原图的灰度图 图2:进行直方图均衡化后的图像 图3:原图灰度图的直方图 图4:进行直方图均衡化后的直方图 图5:灰度变换函数 以上就是python 对一幅灰度图像进行直方图均衡化的详细内容,更多关于python 直方图均衡化的资料请关注呐喊教

  • 我有两种纹理。一个是jpg,一个是PNG。我已经渲染了一个立方体,我想使用jpg图像作为背景在立方体的每一个面,然后在这个背景上有png。我尝试了,但我可以通过png看到背景,我不希望这样。有没有什么功能可以为我做到这一点? 片段着色器: 是png,是JPG。

  • 我想知道他们的AndEngine的任何子库可以变形两个不同的图像吗?或者在Android系统中?我一直在找它,但我没有找到任何东西。帮帮我...

  • 我有时需要以直方图的形式显示图像数据的表示。我对访问图像数据的方法特别感兴趣。我熟悉,其中包括直方图支持,但我会考虑其他方法。

  • 问题内容: 有时我需要以直方图的形式显示图像数据的表示形式。我对访问图像数据的方式特别感兴趣。我熟悉,其中包括直方图支持,但我会考虑其他方法。 问题答案: 下面的示例使用多种技术来创建任意图像的RGB直方图: 该方法从中提取每个色带的值BufferedImage。 该方法将每个频段的计数添加到。 一个替换默认,如图所示这里。 定制提供每个系列所需的颜色;它包含半透明的颜色。 一种变型,讨论在这里,

  • 注:这是一个关于现代正则表达式口味可能性的问题。这不是用其他方法解决这个问题的最佳方法。它受到了前面一个问题的启发,但这个问题并不局限于正则表达式。 在ASCII“image”/art/map/string格式中: 我想找到三个s组成的简单垂直线: 图像中的行数是可变的,每行的宽度也是可变的。 使用正则表达式(PCRE/PHP, Perl,.NET或类似)是否有可能: 确定是否存在此类地层