def MRI_ACR_main(data, results, **kwargs): acr_test_dict = { 'ACR_GA_l': ACR_GA_l, 'ACR_GA_wh': ACR_GA_wh, 'ACR_GA_whd': ACR_GA_whd, 'ACR_STA': ACR_STA, 'ACR_IIU': ACR_IIU, 'ACR_HCSR': ACR_HCSR, 'ACR_SPA': ACR_SPA, 'ACR_Ghosting': ACR_Ghosting } params = kwargs.get('params', None) print(data.series_filelist) if len(data.getAllInstances()) > 0: tmpfile = data.getAllInstances()[0] for child in params: print('Performing', child.text) if child.text in acr_test_dict.keys(): try: acr_test_dict[child.text]( tmpfile, tmpfile.pixel_array, results, label=tmpfile.SeriesDescription.replace(' ', '_')) except: pass
def MRI_ACR_main(data,results, **kwargs): acr_test_dict = { 'ACR_STA':ACR_STA, 'ACR_IIU':ACR_IIU, 'ACR_HCSR':ACR_HCSR, 'ACR_SPA':ACR_SPA, 'ACR_Ghosting':ACR_Ghosting } params = kwargs.get('params', None) print(data.series_filelist) if len(data.getAllInstances())>0: tmpfile = data.getAllInstances()[0] for child in params: print child.text if child.text in acr_test_dict.keys(): try: acr_test_dict[child.text](tmpfile,tmpfile.pixel_array,results) except: pass
def fluoroscopydistortion(data, results, **kwargs): ''' Function receives an image of a grid and calculates S-distortion and Pincushion distortion. ''' relevantfile = data.getAllInstances()[0] #Read DCM file, threshold to separate grid from background rawdata = relevantfile pixeldata = rawdata.pixel_array array_np = np.asarray(pixeldata) size = array_np.shape[0] if size != 512: print 'Resizing image array...' array_np = scipy.misc.imresize(array_np, (512, 512)) size = array_np.shape[0] forexport = array_np mean_pixel = np.mean(pixeldata) high_values_indices = array_np > mean_pixel low_values_indices = array_np <= mean_pixel zero_values_indices = array_np == 0 array_np[high_values_indices] = 2 array_np[low_values_indices] = 1 array_np[zero_values_indices] = 0 resultxml = [] #Define an area for peak detection, resize image matrix if other than 512x512 area = 10 #Plot resized and threholded image plt.imshow(array_np) plt.show() #print (array_np==1).sum() #Detect intersections by adjacent cell values dimensionrange = range(size) xarray = [0] yarray = [0] for i in dimensionrange: for j in dimensionrange: if array_np[i, j] == 1: if array_np[i, j - 3] == 1 and array_np[ i, j - 2] == 1 and array_np[i, j - 1] == 1 and array_np[ i, j + 1] == 1 and array_np[i, j + 2] == 1 and array_np[ i, j + 3] == 1 and array_np[ i - 3, j] == 1 and array_np[ i - 2, j] == 1 and array_np[ i - 1, j] == 1 and array_np[ i + 1, j] == 1 and array_np[ i + 2, j] == 1 and array_np[ i + 3, j] == 1: xarray.append(i) yarray.append(j) dotsarray = np.zeros((size, size)) dotsarray[xarray, yarray] = 1 #plt.imshow(dotsarray) #plt.show() #Detect peaks and plot coordinates = corner_peaks(dotsarray, min_distance=area) plt.scatter(coordinates[:, 1], coordinates[:, 0]) plt.show() #Find center row in grid, sort peaks from left to right, find central peak and determine grid rotation (subsetx, subsety) = xselector(coordinates, size / 2, 15) (subsety, subsetx) = [ list(x) for x in zip(*sorted(zip(subsety, subsetx), key=lambda pair: pair[0])) ] location = findcenter(subsety, size) rotation = math.degrees( math.atan( (float(subsetx[location - 2]) - float(subsetx[location + 2])) / (float(subsety[location - 2]) - float(subsety[location + 2])))) print rotation #Rotate image to correct for grid rotation and plot corrected peaks rotateddotsarray = scipy.misc.imrotate(dotsarray, rotation, interp='bilinear') rotatedcoordinates = corner_peaks(rotateddotsarray, min_distance=area) plt.scatter(rotatedcoordinates[:, 1], rotatedcoordinates[:, 0]) plt.show() #Find center row in rotated grid (subsetx, subsety) = xselector(rotatedcoordinates, size / 2, 15) (subsety, subsetx) = [ list(x) for x in zip(*sorted(zip(subsety, subsetx), key=lambda pair: pair[0])) ] #Determine position of central line to aid in finding consecutive lines in grid centralline = np.mean(subsetx) #find central peak of rotated grid location = findcenter(subsety, size) ycenter = subsetx[location] xcenter = subsety[location] print np.diff(subsety) #Determine unit size of grid in center of image #unitsize= np.amin(np.nonzero(np.diff(subsety))) unitsize = (subsety[location + 1] - subsety[location - 1]) / 2 print unitsize #Determine the squares x squares area of grid investigated #squares=6 squares = int(math.floor((0.60 * 512) / unitsize)) / 2 print squares #Determine distortion in x direction to aid in finding consecutive lines in grid xdistortion = (float(subsety[location + squares]) - float( subsety[location - squares])) / (2 * squares * unitsize) #Determine grid points in lower part of image (subsetx, subsety) = xselector(rotatedcoordinates, centralline - squares * unitsize * xdistortion, unitsize / 2) (subsety, subsetx) = [ list(x) for x in zip(*sorted(zip(subsety, subsetx), key=lambda pair: pair[0])) ] location = findcenter(subsety, size) #Determine corners of selected square area x1 = subsety[location - squares] y1 = subsetx[location - squares] print(x1, y1) x3 = subsety[location + squares] y3 = subsetx[location + squares] s1 = subsetx[location] (subsetx, subsety) = xselector(rotatedcoordinates, centralline + squares * unitsize * xdistortion, unitsize / 2) (subsety, subsetx) = [ list(x) for x in zip(*sorted(zip(subsety, subsetx), key=lambda pair: pair[0])) ] print subsetx, subsety location = findcenter(subsety, size) x2 = subsety[location + squares] y2 = subsetx[location + squares] x4 = subsety[location - squares] y4 = subsetx[location - squares] s2 = subsetx[location] pincushion1 = float( math.sqrt((x2 - x1)**2 + (y2 - y1)**2) / math.sqrt(2 * (2 * squares * unitsize)**2)) pincushion2 = float( math.sqrt((x3 - x4)**2 + (y3 - y4)**2) / math.sqrt(2 * (2 * squares * unitsize)**2)) pincushionratio = float(pincushion2 / pincushion1) sartifacttop1 = float(s1 - y1) sartifacttop2 = float(s1 - y3) sartifactbottom1 = float(s2 - y2) sartifactbottom2 = float(s2 - y4) print pincushion1, pincushion2, pincushionratio results.addFloat('Pincushion 1', pincushion1, level=1) results.addFloat('Pincushion 2', pincushion2, level=1) results.addFloat('Pincushion ratio', pincushionratio, level=1) results.addFloat('S distortion top 1', sartifacttop1, level=1) results.addFloat('S distortion top 2', sartifacttop2, level=1) results.addFloat('S distortion bottom 1', sartifactbottom1, level=1) results.addFloat('S distortion bottom 2', sartifactbottom2, level=1) #------------------------- object_naam = 'export.png' size = pixeldata.shape[0] if size != 512: print 'Resizing image array...' pixeldata = scipy.misc.imresize(pixeldata, (512, 512)) rotated = scipy.misc.imrotate(pixeldata, rotation, interp='bilinear') rotated[y1 - 3:y1 + 3, x1 - 3:x1 + 3] = 255 rotated[y2 - 3:y2 + 3, x2 - 3:x2 + 3] = 255 rotated[y3 - 3:y3 + 3, x3 - 3:x3 + 3] = 255 rotated[y4 - 3:y4 + 3, x4 - 3:x4 + 3] = 255 rotated[y4 - 3:y4 + 3, x4 - 3:x4 + 3] = 255 rotated[ycenter - 3:ycenter + 3, xcenter - 3:xcenter + 3] = 255 plt.imshow(rotated) plt.show() scipy.misc.imsave(object_naam, rotated) results.addObject('Image', object_naam, level=1) return
def fluoroscopydistortion(data,results, **kwargs): ''' Function receives an image of a grid and calculates S-distortion and Pincushion distortion. ''' relevantfile = data.getAllInstances()[0] #Read DCM file, threshold to separate grid from background rawdata=relevantfile pixeldata=rawdata.pixel_array array_np = np.asarray(pixeldata) size=array_np.shape[0] if size!=512: print 'Resizing image array...' array_np=scipy.misc.imresize(array_np,(512,512)) size=array_np.shape[0] forexport=array_np mean_pixel=np.mean(pixeldata) high_values_indices = array_np > mean_pixel low_values_indices = array_np<=mean_pixel zero_values_indices = array_np==0 array_np[high_values_indices]=2 array_np[low_values_indices] = 1 array_np[zero_values_indices] = 0 resultxml = [] #Define an area for peak detection, resize image matrix if other than 512x512 area=10 #Plot resized and threholded image plt.imshow(array_np) plt.show() #print (array_np==1).sum() #Detect intersections by adjacent cell values dimensionrange=range(size) xarray=[0] yarray=[0] for i in dimensionrange: for j in dimensionrange: if array_np[i,j]==1: if array_np[i,j-3]==1 and array_np[i,j-2]==1 and array_np[i,j-1]==1 and array_np[i,j+1]==1 and array_np[i,j+2]==1 and array_np[i,j+3]==1 and array_np[i-3,j]==1 and array_np[i-2,j]==1 and array_np[i-1,j]==1 and array_np[i+1,j]==1 and array_np[i+2,j]==1 and array_np[i+3,j]==1: xarray.append(i) yarray.append(j) dotsarray=np.zeros((size,size)) dotsarray[xarray,yarray]=1 #plt.imshow(dotsarray) #plt.show() #Detect peaks and plot coordinates=corner_peaks(dotsarray, min_distance=area) plt.scatter(coordinates[:,1],coordinates[:,0]) plt.show() #Find center row in grid, sort peaks from left to right, find central peak and determine grid rotation (subsetx,subsety)=xselector(coordinates,size/2,15) (subsety,subsetx)=[list(x) for x in zip(*sorted(zip(subsety, subsetx), key=lambda pair: pair[0]))] location=findcenter(subsety,size) rotation=math.degrees(math.atan((float(subsetx[location-2])-float(subsetx[location+2]))/(float(subsety[location-2])-float(subsety[location+2])))) print rotation #Rotate image to correct for grid rotation and plot corrected peaks rotateddotsarray=scipy.misc.imrotate(dotsarray, rotation, interp='bilinear') rotatedcoordinates=corner_peaks(rotateddotsarray, min_distance=area) plt.scatter(rotatedcoordinates[:,1],rotatedcoordinates[:,0]) plt.show() #Find center row in rotated grid (subsetx,subsety)=xselector(rotatedcoordinates,size/2,15) (subsety,subsetx)=[list(x) for x in zip(*sorted(zip(subsety, subsetx), key=lambda pair: pair[0]))] #Determine position of central line to aid in finding consecutive lines in grid centralline=np.mean(subsetx) #find central peak of rotated grid location=findcenter(subsety,size) ycenter=subsetx[location] xcenter=subsety[location] print np.diff(subsety) #Determine unit size of grid in center of image #unitsize= np.amin(np.nonzero(np.diff(subsety))) unitsize= (subsety[location+1]-subsety[location-1])/2 print unitsize #Determine the squares x squares area of grid investigated #squares=6 squares=int(math.floor((0.60*512)/unitsize))/2 print squares #Determine distortion in x direction to aid in finding consecutive lines in grid xdistortion=(float(subsety[location+squares])-float(subsety[location-squares]))/(2*squares*unitsize) #Determine grid points in lower part of image (subsetx,subsety)=xselector(rotatedcoordinates,centralline-squares*unitsize*xdistortion,unitsize/2) (subsety,subsetx)=[list(x) for x in zip(*sorted(zip(subsety, subsetx), key=lambda pair: pair[0]))] location=findcenter(subsety,size) #Determine corners of selected square area x1=subsety[location-squares] y1=subsetx[location-squares] print (x1,y1) x3=subsety[location+squares] y3=subsetx[location+squares] s1=subsetx[location] (subsetx,subsety)=xselector(rotatedcoordinates,centralline+squares*unitsize*xdistortion,unitsize/2) (subsety,subsetx)=[list(x) for x in zip(*sorted(zip(subsety, subsetx), key=lambda pair: pair[0]))] print subsetx,subsety location=findcenter(subsety,size) x2=subsety[location+squares] y2=subsetx[location+squares] x4=subsety[location-squares] y4=subsetx[location-squares] s2=subsetx[location] pincushion1=float(math.sqrt((x2-x1)**2+(y2-y1)**2)/math.sqrt(2*(2*squares*unitsize)**2)) pincushion2=float(math.sqrt((x3-x4)**2+(y3-y4)**2)/math.sqrt(2*(2*squares*unitsize)**2)) pincushionratio=float(pincushion2/pincushion1) sartifacttop1=float(s1-y1) sartifacttop2=float(s1-y3) sartifactbottom1=float(s2-y2) sartifactbottom2=float(s2-y4) print pincushion1,pincushion2,pincushionratio results.addFloat('Pincushion 1', pincushion1,level=1) results.addFloat('Pincushion 2', pincushion2,level=1) results.addFloat('Pincushion ratio',pincushionratio,level=1) results.addFloat('S distortion top 1',sartifacttop1,level=1) results.addFloat('S distortion top 2',sartifacttop2,level=1) results.addFloat('S distortion bottom 1',sartifactbottom1,level=1) results.addFloat('S distortion bottom 2',sartifactbottom2,level=1) #------------------------- object_naam = 'export.png' size=pixeldata.shape[0] if size!=512: print 'Resizing image array...' pixeldata=scipy.misc.imresize(pixeldata,(512,512)) rotated=scipy.misc.imrotate(pixeldata, rotation, interp='bilinear') rotated[y1-3:y1+3,x1-3:x1+3]=255 rotated[y2-3:y2+3,x2-3:x2+3]=255 rotated[y3-3:y3+3,x3-3:x3+3]=255 rotated[y4-3:y4+3,x4-3:x4+3]=255 rotated[y4-3:y4+3,x4-3:x4+3]=255 rotated[ycenter-3:ycenter+3,xcenter-3:xcenter+3]=255 plt.imshow(rotated) plt.show() scipy.misc.imsave(object_naam,rotated) results.addObject('Image',object_naam,level=1) return