Rozwiązania: Różnice pomiędzy wersjami

Z Brain-wiki
(Utworzono nową stronę "<source lang=python> # -*- coding: UTF-8 -*- ## (c) Tomasz Steifer 2016 ## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/Klasyczna_rekonstrukcja import numpy a...")
 
(UWAGA! Usunięcie treści (strona pozostała pusta)!)
 
Linia 1: Linia 1:
<source lang=python>
 
# -*- coding: UTF-8 -*-
 
## (c) Tomasz Steifer 2016
 
## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/Klasyczna_rekonstrukcja
 
  
import numpy as np
 
import pylab as py
 
 
import scipy.signal as ss
 
 
f0=5.5e6 # Transducer center frequency [Hz]
 
fs=50e6 # Sampling frequency [Hz]
 
 
 
c=1490. # Speed of sound [m/s]
 
pitch=0.00021 #Transducer's pitch
 
NT=192 # Number of full aperture elements
 
Nrec=64 #Number of receive events/lines
 
Ntr=64 # Transmit subaperture
 
Rf1 = 40*(1e-3) #depth of focal point
 
 
fname="usg1_bf_nitki.npy" #numpy file with RF data from Ultrasound Research Platform
 
 
RF=np.load(fname)
 
Mz=np.shape(RF)[1]
 
##reminder about data:
 
##first dimension -> receive transducers //Nrec
 
##second dimension -> time of acquisition ~ depth
 
##third dimension -> transmit event  // (NT - Ntr)
 
 
#First, we need to generate transmit delays - to be used in reconstruction
 
 
transmit_delays = -(np.arange(Ntr)-(float(Ntr)/2-0.5))*pitch
 
transmit_delays = (np.sqrt(transmit_delays**2+Rf1**2)-Rf1)/c*fs
 
 
#For sake of clarity, beamforming is performed in loops
 
image=np.zeros((NT-Ntr,Mz)) #
 
tmp=np.zeros((Mz,Ntr))
 
for line in range(NT-Ntr):
 
    for k in range(Nrec):
 
        tmp0=RF[line+k,transmit_delays[k]:Mz+transmit_delays[k],line]
 
        tmp[:len(tmp0),k]=tmp0
 
    tmp2=np.mean(tmp,axis=1)
 
    image[line,:len(tmp2)]=tmp2
 
 
#Some simple filters
 
b, a = ss.butter(10, 0.05, 'highpass')   
 
image = ss.filtfilt(b, a, image,axis=1)
 
b, a = ss.butter(10, 0.7, 'lowpass')   
 
image = ss.filtfilt(b, a, image,axis=1)
 
 
 
#We need to interpolate the image
 
xx=np.linspace(-(NT - Ntr)/2.*pitch,((NT - Ntr))/2.*pitch,(NT - Ntr)) #old x scale
 
zz=np.linspace(0,np.shape(image)[1]/2*(1./fs)*c,np.shape(image)[1]) #old depth scale
 
from scipy import interpolate
 
#f=interpolate.interp2d(xx,zz,image,kind='cubic')
 
f=interpolate.interp2d(xx,zz,image.transpose(),'cubic')
 
 
#new (natural) grid
 
step=c/(2*f0)
 
step=step/4
 
maxdepth=np.max(zz)
 
mindepth=0.005 #try to set minimal depth to 0 and see what happens
 
maxWidth=0.01
 
minWidth=0.01
 
 
X0 = np.arange(-minWidth,maxWidth,step)#.reshape((-1,1))
 
R0 = np.arange(mindepth,maxdepth,step)
 
 
#and interpolation
 
image=f(X0,R0)
 
 
#Lastly, envelope detection using Hilbert transform
 
image=np.abs(ss.hilbert(image,axis=0))
 
 
low=50 #lower bound for dB scale
 
 
#and log-conversion etc <- this may also be done by appropriate matplotlib methods
 
indices = image>0
 
indices2 =image<0
 
indices = indices+indices2
 
image=np.abs(image)/np.max(np.abs(image[indices]))
 
image[indices]=10*np.log(image[indices])
 
 
indices = indices <-low
 
image[indices]=-low
 
indices = image>=0
 
image[indices]=0
 
 
#Let's have a look:
 
py.imshow(image,cmap="gray")
 
py.show()
 
 
</source>
 
 
<source lang=python>
 
# -*- coding: UTF-8 -*-
 
## (c) Tomasz Steifer 2016
 
## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/PWI
 
 
import numpy as np
 
import pylab as py
 
 
import scipy.signal as ss
 
 
f0=5.5e6 # Transducer center frequency [Hz]
 
fs=50e6 # Sampling frequency [Hz]
 
 
 
c=1490. # Speed of sound [m/s]
 
pitch=0.00021 #Transducer's pitch
 
NT=192 # Number of full aperture elements
 
Nrec=192 #Number of receive events/lines
 
Ntr=192 # Transmit subaperture
 
Rf1 = 1000 #depth of focal point *-1
 
Theta = [ -1.74532925e-01 , -1.39626340e-01,  -1.04719755e-01,  -6.98131701e-02,
 
  -3.49065850e-02,  -2.77555756e-17,  3.49065850e-02 ,  6.98131701e-02,
 
  1.04719755e-01  , 1.39626340e-01  , 1.74532925e-01] #Transmit angles
 
 
fname="usg2_pwi_nitki.npy" #numpy file with RF data from Ultrasound Research Platform
 
 
RF=np.load(fname)
 
RF=np.transpose(RF,[1,0,2])
 
Mz=np.shape(RF)[1]
 
##reminder about data:
 
##first dimension -> receive transducers //Nrec
 
##second dimension -> time of acquisition ~ depth
 
##third dimension -> transmit event  // (NT - Ntr)
 
 
#First, we need to generate transmit delays - to be used in reconstruction
 
transmit_delays = np.zeros((len(Theta), Ntr))
 
 
for m in xrange(len(Theta)):
 
    for n in xrange(Ntr):       
 
        Xf = -1*Rf1*np.sin(Theta[m]) - ( n - (Ntr/2-0.5) )*pitch
 
        transmit_delays[m,n] = (np.sqrt(Xf**2 + (Rf1*np.cos(Theta[m]))**2) - Rf1)
 
    transmit_delays[m,:] = transmit_delays[m,:]
 
 
#Function for reconstruction
 
def pwi_shift(matrix,gridx,gridz,theta,fs,c,pitch,startdepth):
 
    #Reconstruction for one angle
 
    Nrec=np.shape(matrix)[1]
 
    out=np.zeros((len(gridz),len(gridx),Nrec))
 
    gridx,gridz = np.meshgrid(gridx,gridz,indexing='xy')
 
    shift_tr=(gridx*np.sin(theta)+gridz*np.cos(theta) )/c*fs
 
    for nrec in xrange(Nrec):
 
        Rec_delay=np.sqrt(gridz**2+(gridx-(-(float(Nrec)/2-1./2)*pitch + nrec*pitch))**2)/c
 
        shift_rec=Rec_delay*fs
 
        indx=(shift_tr+shift_rec+startdepth).astype(np.int)
 
        out[:,:,nrec]=matrix[:,nrec][indx]
 
    return out
 
 
def pwi(matrix,gridx,gridz,angles,fs,c,pitch):
 
    out=np.zeros((len(gridz),len(gridx),len(angles)))
 
    for angle in xrange(len(angles)):
 
        startdepth=1/2.*(np.max(np.abs(transmit_delays[angle,:]))*fs/c)+15 #start sample shift
 
        shifted=pwi_shift(matrix[:,:,angle],gridx,gridz,angles[angle],fs,c,pitch,startdepth)
 
        indices=np.abs(shifted)>0
 
        divs=np.ones(np.shape(shifted))
 
        divs[indices]=shifted[indices]/shifted[indices]
 
        divs=np.sum(divs,axis=2)
 
        out[:,:,angle]=np.sum(shifted,axis=2)/divs
 
    return out
 
 
#grid
 
step=c/(2*f0)
 
step=step/4
 
maxdepth=(np.shape(RF)[0]*c/fs) *0.3
 
mindepth=0.005 #try to set minimal depth to 0 and see what happens
 
maxWidth=0.01
 
minWidth=0.01
 
 
X0 = np.arange(-minWidth,maxWidth,step)#.reshape((-1,1))
 
R0 = np.arange(mindepth,maxdepth,step)
 
 
#Some simple filters
 
b, a = ss.butter(3, (f0-(0.5*f0))/(0.5*fs), 'highpass')   
 
RF = ss.filtfilt(b, a, RF,axis=0)
 
b, a = ss.butter(3, (f0+(0.5*f0))/(0.5*fs), 'lowpass')   
 
RF = ss.filtfilt(b, a, RF,axis=0)
 
 
image = np.mean(pwi(RF,X0,R0,Theta,fs,c,pitch),axis=2)
 
 
 
#Lastly, envelope detection using Hilbert transform
 
image=np.abs(ss.hilbert(image,axis=0))
 
 
low=50 #lower bound for dB scale
 
 
#and log-conversion etc <- this may also be done by appropriate matplotlib methods
 
indices = image>0
 
indices2 =image<0
 
indices = indices+indices2
 
image=np.abs(image)/np.max(np.abs(image[indices]))
 
image[indices]=10*np.log(image[indices])
 
 
indices = indices <-low
 
image[indices]=-low
 
indices = image>=0
 
image[indices]=0
 
 
#Let's have a look:
 
py.imshow(image,cmap="gray")
 
py.show()
 
 
 
</source>
 
 
<source lang=python>
 
## (c) Tomasz Steifer 2016
 
## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/Doppler
 
import numpy as np
 
import pylab as py
 
import scipy.signal as sig
 
 
 
 
 
def demodulate(array,f=5.5e6, ar = 3.079291762894534e-05 ):
 
    t=np.arange(np.shape(array)[0])*(2.*ar/1540)
 
    e=np.exp(-1j*2*np.pi*f*t)
 
    niuarray=np.zeros(np.shape(array))+0j
 
    for y in range(np.shape(array)[1]):
 
        for z in range(np.shape(array)[2]):
 
            niuarray[:,y,z]=array[:,y,z]*e
 
    return niuarray
 
 
 
 
def autocorr_freq(array):
 
    r=np.sum(array[1:]*np.conj(array[:-1]))
 
    return np.arctanh(r.imag/r.real)
 
   
 
 
def doppler(array):
 
    newarray=np.zeros(np.shape(array)[:2])
 
    for x in range(np.shape(array)[0]):
 
        for y in range(np.shape(array)[1]):
 
            newarray[x,y]=autocorr_freq(array[x,y,:])
 
    return newarray
 
 
def moda(array):
 
    return np.average(np.arange(len(array)),weights=array)
 
 
 
 
big=np.load("usg3_doppler_circle_10lh.npy")
 
 
 
big=big[:,:,:]
 
 
IQbig=demodulate(big)
 
import scipy.signal as sig
 
b, a = sig.butter(3, 5.5/9, 'lowpass')   
 
IQbig = sig.filtfilt(b, a, IQbig,axis=0)
 
 
low=60
 
Vmax=np.abs(big)
 
indices = Vmax>0
 
indices2= Vmax<0
 
indices= indices+indices2
 
Vmax=np.abs(Vmax)/np.max(np.abs(Vmax[indices]))
 
Vmax[indices] = 10*np.log(Vmax[indices])
 
 
indices = Vmax <-low
 
Vmax[indices]=-low
 
indices = Vmax >= 0
 
Vmax[indices]=np.min(Vmax)
 
RFbig=Vmax
 
 
print np.shape(RFbig)
 
 
py.subplot(2,1,1)
 
py.imshow(RFbig[:,:,0])
 
py.subplot(2,1,2)
 
flow=doppler(IQbig)
 
py.imshow(sig.medfilt2d(flow))
 
py.show()
 
       
 
</source>
 
 
<source lang=python>
 
## (c) Tomasz Steifer 2016
 
## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/Parametryczne
 
#Input: RF images taken from two different angles
 
def korelacje(ar1,ar2,d):
 
    a,b=np.shape(ar1)
 
    out=np.zeros(np.shape(ar1))
 
    for x in xrange(a):
 
        for y in xrange(d/2,b-d-1):
 
            out[x,y]=np.argmax(np.correlate(ar1[x,y:y+d],ar2[x,y:y+d],mode="same"))
 
    return out
 
</source>
 
 
<source lang=python>
 
## solutions to http://brain.fuw.edu.pl/edu/index.php/USG/GPU
 
kernels="
 
        __kernel void funkcja(__global float *a, __global float *b, __global float *out,)
 
        {
 
        //zaczynamy od zadeklarowania zmiennych
 
        const int n = get_global_id(0); //indeks w pierwszym wymiarze danej jednostki roboczej
 
        const int m = get_global_id(1); //indeks w drugim wymiarze danej jednostki roboczej
 
        const int M = get_global_size(1);
 
        const int nm = n*M + m; // indeks w tablicy wyjsciowej odpowiadajacy wartości o współrzędnych (n,m)
 
        a[nm] = ceil(sqrt(a[nm]*a[nm]));
 
        b[nm] = ceil(sqrt(b[nm]*b[nm]));
 
        int c;
 
        while ( a != 0 ) {
 
          c = a[nm]; a[nm] = b[nm]%a[nm];  b[nm] = c;
 
        }
 
        out[nm]=b[nm];
 
        }
 
"
 
</source>
 

Aktualna wersja na dzień 08:57, 29 lip 2016