USG/Klasyczna rekonstrukcja

Z Brain-wiki

Klasyczna rekonstrukcja obrazu

Schemat nadawczy jest następujący. W [math]n[/math]-tej przetworniki subapertury nadawczej generują wiązkę o stałym ognisku. Subaperturę tworzą przetworniki od [math]n[/math]-tego do [math](n+N_{tr})[/math]-tego (gdzie [math]N_{tr}[/math] - to liczba przetworników subapertury nadawczej). Zakładamy, że ognisko położone jest w linii prostej od środka subapertury nadawczej. Kształt wiązki otrzymujemy przez zastosowanie odpowiednich opóźnień nadawczych pomiędzy przetwornikami. Od momentu nadania wszystkie przetworniki (pełna apertura) rejestrują sygnał. Rejestracja sygnału trwa do zadanego momentu (określonego przez głębokość pomiarową jaką chcemy zbadać). W naszym przypadku subapertura nadawcza przesuwana jest w kolejnych chwilach o 1 przetwornik.

Parametry potrzebne do dalszej pracy:

f0=5.5e6 # Częstotliwość nadawcza przetworników [Hz]
fs=50e6 # 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=64 # Subapertura nadawcza

Rf1= 40*(1e-3) # Położenie ogniska wiązki nadawczej od środka subapertury nadawczej

Ponadto, do rekonstrukcji wykorzystywać będziemy prędkość dźwięku w ośrodku. Zakładamy, że jest ona stała. Dla pomiarów w fantomie cystowym proszę założyć

c=1540

zaś dla pomiarów w fantomie nitkowym

c=1490 # prędkość dźwięku w wodzie destylowanej

Będziemy korzystać z bibliotek:

import numpy as np
import pylab as py
import scipy.signal as sig

Dane RF

Do dyspozycji mamy dwa zestawy danych RF z pomiarów na fantomie nitkowym (plik usg1_nitki.npy) i na fantomie cystowym (plik usg2_cysty.npy). Zaczniemy od wczytania oraz podejrzenia surowych danych RF (przed rekonstrukcją obrazu). Dane możemy wczytać za pomocą poleceń

RF=np.load('usg1_nitki.npy')

Dostaliśmy tablicę o wymiarach [math]NT\times N \times NT-N_{tr} [/math] gdzie [math]N[/math] odpowiada czasowi rejestracji danych z pojedynczego nadania. Proszę podejrzeć dane zebrane dla kilku strzałów (np. pierwszego i ostatniego). Dla przejrzystości proszę podejrzeć jedynie pierwsze 300 próbek:

py.subplot(2,1,1)
py.imshow(RF[:,:300,0]
py.subplot(2,1,2)
py.imshow(RF[:,:300,-1]
py.show()

Jak zmieniają się sygnały między kolejnymi strzałami? Czy na podstawie samych surowych danych widoczna jest oczekiwana struktura (obrazowane obiekty)? Jak zmienia się energia sygnałów dla różnych przetworników odbiorczych zależnie od odległości od środka subapertury?

Opóźnienia nadawczo-odbiorcze

Z danych zebranych dla pojedynczego nadania rekonstruować będziemy pojedynczą linię obrazu. Wykorzystamy do tego sygnału z tych samych przetworników, które nadawały (niepelna apertura odbiorcza). Wartość natężenia pojedynczego piksela otrzymamy sumując sygnały z tych przetworników przesunięte zgodnie z określonymi opóźnieniami odbiorczymi. Sygnał [math]S_{(i,j)}[/math] dla piksela w [math]i[/math]-tej linii i głębokości [math]j[/math] otrzymujemy jako

[math]S_{(i,j)}=\sum^{N_{tr}-1}_{k=0} s_{i,k}(j+t_{i}(k)))[/math]

gdzie [math]s_{i,k}(t)[/math] - sygnał z [math]i[/math]-tego nadania i [math]k[/math]-tego przetwornika w chwili [math]t[/math];
[math]t_{i}(k)[/math] - opóźnienie nadawczo-odbiorcze [math]k[/math]-tego przetwornika w [math]i[/math]-tym nadaniu.

W klasycznej metodzie do rekonstrukcji wykorzystujemy takie same opóźnienia jak te użyte przy nadawaniu. Proszę napisać funkcję generującą tablicę opóźnień dla subapertury nadawczej. Proszę przyjać, że punkt [math](0,0)[/math] znajduje się w środku subapertury. Funkcja powinna dla zadanej liczby przetworników i odległości ogniska położonego w punkcie [math](x,y)[/math] generować tablicę opóźnień zgodnie z prostym wzorem: