Я работаю над оценкой смещения облаков для целей энергии ветра с помощью спутниковых снимков RGB GOES. Для достижения этой цели я нахожу следующую методологию из этой статьи «Автоматизированный метод получения движения облаков из геосинхронных спутниковых данных с использованием кросс-корреляции». Я не знаю, если это хороший способ вычислить это. Код в основном получает корреляцию от преобразования Фурье для расчета смещения облака между roi_a
и roi_b
изображениями.
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img_a = cv.imread('2019.1117.1940.goes-16.rgb.tif', 0)
img_b = cv.imread('2019.1117.1950.goes-16.rgb.tif', 0)
roi_a = img_a[700:900, 1900:2100]
roi_b = img_b[700:900, 1900:2100]
def Fou(image):
fft_roi= np.fft.fft2(image)
return fft_roi
def inv_Fou(C_w):
c_t = np.fft.ifft2(C_w)
c_t = np.abs(c_t)
return c_t
#Step 1: gets the FFT
G_t0 = Fou(roi_a)##t_0
fft_roiA_conj = np.conj(G_t0) #Conjugate
G_t1 = Fou(roi_b)##t_1
#Step 2: Compute C(m, v)
prod = np.dot(fft_roiA_conj, G_t1)
#Step 3: Perform the inverse FFT
inv = inv_Fou(prod)
plt.imshow(inv, cmap = 'gray', )
plt.title('C (m,v) --> Cov(p,q)')
plt.xticks([])
plt.yticks([])
plt.show()
#Step 4: Compute cross correlation coefficient and the maximum cross correlation coefficient
def rms(sigma):
"Compute the standar deviation of an image"
rms = np.std(sigma)
return rms
R_t = inv / (rms(roi_a) * rms(roi_b))
This Впервые я использую FFT для изображений, поэтому у меня есть несколько вопросов по этому поводу:
- Я не добавляю fftshift, это может повлиять на результат?
- Что такое Разница между использованием np.dot на шаге 2 и простым '*', например
prod = fft_roiA_conj * G_t1
- Как интерпретировать результат изображения (C (m, v) -> Cov (p, q)) из шаг 3?
- Как получить максимальный коэффициент p 'и q' (максимальный коэффициент по направлениям x и y) из
R_t
?