可视化mhd文件格式的DICOM图像序列

在 2017-05-25 发布于 人工智能 下以来已有1,458人读过本文 | 0条评论 发表评论

因为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)

需要特别注意的是 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()

因为我们绘制的医学影像是灰度图,所以用 cmap='gray' 这个参数。

而在绘制的图像上绘制其他内容也十分方便,比如1中绘制一个圆形,代码如下:

import matplotlib.pyplot as plt
plt.imshow(image, cmap='gray')
plt.Circle(coord, diameter, color='r', fill=False)
plt.show()

将绘制的图像像OpenCV一样保存为文件,也可以直接使用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)

使用该函数,即可将二维的numpy array格式的image图像数据保存为像OpenCV的cv2那样边缘没有任何空白的图像了。

发表评论

您的昵称 *

您的邮箱 *

您的网站