Сопоставление гистограммы с использованием Python для улучшения процесса мозаики нескольких перекрывающихся растров?

11

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

http://www.idlcoyote.com/ip_tips/histomatch.html

На сегодняшний день мне удалось обрезать перекрывающуюся область двух смежных растров и сгладить массив.

поэтому у меня есть два одномерных массива одинаковой длины.

Затем я написал следующий код, основанный на том, что находится на вышеуказанном сайте. В показанном коде я заменил два очень маленьких набора данных для изображений gd и bd.

import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

bins = range(0,100, 10)

gd_hist = [1,2,3,4,5,4,3,2,1]

bd_hist = [2,4,6,8,10,8,6,4,2]

nPixels = len(gd_hist)

# here we are creating the cumulative distribution frequency for the bad image
cdf_bd = []
for k in range(0, len(bins)-1):
    b = sum(bd_hist[:k]) 
    cdf_bd.append(float(b)/nPixels)

# here we are creating the cumulative distribution frequency for the good image
cdf_gd = []
for l in range(0, len(bins)-1):
    g = sum(gd_hist[:l])
    cdf_gd.append(float(g)/nPixels) 


# we plot a histogram of the number of 
plt.plot(bins[1:], gd_hist, 'g')
plt.plot(bins[1:], bd_hist, 'r--')
plt.show()        

# we plot the cumulative distribution frequencies of both images
plt.plot(bins[1:], cdf_gd, 'g')
plt.plot(bins[1:], cdf_bd, 'r--')
plt.show()

z = []
# loop through the bins
for m in range(0, len(bins)-1):

    p = [cdf_bd.index(b) for b in cdf_bd if b < cdf_gd[m]] 
    if len(p) == 0:
        z.append(0)
    else:
        # if p is not empty, find the last value in the list p
        lastval = p[len(p)-1]

        # find the bin value at index 'lastval'
        z.append(bins[lastval])

plt.plot(bins[1:], z, 'g')
plt.show()

# look into the 'bounds_error'
fi = interp1d(bins[1:], z, bounds_error=False, kind='cubic')  
plt.plot(bins[1:], gd_hist, 'g')
plt.show
plt.plot(bins[1:], fi(bd_hist), 'r--')
plt.show()

Моя программа успешно строит гистограммы и кумулятивные распределения частот ... и я подумал, что у меня есть часть получения правильной функции преобразования "z" .... но потом, когда я использую функцию распределения "fi" для "bd_hist" чтобы попытаться сопоставить его с набором данных gd, все становится грушевидным.

Я не математик, и очень вероятно, что я упустил что-то довольно очевидное.

Бекки
источник
Я не знаю много о сопоставлении гистограммы, но нужно ли, чтобы ваши CDF суммировали до 1 (по определению)? cdf_bd = np.cumsum(bd_hist) / float(np.sum(bd_hist))
Джефф Дж.

Ответы:

2

Хотя я не могу прокомментировать предлагаемую реализацию, вы можете проверить существующую реализацию сопоставления гистограмм, выполненную для GRASS GIS 7 (здесь дополнение):

https://trac.osgeo.org/grass/browser/grass-addons/grass7/imagery/i.histo.match

Руководство и пример см.

http://grass.osgeo.org/grass70/manuals/addons/i.histo.match.html

Код опубликован под лицензией GPL2 +.

markusN
источник
1

Как дикая выдумка; Я не уверен, что вам нужен PDF, если у вас есть данные подсчета в категориях ...
Не могли бы вы преобразовать счетчики каждого значения для каждой отдельной гистограммы в значения XY, а затем использовать какой-нибудь индикатор регрессии, чтобы проверить это совпадение? Т.е. для двух совершенно одинаковых гистограмм корреляционный анализ обеспечил бы и R в квадрате 1,0.

Мох
источник
0

некоторые примеры данных были бы хорошими, так как они могут варьироваться от спутника к спутнику. Вот один простой скрипт, который я сделал в попытке выровнять гистограммы:

https://github.com/rupestre-campos/histogram_equalize

Может быть, вы можете получить некоторое представление.

Он также вычисляет cdf, как и вы, но, как я уже пытался, он сойдет с ума, если вы вычисляете группу на группу, поэтому вы должны рассмотреть весь растр.

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

После некоторого тестирования мне понравились визуальные результаты с использованием всего растрового подхода к 3-4 полосам Landsat8 и преобразованием из 16-битного в 8-битный диапазон 0-255.

CKC
источник