我正在尝试匹配两个图像的直方图(在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或类似)是否有可能: 确定是否存在此类地层