【问题标题】:Python convert .dcm to .png, images are too brightPython 将 .dcm 转换为 .png,图像太亮
【发布时间】:2020-02-14 03:34:17
【问题描述】:

我必须将一些默认为.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 的样子,右侧是运行此代码的结果

【问题讨论】:

    标签: python dicom pydicom


    【解决方案1】:

    一些 DICOM 数据集需要 window center/width rescaling 的原始像素强度(通过 (0028,1050) Window Center 和 (0028,1051) Window Width 元素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()

    【讨论】:

    • FWIW,据我所知,Phillips 生成的 MR 经常有一个模态 LUT,所以它可能也值得使用。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      我也有同样的问题,你可以使用 Scikit Image library 中的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)
      

      【讨论】:

        【解决方案4】:

        你可以试试下面的方法

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

        在这种方法中,您在从 dicom 转换为 png/jpg 时会丢失最少的信息

        【讨论】:

          猜你喜欢
          • 2022-07-05
          • 1970-01-01
          • 2011-02-01
          • 2020-06-15
          • 2012-06-01
          • 2017-09-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多