Гистограмма соответствия двух изображений в Python 2.x?

Я пытаюсь сопоставить гистограммы двух изображений (в MATLAB это можно сделать с помощью imhistmatch ). Существует ли эквивалентная функция, доступная из стандартной библиотеки Python? Я посмотрел на OpenCV, scipy и numpy, но не вижу подобных функций.

One Solution collect form web for “Гистограмма соответствия двух изображений в Python 2.x?”

Ранее я написал ответ, объясняющий, как делать кусочно-линейную интерполяцию на гистограмме изображения, чтобы обеспечить соблюдение определенных соотношений бликов / полутонов / теней.

Те же основные принципы лежат в основе сопоставления гистограммы между двумя изображениями. По сути, вы вычисляете накопленные гистограммы для ваших исходных и шаблонных изображений, затем интерполируйте линейно, чтобы найти уникальные значения пикселей в изображении шаблона, которые наиболее точно соответствуют квантилям уникальных значений пикселей в исходном изображении:

 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) 

введите описание изображения здесь

Для пары изображений RGB вы можете применить эту функцию отдельно к каждому цветному каналу.

  • Изменение размера изображения на экране
  • Что означает «три точки» в Python при индексировании того, что выглядит как число?
  • Начать: прекратить нарезку несоответствий между numpy и Pandas?
  • mrdivide в MATLAB: что он делает, и как я могу это сделать в Python?
  • Функция качания python pandas с двумя аргументами
  • Множество структурированных массивов по имени и индексу
  • Ошибка в номере: недопустимое значение
  • Скорость Cython и numpy
  •  
    Interesting Posts for Van-Lav

    Сохранение файлов, загруженных из Urlretrieve, в другую папку

    pyrouge: «pyrouge_set_rouge_path» не распознается как внутренняя или внешняя команда

    Являются ли кортежи более эффективными, чем списки в Python?

    Как подключить удаленный отладчик к процессу Python?

    Где происходит повышение производительности реализации реализации карт или списков над вызовом функции через цикл?

    найти минимальное значение в массиве поплавков

    python: что лучший способ проверить несколько ключей в словаре?

    Исправляемый поток регулярного выражения Python

    Ошибка «израсходована ресурс» при попытке обучения модели Keras

    Как удалить лишние пробелы из строк при разборе файла csv в Pandas?

    Project Euler – # 1 Неправильное решение Python

    Замораживание контура не показывает все установленные пакеты

    Механизм Google-приложений не может создавать очереди задач больше, чем экземпляры back end, определенные в backends.yaml в приложении Google.

    Как перенаправить вывод регистратора в текстовый виджет PyQt

    Практика BDD с python

    Python - лучший язык программирования в мире.