因为DICOM图像通常是一个序列,普通的dcm格式的图像序列可以直接使用DICOM图像查看软件打开进行查看;但mhd格式的3D图像却无法方便地查看。但为了研究方便,可视化mhd图像文件是绕不开的一项任务。
具体来说,在Python下可视化图像可以选择使用matplotlib,也可以用OpenCV将其保存查看,都非常方便。不过有些细节问题则需要特别注意。下面对这些进行一下简单记录,以防遗忘。
1.使用OpenCV保存图像序列
使用OpenCV保存一个三维的DICOM数据image,并在其上的某个坐标coord处绘制直径为diameter的圆形的代码如下:
import cv2
import SimpleITK as sitk
import numpy as np
image = sitk.ReadImage(mhd_path)
image = sitk.GetArrayFromImage(image)
for i, im in enumerate(image):
im = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)
cv2.circle(im, coord, diameter, color=(0, 0, 255))
cv2.imwrite(os.path.join(path, '{}.png'.format(i)), im)
import cv2
import SimpleITK as sitk
import numpy as np
image = sitk.ReadImage(mhd_path)
image = sitk.GetArrayFromImage(image)
for i, im in enumerate(image):
im = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)
cv2.circle(im, coord, diameter, color=(0, 0, 255))
cv2.imwrite(os.path.join(path, '{}.png'.format(i)), im)
import cv2
import SimpleITK as sitk
import numpy as np
image = sitk.ReadImage(mhd_path)
image = sitk.GetArrayFromImage(image)
for i, im in enumerate(image):
im = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)
cv2.circle(im, coord, diameter, color=(0, 0, 255))
cv2.imwrite(os.path.join(path, '{}.png'.format(i)), im)
需要特别注意的是 im = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)im = cv2.cvtColor(im, cv2.COLOR_GRAY2RGB)。因为输入图像是灰度图,如果不先将图像转换为彩色的RGB格式,下面绘制的circle将不会以彩色显示,可能会造成误解。
2.使用matplotlib绘制保存图像序列
使用matplotlib.pyplot在Python里进行各种图形的绘制会特别方便,而且我们使用的也更多更顺手。如,绘制一幅二维的image图像,代码如下:
import matplotlib.pyplot as plt
plt.imshow(image, cmap='gray')
plt.show()
import matplotlib.pyplot as plt
plt.imshow(image, cmap='gray')
plt.show()
import matplotlib.pyplot as plt
plt.imshow(image, cmap='gray')
plt.show()
因为我们绘制的医学影像是灰度图,所以用 cmap='gray'cmap='gray' 这个参数。
而在绘制的图像上绘制其他内容也十分方便,比如1中绘制一个圆形,代码如下:
import matplotlib.pyplot as plt
plt.imshow(image, cmap='gray')
plt.Circle(coord, diameter, color='r', fill=False)
plt.show()
import matplotlib.pyplot as plt
plt.imshow(image, cmap='gray')
plt.Circle(coord, diameter, color='r', fill=False)
plt.show()
import matplotlib.pyplot as plt
plt.imshow(image, cmap='gray')
plt.Circle(coord, diameter, color='r', fill=False)
plt.show()
将绘制的图像像OpenCV一样保存为文件,也可以直接使用plt.savefig(path)plt.savefig(path)即可。
不过,你应该能够看到,这样保存的图片边缘会有很大空白,而不能像OpenCV保存的图像那样,紧紧贴边,只保存了图像。
那么,如何使用matplotlib.pyplot像OpenCV的cv2那样保存图像时紧紧贴边,而没有边缘的空白呢?可以使用下面的代码:
def make_image(image, path, diameter, coord):
fig = plt.figure()
fig.set_size_inches(image.shape[0]/100., image.shape[1]/100.)
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(image, aspect='normal', cmap='gray')
circle = plt.Circle(coord, diameter, color='r', fill=False)
ax.add_artist(circle)
plt.savefig(path)
def make_image(image, path, diameter, coord):
fig = plt.figure()
fig.set_size_inches(image.shape[0]/100., image.shape[1]/100.)
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(image, aspect='normal', cmap='gray')
circle = plt.Circle(coord, diameter, color='r', fill=False)
ax.add_artist(circle)
plt.savefig(path)
def make_image(image, path, diameter, coord):
fig = plt.figure()
fig.set_size_inches(image.shape[0]/100., image.shape[1]/100.)
ax = plt.Axes(fig, [0., 0., 1., 1.])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(image, aspect='normal', cmap='gray')
circle = plt.Circle(coord, diameter, color='r', fill=False)
ax.add_artist(circle)
plt.savefig(path)
使用该函数,即可将二维的numpy array格式的image图像数据保存为像OpenCV的cv2那样边缘没有任何空白的图像了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/37699.html