combine_volumes 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env python
  2. # Combines the phase volumes given to generate teh pahse field maps.
  3. # The code is translated from AFNIs implementation:
  4. #
  5. # for (i=0; i<nvox;++i) {
  6. # dif[i] = (phi1[i]-phi2[i])/2.0;
  7. # if (ABS(dif[i]) < 90/n || !rpud->fixsum) { /* should this be 90 / n ? */
  8. # sum[i] = (phi1[i]+phi2[i])/2.0;
  9. # } else { /* Too big a difference in phase, likely
  10. # summing about zero degrees where wrapping from
  11. # 360 occurs*/
  12. # sum[i] = (phi1[i]+phi2[i])/2.0-180.0/n;
  13. # if (sum[i]<0) sum[i] = 360/n + sum[i];
  14. # }
  15. #
  16. def combine_volumes(volume1_path, volume2_path, output_path):
  17. import nibabel as nib
  18. import numpy as np
  19. import os
  20. import scipy.stats as ss
  21. volume1 = nib.load(volume1_path)
  22. volume2 = nib.load(volume2_path)
  23. real_volume1_data=volume1.get_data()[:,:,:,0]
  24. real_volume2_data=volume2.get_data()[:,:,:,0]
  25. combined_volume=ss.circmean([real_volume1_data, real_volume2_data],high=360,low=0,axis=0)
  26. # combined_volume=np.zeros(real_volume1_data.shape)
  27. # it = np.nditer(real_volume1_data, flags=['multi_index'])
  28. # while not it.finished:
  29. # diff=0.5*(real_volume1_data[it.multi_index]-real_volume2_data[it.multi_index])
  30. # if abs(diff)< 90:
  31. # combined_volume[it.multi_index]=0.5*(real_volume1_data[it.multi_index]+real_volume2_data[it.multi_index])
  32. # else:
  33. # sum_value=0.5*(real_volume1_data[it.multi_index]+real_volume2_data[it.multi_index])-180
  34. # if sum_value<0:
  35. # sum_value+=360
  36. # combined_volume[it.multi_index]=sum_value
  37. # it.iternext()
  38. volume_returned_data=(volume1.get_data()+volume2.get_data())*0.5
  39. volume_returned_data[:,:,:,0]=combined_volume
  40. nib.Nifti1Image(volume_returned_data, volume1.get_affine()).to_filename(output_path)
  41. return volume_returned_data
  42. if __name__ == "__main__":
  43. import sys
  44. volume1_path = sys.argv[1]
  45. volume2_path = sys.argv[2]
  46. output_path = sys.argv[3]
  47. combined_volume=combine_volumes(volume1_path, volume2_path, output_path)
  48. print ">> Combining volumes completed"