Відповідність гістограми з використанням 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 +.


1

Як дика видумка; Я не впевнений, що вам потрібен PDF-файл, якщо у вас є дані підрахунку в категоріях ...
Чи можете ви перетворити підрахунки кожного значення для кожної різної гістограми в значення XY, а потім використовувати якийсь індикатор регресії для перевірки відповідності? Тобто, для двох ідеально однакових гістограм кореляційний аналіз забезпечив би і R квадрат 1,0.


0

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

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

Можливо, ви можете отримати деяке розуміння.

Він також обчислює cdf, як і ви, але, як я намагався, він піде з розуму, якщо ви будете обчислювати групу на групу, тож вам слід врахувати весь растр.

Схоже, ви втратили базовий кольоровий баланс та спектральний профіль. Крім того, є необхідність не рахувати жодних пікселів даних, треба вилучити потім із загального числа пікселів зображення, щоб обчислити pdf правильність.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.