如何使用 python 将 pydicom 文件(图像)分成两半?
How to divide in half pydicom files (image) using python?
我有很多图像(pydicom 文件)。我想分成两半。从 1 张图像中,我想要 2 张图像:左侧部分和右侧部分。
输入:1000x1000
输出:500x1000(宽 x 高)。
目前只能读取一个文件
ds = pydicom.read_file(image_fps[0]) # read dicom image from filepath
第一部分,我想将一半放在一个文件夹中,另一半放在第二个文件夹中。
这就是我所拥有的:
enter image description here
这就是我要的:
enter image description here
我使用 Mask-RCNN 解决对象定位问题。我想裁剪图像大小的 50%(pydicom 文件)。
编辑 1:
import SimpleITK as sitk
filtered_image = sitk.GetImageFromArray(left_part)
sitk.WriteImage(filtered_image, '/home/wojtek/Mask/nnna.dcm', True)
我有dicom文件,但无法显示。
this transfer syntax JPEG 2000 Image Compression (Lossless Only), can not be read because Pillow lacks the jpeg 2000 decoder plugin
执行 pydicom.dcm_read()
后,您的像素数据在 ds.pixel_array
可用。您可以只切片所需的数据并将其保存在任何合适的库中。在这个例子中,我将使用 matplotlib,因为我也用它来验证我的切片是否正确。显然要根据您的需要进行调整,您需要做的一件事就是生成正确的 path/filenames 以进行保存。玩得开心!
(此脚本假定文件路径在 paths
变量中可用)
import pydicom
import matplotlib
# for testing if the slice is correct
from matplotlib import pyplot as plt
for path in paths:
# read the dicom file
ds = pydicom.dcmread(path)
# find the shape of your pixel data
shape = ds.pixel_array.shape
# get the half of the x dimension. For the y dimension use shape[0]
half_x = int(shape[1] / 2)
# slice the halves
# [first_axis, second_axis] so [:,:half_x] means slice all from first axis, slice 0 to half_x from second axis
left_part = ds.pixel_array[:, :half_x]
right_part = ds.pixel_array[:,half_x:]
# to check whether the slices are correct, matplotlib can be convenient
# plt.imshow(left_part); do not do this in the loop
# save the files, see the documentation for matplotlib if you want a different format
# bmp, png are surely supported
path_to_left_image = 'generate\the\path\and\filename\for\the\left\image.bmp'
path_to_right_image = 'generate\the\path\and\filename\for\the\right\image.bmp'
matplotlib.image.imsave(path_to_left_image, left_part)
matplotlib.image.imsave(path_to_right_image, right_part)
如果您想保存 DICOM 文件,请记住,如果您不更新适当的数据,它们可能不是有效的 DICOM。例如,SOP 实例 UID 在技术上不允许与原始 DICOM 文件或任何其他 SOP 实例 UID 相同。那有多重要,取决于你。
使用如下脚本,您可以定义命名切片并将它在提供的路径中找到的任何 dicom 图像文件拆分为适当的切片。
import os
import pydicom
import numpy as np
def save_partials(parts, path_to_directory):
"""
parts: list of tuples, each tuple specifying a name and a list of four slice offsets
path_to_directory: path to directory containing dicom files
any file with a .dcm extension will have its image data split into the specified slices and saved accordingly.
original file will not be modified
"""
dir_content = [os.path.join(path_to_directory, item) for item in os.listdir(path_to_directory)]
files = [i for i in dir_content if os.path.isfile(os.path.join(path_to_directory, i))]
for file in files:
root, extension = os.path.splitext(file)
if extension.lower() != '.dcm':
# not a .dcm file, continue with next iteration of loop
continue
for part in parts:
ds = pydicom.read_file(file)
if not isinstance(ds.pixel_array, np.ndarray):
# no image data available
continue
part_name = part[0]
p = part[1] # slice list
ds.PixelData = ds.pixel_array[p[0]:p[1], p[2]:p[3]].tobytes()
ds.Rows = p[1] - p[0]
ds.Columns = p[3] - p[2]
##
## Here you can modify any tags using ds.KeyWord
##
new_file_name = "{r}-{pn}{ext}".format(r=root, pn=part_name, ext=extension)
ds.save_as(new_file_name)
print('saved {}'.format(new_file_name))
dir_path = '/home/wojtek/Mask'
parts = [('left', [0,512,0,256]),
('right', [0,512,256,512])]
save_partials(parts, dir_path)
我有很多图像(pydicom 文件)。我想分成两半。从 1 张图像中,我想要 2 张图像:左侧部分和右侧部分。
输入:1000x1000 输出:500x1000(宽 x 高)。
目前只能读取一个文件
ds = pydicom.read_file(image_fps[0]) # read dicom image from filepath
第一部分,我想将一半放在一个文件夹中,另一半放在第二个文件夹中。 这就是我所拥有的: enter image description here 这就是我要的: enter image description here
我使用 Mask-RCNN 解决对象定位问题。我想裁剪图像大小的 50%(pydicom 文件)。
编辑 1:
import SimpleITK as sitk
filtered_image = sitk.GetImageFromArray(left_part)
sitk.WriteImage(filtered_image, '/home/wojtek/Mask/nnna.dcm', True)
我有dicom文件,但无法显示。
this transfer syntax JPEG 2000 Image Compression (Lossless Only), can not be read because Pillow lacks the jpeg 2000 decoder plugin
执行 pydicom.dcm_read()
后,您的像素数据在 ds.pixel_array
可用。您可以只切片所需的数据并将其保存在任何合适的库中。在这个例子中,我将使用 matplotlib,因为我也用它来验证我的切片是否正确。显然要根据您的需要进行调整,您需要做的一件事就是生成正确的 path/filenames 以进行保存。玩得开心!
(此脚本假定文件路径在 paths
变量中可用)
import pydicom
import matplotlib
# for testing if the slice is correct
from matplotlib import pyplot as plt
for path in paths:
# read the dicom file
ds = pydicom.dcmread(path)
# find the shape of your pixel data
shape = ds.pixel_array.shape
# get the half of the x dimension. For the y dimension use shape[0]
half_x = int(shape[1] / 2)
# slice the halves
# [first_axis, second_axis] so [:,:half_x] means slice all from first axis, slice 0 to half_x from second axis
left_part = ds.pixel_array[:, :half_x]
right_part = ds.pixel_array[:,half_x:]
# to check whether the slices are correct, matplotlib can be convenient
# plt.imshow(left_part); do not do this in the loop
# save the files, see the documentation for matplotlib if you want a different format
# bmp, png are surely supported
path_to_left_image = 'generate\the\path\and\filename\for\the\left\image.bmp'
path_to_right_image = 'generate\the\path\and\filename\for\the\right\image.bmp'
matplotlib.image.imsave(path_to_left_image, left_part)
matplotlib.image.imsave(path_to_right_image, right_part)
如果您想保存 DICOM 文件,请记住,如果您不更新适当的数据,它们可能不是有效的 DICOM。例如,SOP 实例 UID 在技术上不允许与原始 DICOM 文件或任何其他 SOP 实例 UID 相同。那有多重要,取决于你。
使用如下脚本,您可以定义命名切片并将它在提供的路径中找到的任何 dicom 图像文件拆分为适当的切片。
import os
import pydicom
import numpy as np
def save_partials(parts, path_to_directory):
"""
parts: list of tuples, each tuple specifying a name and a list of four slice offsets
path_to_directory: path to directory containing dicom files
any file with a .dcm extension will have its image data split into the specified slices and saved accordingly.
original file will not be modified
"""
dir_content = [os.path.join(path_to_directory, item) for item in os.listdir(path_to_directory)]
files = [i for i in dir_content if os.path.isfile(os.path.join(path_to_directory, i))]
for file in files:
root, extension = os.path.splitext(file)
if extension.lower() != '.dcm':
# not a .dcm file, continue with next iteration of loop
continue
for part in parts:
ds = pydicom.read_file(file)
if not isinstance(ds.pixel_array, np.ndarray):
# no image data available
continue
part_name = part[0]
p = part[1] # slice list
ds.PixelData = ds.pixel_array[p[0]:p[1], p[2]:p[3]].tobytes()
ds.Rows = p[1] - p[0]
ds.Columns = p[3] - p[2]
##
## Here you can modify any tags using ds.KeyWord
##
new_file_name = "{r}-{pn}{ext}".format(r=root, pn=part_name, ext=extension)
ds.save_as(new_file_name)
print('saved {}'.format(new_file_name))
dir_path = '/home/wojtek/Mask'
parts = [('left', [0,512,0,256]),
('right', [0,512,256,512])]
save_partials(parts, dir_path)