reco.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import numpy as np
  2. import os
  3. import matplotlib
  4. matplotlib.use('Agg') # headless backend — must be set before pyplot import
  5. import matplotlib.pyplot as plt
  6. import sys
  7. # os.chdir('C:/')
  8. # sys.path.append("C:/Users/iuliia/recoUI/serv")
  9. def reconstruction(matrix,k_space_min, k_space_max, nCoil, nContrast, nSlice, phase_shift=0, return_image=True):
  10. for i in range(matrix.shape[1]):
  11. phase_factors = np.exp(-1j * phase_shift) ** i
  12. matrix[:, i] = matrix[:, i] * phase_factors
  13. fft_data = np.fft.ifft2(matrix)
  14. fft_shifted_data = np.fft.ifftshift(fft_data)
  15. amplitude = np.abs(fft_shifted_data)
  16. plt.imshow(amplitude, cmap='gray', vmin=amplitude.min(), vmax=amplitude.max())
  17. plt.colorbar()
  18. plt.savefig(
  19. os.path.join('data', f'im_contrast_{nCoil}_{nContrast}_k_{nSlice}.png'))
  20. plt.close()
  21. log_matrix = np.log(np.abs(matrix))
  22. print(k_space_min, " ", k_space_max)
  23. plt.imshow(log_matrix, cmap='gray', vmin=np.log(np.abs(k_space_min)), vmax=np.log(np.abs(k_space_max)))
  24. plt.colorbar()
  25. plt.savefig(
  26. os.path.join('data', f'k_contrast_{nCoil}_{nContrast}_k_{nSlice}.png'))
  27. plt.close()
  28. if return_image:
  29. return amplitude
  30. def reco_3d(matrix, maximum_k_space, minimum_k_space, nCoil, nContrast, phase_shift=0, return_image=True):
  31. '''
  32. :param matrix: [x,y,z]
  33. :param nContrast: количество контрастов
  34. :param phase_shift: угол
  35. :return:
  36. '''
  37. for i in range(matrix.shape[1]):
  38. phase_factors = np.exp(-1j * phase_shift) ** i
  39. matrix[:, i, :] = matrix[:, i, :] * phase_factors
  40. fft_data = np.fft.ifftn(matrix)
  41. fft_shifted_data = np.fft.ifftshift(fft_data)
  42. amplitude = np.abs(fft_shifted_data)
  43. # print("TTTT")
  44. for slice in range(amplitude.shape[2]):
  45. plt.imshow(amplitude[:, :, slice], cmap='gray', vmin=amplitude.min(),
  46. vmax=amplitude.max())
  47. plt.colorbar()
  48. plt.savefig(
  49. os.path.join('data', f'im_contrast_{nCoil}_{nContrast}_k_{slice}.png'))
  50. plt.close()
  51. # print("slice")
  52. log_matrix = np.log(np.abs(matrix))
  53. plt.imshow(log_matrix[:, :, slice], cmap='gray', vmin=np.log(np.abs(minimum_k_space)),
  54. vmax=np.log(np.abs(maximum_k_space)))
  55. plt.savefig(
  56. os.path.join('data', f'k_contrast_{nCoil}_{nContrast}_k_{slice}.png'))
  57. plt.close()
  58. if return_image:
  59. return amplitude
  60. def save_ffft(data, spoil=0):
  61. '''
  62. :param data: [x, y, z, contrast, coil]
  63. :param spoil: градус сдвига
  64. '''
  65. print(data.shape)
  66. k_space_max = np.max(data)
  67. k_space_min = np.min(data)
  68. num_slice = data.shape[2] # Размер третьего измерения slice
  69. num_contrast = data.shape[3] # Размер четвертого измерения contrast
  70. num_coils = data.shape[4] # Размер по оси coil
  71. all_img = np.zeros((num_contrast, num_slice, data.shape[0], data.shape[1]), dtype=np.float32)
  72. for number_matrix_k_space in range(num_slice):
  73. for contrast_nb in range(num_contrast):
  74. img_sum = None
  75. for coil_nb in range(num_coils):
  76. coil_data = data[:, :, number_matrix_k_space, contrast_nb, coil_nb]
  77. img_coil = reconstruction(coil_data, k_space_min, k_space_max,
  78. coil_nb, contrast_nb, number_matrix_k_space,
  79. spoil,
  80. return_image=True )
  81. img_abs_two = img_coil ** 2
  82. if img_sum is None:
  83. img_sum = img_abs_two
  84. else:
  85. img_sum += img_abs_two
  86. all_img[contrast_nb, number_matrix_k_space] \
  87. = img_sum.copy() # тут сохраняется ИЗОБРАЖЕНИЕ, квадрат модуля для ВСЕХ катушек данного констраста и слоя
  88. global_max = np.max(all_img)
  89. global_min = np.min(all_img)
  90. save_img(all_img, global_max, global_min)
  91. def save_ffft_3d(data, phase=0):
  92. '''
  93. :param data: [x, y, z, contrast, coil]
  94. :param phase: spoil
  95. '''
  96. num_contrast = data.shape[3] # Размер четвертого измерения
  97. num_coils = data.shape[4]
  98. num_slice = data.shape[2]
  99. k_space_max = np.max(data)
  100. k_space_min = np.min(data)
  101. all_img = np.zeros((num_contrast, num_slice, data.shape[0], data.shape[1]), dtype=np.float32)
  102. # print("phase: ", phase)
  103. # for coil_nb in range(num_coils):
  104. for contrast_nb in range(num_contrast):
  105. img_sum = None
  106. for coil_nb in range(num_coils):
  107. coil_data = data[:, :, :, contrast_nb, coil_nb]
  108. img_coil = reco_3d(coil_data, k_space_max, k_space_min,
  109. coil_nb, contrast_nb,
  110. phase,
  111. return_image=True)
  112. print(img_coil.shape)
  113. img_abs_two = img_coil ** 2
  114. if img_sum is None:
  115. img_sum = img_abs_two
  116. else:
  117. img_sum += img_abs_two
  118. img_sum = np.transpose(img_sum, (2, 0, 1))
  119. all_img[contrast_nb] \
  120. = img_sum.copy() # тут сохраняется ИЗОБРАЖЕНИЕ, квадрат модуля для ВСЕХ катушек данного констраста
  121. print(contrast_nb)
  122. print(all_img.shape)
  123. # all_img = np.transpose(all_img, (1, 2, 3, 0))
  124. global_max = np.max(all_img)
  125. global_min = np.min(all_img)
  126. print(global_max, global_min)
  127. print(all_img)
  128. save_img(all_img, global_max, global_min)
  129. def save_img(data, maximum, minimum):
  130. '''
  131. :param data: all_img[contrast_nb, number_matrix_k_space] = img_sum.[x,y] = [contrast, slice, x, y]
  132. :return:
  133. '''
  134. contrasts = data.shape[0]
  135. slices = data.shape[1]
  136. for contrast in range(contrasts):
  137. for slice in range(slices):
  138. plt.imshow(data[contrast, slice], cmap='gray', vmin=minimum, vmax=maximum)
  139. plt.colorbar()
  140. plt.savefig(
  141. os.path.join('data', f'im_{contrast}_k_{slice}.png'))
  142. plt.close()