2025年pythonmhd转灰度图_可视化mhd文件格式的DICOM图像序列

pythonmhd转灰度图_可视化mhd文件格式的DICOM图像序列因为 DICOM 图像通常是一个序列 普通的 dcm 格式的图像序列可以直接使用 DICOM 图像查看软件打开进行查看 但 mhd 格式的 3D 图像却无法方便地查看 但为了研究方便 可视化 mhd 图像文件是绕不开的一项任务 具体来说 在 Python 下可视化图像可以选择使用 matplotlib

大家好,我是讯享网,很高兴认识大家。

因为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那样边缘没有任何空白的图像了。

小讯
上一篇 2025-04-01 12:26
下一篇 2025-02-11 16:43

相关推荐

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