我的目标是把nii格式的图像读取出来进行图像处理,过程中发现双边滤波结果和原图完全一样,找了一天bug都感觉没头绪。。。
结果是图像数据格式的问题,cv2.imread只能读取为无符号8位整数,如果是较为细微的图像差别会直接被取整抹掉,所以必须使用读写浮点图像的手段。
simpleitk提供了两种读写图像的方式,之前一直使用的是以下这种(用于读写nii文件):
raw_image = sitk.ReadImage(inputImageFileName)
raw_mat = np.array(sitk.GetArrayFromImage(raw_image))[0]
这种读写方式结果也是无符号8位整数,我上官网查询了一下说明文档,发现Simpleitk还支持另一种读写方式:
import SimpleITK as sitk
reader = sitk.ImageFileReader()
reader.SetImageIO("PNGImageIO")
reader.SetFileName(inputImageFileName)
image = reader.Execute()
writer = sitk.ImageFileWriter()
writer.SetFileName(outputImageFileName)
writer.Execute(image)
这种读写方式可以基于以下方式设定被读取的数据类型:
# 需要提前定义对象reader,过程如上
reader.SetOutputPixelType(sitk.sitkFloat64)
如果为了保存处理过程图像,可以直接使用numpy.save()保存为npy格式