여러 겹치는 래스터의 모자이크 처리 프로세스를 개선하기 위해 Python을 사용한 히스토그램 매칭?


11

여러 겹치는 래스터의 모자이크 처리 프로세스를 개선하기 위해 Python을 사용하여 히스토그램 일치를 시도하고 있습니다. 다음에서 찾은 코드를 기반으로합니다.

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

지금까지 인접한 두 래스터의 겹치는 영역을 잘라내어 배열을 평평하게했습니다.

길이가 같은 2 차원 배열이 2 개 있습니다.

그런 다음 위 웹 사이트에서 찾은 코드를 기반으로 다음 코드를 작성했습니다. 표시된 코드에서 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'를 올바르게 얻는 부분이 있다고 생각했습니다 ....하지만 'bd_hist'에서 분포 함수 'fi'를 사용할 때 gd 데이터 세트와 일치 시키려고하면 모두 배 모양이됩니다.

나는 수학자가 아니며 상당히 명백한 것을 간과했을 가능성이 높습니다.


히스토그램 일치에 대해서는 잘 모르지만 CDF의 합계는 1 (정의에 따라)이어야합니까? cdf_bd = np.cumsum(bd_hist) / float(np.sum(bd_hist))
Jeff G

답변:



1

사나운 퍼지로; 범주의 개수 데이터가있는 경우 PDF가 필요한지 확실하지 않습니다 ...
각 다른 히스토그램에 대한 각 값의 개수를 XY 값으로 변환 한 다음 일종의 회귀 표시기를 사용하여 일치하는지 확인할 수 있습니까? 즉, 두 개의 완전히 동일한 히스토그램의 경우 상관 관계 분석에서 1.0의 R 제곱이 제공됩니다.


0

일부 샘플 데이터는 sat마다 다를 수 있으므로 좋을 것입니다. 다음은 히스토그램을 동일하게 만들기 위해 만든 간단한 스크립트입니다.

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

어쩌면 통찰력을 얻을 수 있습니다.

그것은 또한 당신이하는 것처럼 cdf를 계산하지만, 내가 시도한대로 대역 당 대역을 계산하면 미쳐 버릴 것이므로 전체 래스터를 고려하십시오.

색상 참조 균형 및 스펙트럼 프로파일이 느슨한 것처럼 보입니다. 또한 데이터 픽셀을 계산할 필요가 없으며, PDF를 올바르게 계산하려면 총 이미지 픽셀 수에서 제거해야합니다.

일부 테스트 후 3-4 밴드 Landsat8에 대한 전체 래스터 접근 방식을 사용하고 16 비트에서 8 비트 0-255 범위로 변환하는 시각적 결과가 마음에 들었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.