USG/Doppler

Z Brain-wiki

Metoda dopplerowska

Do dyspozycji mamy zestaw danych RF z 31 kolejnych nadań pod stałym kątem (zerowym) falą płaską o parametrach: UWAGA: te parametry niekoniecznie sa zgodne z Prawdą.

f0=5.5e6 # Częstotliwość nadawcza przetworników [Hz]
fs=9e6 # Częstotliwość próbkowania [Hz]
pitch = 0.00021 # Deklarowana odległość między środkami przetworników nadawczo-odbiorczych

NT=192 # Liczba przetworników w pełnej aperturze
Ntr=192 # subapertura nadawcza

Obrazowany jest przekrój fantomu przepływowego złożonego z rurek umieszczonych w materiale tkankopodobnym. Pompa wywołuje przepływ o stałym natężeniu płynu krwiopodobnego znajdującego się w rurkach. Będziemy starali się wykorzystać metodę dopplerowską do stworzenia mapy obrazujacej zwrot i względne natężenie przepływu. Średnie odchylenie dopplerowskie szacować będziemy przy użyciu estymatora autokorelacyjnego.

Demodulacja danych

Estymator autokorelacyjny stosowany jest do danych zdemodulowanych (IQ). Demodulację możemy przeprowadzić zarówno na danych surowych, jak i na danych po rekonstrukcji. W naszym wypadku zastosujemy to drugie rozwiązanie. Na początku musimy zrekonstruować 31 obrazów (z pełną dynamiką jasności, przed liczeniem obwiedni) - proszę wykorzystać w tym celu funkcje przygotowane na poprzednich zajęciach.

Następnie stworzymy funkcję dokonującą demodulacji każdego z obrazów, tj. dla każdego próbki o współrzędnych [math](x,y)[/math]
[math]IQ(x,y)= RF(x,y)\cdot e^{-i\cdot2\pi f_{0}t} [/math] gdzie [math]IQ[/math] - sygnał po demodulacji; [math]RF[/math] - sygnał przed demodulacją; [math]t[/math] - czas odpowiadający momentowi akwizycji próbki z danej głębokości; możemy przyjąć uproszczone założenie, że: [math]t= 2y/c [/math]; jak widać, pierwszy wymiar (szerokość) jest w naszej procedurze nieistotny. Po demodulacji dane należy przefiltrować. W naszym wypadku wystarczający powinien być filtr dolnoprzepustowy o częstotliwości odcięcia równej 5.55 MHz

Estymator autokorelacyjny

Następnie przygotowujemy skrypt realizujący estymator autokorelacyjny. Dotychczas traktowaliśmy nasze obrazy jako dwuwymiarowy sygnał. Na potrzeby estymacji mapy prędkości uwzględnić musimy jeszcze wymiar czasowy. Dla danego punktu (ustalona głębokość i szerokość) estymator szacuje średnią częstotliwość w oknie czasowym długości [math]N[/math] jako

[math]f_s=\mbox{arctan}\frac{Im(\sum^{N-2}_{i=0}s(i)\cdot \overline{s(i+1)}}{Re(\sum^{N-2}_{i=0}s(i)\cdot \overline{s(i+1)})} [/math]

Tak otrzymaną estymatę średniego przesunięcia [math]\Delta f=f_0-f_s[/math] dopplerowskiego możemy wykorzystać do obliczenia średniej prędkości przy szkolnego wzoru Dopplera:

[math]\Delta f=\frac{2f_{0}v\mbox{cos}\theta}{c}[/math]

gdzie [math]v[/math] średnia prędkość w punkcie pomiarowym; [math]\theta[/math] kąt między kierunkiem przepływu a wiązką nadawczą. Należy mieć na uwadzę, że w praktyce ciężko mówić o estymacji prędkości w punkcie, ponieważ w naszej procedurze estymacji uwzględniamy efektywnie informacje z pewnego niepunktowego obszaru pomiarowego.

Prezentacja Color

Po wyestymowaniu średnich prędkości w obszarach odpowiadających punktom na siatce użytej do rekonstrukcji obrazu, możemy nałożyć taką mapę na obraz BMode w celu uzyskania obrazu Color. Mając tablicę z danymi BMode oraz tablicę prędkości, możemy otrzymać połączony obraz za pomocą poniższego skryptu:

 
#BMode - tablica zrekonstruowanych danych po przefiltrowaniu, obwiedni itp.
#flow - tablica przepływów
Frame = Image.fromarray(np.uint8(cm.bone(BMode)*255)) 
flowMask=np.copy(flow)
flowMask=np.abs(flowMask)
flowMask=flowMask/(np.max(flowMask))*255

flow=flow+np.abs(np.min(flow))
flow=flow/np.max(flow)

flow=Image.fromarray(np.uint8(cm.jet(flow)*255))
flowMask=Image.fromarray(np.uint8(flowMask),'L')
flow.putalpha(flowMask)
        
Frame.paste(flow,(0,0),flow)