将DICOM图像另存为无损JPEG

时间:2018-10-03 18:46:04

标签: python image-processing dicom

我的原始图像为DICOM格式,我想将其保存为无损jpg格式(或至少保留尽可能多的信息!!!)。我该如何在python中做到这一点?目前,我正在使用以下代码,该代码会生成有损png图像。我称其为有损png,因为当我通过dicom浏览器看到dicom图像时,png图像看起来与dicom图像不同。另外,如何修改此图像以获取jpg图像而不是png图像。

import numpy as np
import png
import pydicom
ds = pydicom.dcmread("./MyImage.dcm")
shape = ds.pixel_array.shape
# Convert to float to avoid overflow or underflow losses.
image_2d = ds.pixel_array.astype(float)
# Rescaling grey scale between 0-255
image_2d_scaled = (np.maximum(image_2d,0) / image_2d.max()) * 256
# Convert to uint
image_2d_scaled = np.uint8(image_2d_scaled)
# Write the PNG file
with open("out.png", 'wb') as png_file:
    w = png.Writer(shape[1], shape[0], greyscale=True)
    w.write(png_file, image_2d_scaled)

2 个答案:

答案 0 :(得分:0)

信息丢失的问题取决于像素深度,而不是图像压缩。您的DICOM图像每个像素大概有11位(从-1024到1023),甚至可能更多。并且您无需设置强度窗口即可将其转换为8位图像。

这意味着值-1024的原始像素变为黑色,+ 1023的像素变为白色,但是图像的最重要部分(从-100到+300左右)变为平均灰色。如果您对肺部感兴趣,则重要值较低,如果您想查看骨骼,则其较高值等。最重要的是,您无法在单个png / jpg / bmp图像上看到DICOM图像的所有部分。您需要一个特殊的查看器,该查看器可以设置灰度级。可以处理全部像素深度的最常见的非医学格式是TIFF,但仍然需要特殊的查看器。

答案 1 :(得分:0)

还有另一种有效的方法,可以使用OpenCV和pydicom库将Dicom图像转换为JPEG或PNG格式。下面的代码在一次运行中(使用for循环)将所有dicom图像集转换为jpeg / png。

import pydicom as dicom
import os
import cv2
# make it True if you want in PNG format
PNG = False
# Specify the .dcm folder path
folder_path = "/Image"
# Specify the output .jpg/png folder path
jpg_folder_path = "/JPGImage"
images_path = os.listdir(folder_path)
for n, image in enumerate(sorted(images_path)):
    print(os.path.join(folder_path, image))
    ds = dicom.dcmread(os.path.join(folder_path, image), force=True)
    ds.file_meta.TransferSyntaxUID = dicom.uid.ImplicitVRLittleEndian
    pixel_array_numpy = ds.pixel_array
    if PNG == False:
        image = image.replace('.dcm', '.jpg')
    else:
        image = image.replace('.dcm', '.png')
    pixel_array_numpy2 = cv2.flip(pixel_array_numpy, 0)
    cv2.imwrite(os.path.join(jpg_folder_path, image), pixel_array_numpy2)