preprocessing.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. # %% 1. Nalozimo originalno sliko in pogledamo metapodatke
  2. import nibabel as nib
  3. import numpy as np
  4. from matplotlib import pyplot as plt
  5. filepath_CT = "images/0381_1.nii.gz" # pot do CT datoteke
  6. all = nib.load(filepath_CT) # slika in vsi metapodatki
  7. info = all.header # metapodatki se nahajajo v glavi
  8. print(info)
  9. # %% 2. Nalozimo originalno sliko
  10. I_dataobject = all.dataobj # vzamemo le podatkovni objekt
  11. I = np.array(I_dataobject) # pretvorimo v numpy matriko, dimenzij 512x512xNz
  12. plt.figure()
  13. plt.title("Original")
  14. plt.imshow(np.rot90(I[:,:,26], k=3),cmap='gray') # primer vizualizacije 27. rezine (k=3 zaradi rotacija 3x90°)
  15. # %% 3. Sliko normaliziramo
  16. def normalize(image, MIN_BOUND, MAX_BOUND):
  17. # Normalizacija CT slike znotraj intervala MIN_BOUND, MAX_BOUND.
  18. image = (image - MIN_BOUND) / (MAX_BOUND - MIN_BOUND)
  19. image[image>1] = 1.
  20. image[image<0] = 0.
  21. return image
  22. # Uporabimo W = 1500, L = -600 --> https://radiopaedia.org/articles/windowing-ct
  23. nI = normalize(I, -1350, 150) # dobimo normalizirano CT sliko z W = 1500, L = -600
  24. plt.figure()
  25. plt.title("Normalizacija")
  26. plt.imshow(np.rot90(nI[:,:,26], k=3), cmap='gray') # primer vizualizacije 27. rezine segmentacije
  27. # %% 4. Nalozimo masko
  28. import nrrd
  29. filepath_mask = "masks/0381_1.nrrd" # pot do maske
  30. M, _ = nrrd.read(filepath_mask) # preberemo masko in jo shranimo v M
  31. plt.figure()
  32. plt.title("Vizualizacija maske")
  33. plt.imshow(np.rot90(M[:,:,26], k=3), cmap='gray')
  34. # %% 5. Apliciramo masko na normalizirano sliko
  35. S = np.where(M==1, nI, M)
  36. plt.figure()
  37. plt.title("Segmentacija")
  38. plt.imshow(np.rot90(S[:,:,26], k=3),cmap='gray') # primer vizualizacije 27. rezine segmentacije
  39. # %% 6. Popravimo vidno polje
  40. from cv2 import resize
  41. def bound_box(img, slice_idx):
  42. # Za dano rezino poiscemo najmanjsi pravokotnik, ki obdaja segmentirana pljuca.
  43. I_slice = img[:,:,slice_idx]
  44. rows = np.any(I_slice, axis=1)
  45. cols = np.any(I_slice, axis=0)
  46. rmin, rmax = np.where(rows)[0][[0, -1]]
  47. cmin, cmax = np.where(cols)[0][[0, -1]]
  48. I_slice = I_slice[rmin:rmax, cmin:cmax]
  49. I_slice = np.transpose(I_slice[:, :, np.newaxis],axes = [2,0,1]).astype('float32')
  50. return I_slice
  51. bounded_slice = bound_box(S, 26) # npr. da zelimo obrezati 27. rezino S-ja
  52. plt.figure()
  53. plt.title("Popravljeno vidno polje")
  54. plt.imshow(np.rot90(bounded_slice[0,:,:], k=3), cmap='gray')
  55. # %%