python双重直方图_Python 2.x中两个图像的直方图匹配?

我之前写了一个答案

here,解释了如何对图像直方图进行分段线性插值,以强制执行高光/中间调/阴影的特定比例.

两幅图像之间的基本原理基于histogram matching.基本上,您计算源图像和模板图像的累积直方图,然后线性插值以查找模板图像中与源图像中唯一像素值的分位数最匹配的唯一像素值:

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)

例如:

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)

GWtt1.jpg

对于一对RGB图像,您可以将此功能分别应用于每个颜色通道.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值