Python 将 .dcm 转换为 .png,图像太亮

Python convert .dcm to .png, images are too bright

我必须将一些默认为 .dcm 的文件转换为 .png,我在这里找到了一些代码示例来实现这一点,但最终结果太亮了。有人可以看看这个吗?

 def convert_to_png(file):
    ds = pydicom.dcmread(file)

    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()) * 255.0

    # Convert to uint
    image_2d_scaled = np.uint8(image_2d_scaled)

    # Write the PNG file
    with open(f'{file.strip(".dcm")}.png', 'wb') as png_file:
        w = png.Writer(shape[1], shape[0], greyscale=True)
        w.write(png_file, image_2d_scaled)

我已经对代码进行了调整,但似乎没有任何效果。

这是 dicom 的实际情况,右侧是 运行 此代码的结果

在分析特定图像时,.dcm 图像似乎具有一定范围的亮度和对比度。在你的情况下它看起来有点亮的原因是你只选择了图像的特定视图。

要使图像更暗,看起来您只需要增加分母值即可:

threshold = 500 # Adjust as needed
image_2d_scaled = (np.maximum(image_2d, 0) / (np.amax(image_2d) + threshold)) * 255.0

这将确保某些像素不会太亮。

一些 DICOM 数据集需要 window center/width rescaling of the original pixel intensities (via the (0028,1050) Window Center and (0028,1051) Window Width elements in the VOI LUT Module) 才能重现它们被“查看”的方式。

pydicom 有一个函数 apply_voi_lut() 用于应用此窗口:

from pydicom import dcmread
from pydicom.pixel_data_handlers.util import apply_voi_lut

ds = dcmread(file)
if 'WindowWidth' in ds:
    print('Dataset has windowing')

windowed = apply_voi_lut(ds.pixel_array, ds)

# Add code for rescaling to 8-bit...

根据数据集类型,您可能需要预先使用 apply_modality_lut()

我也遇到了同样的问题,你可以使用 Scikit 图片库中的 exposure.equalize_adapthist()

filename = "sample.dcm"
ds = pydicom.read_file(filename)
image = ds.pixel_array
image = exposure.equalize_adapthist(image)

cv2.imshow("dicom", image)
cv2.waitKey(0)

你可以试试下面的方法

image = image - np.min(image)
image = (image/np.max(image))*255

在这种方法中,您在从 dicom 转换为 png/jpg

时丢失的信息最少