Как оценить движение с помощью FTT и кросс-корреляции? - PullRequest
0 голосов
/ 09 апреля 2020

Я работаю над оценкой смещения облаков для целей энергии ветра с помощью спутниковых снимков 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))  

enter image description here

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?
...