【问题标题】:Vast difference in cv2 imshow vs matplotlib imshow?cv2 imshow 与 matplotlib imshow 的巨大差异?
【发布时间】:2020-01-22 07:46:39
【问题描述】:

我目前正在开发一个程序,该程序需要我读取 DICOM 文件并正确显示它们。从 DICOM 文件中提取像素数组后,我通过 matplotlib 和 cv2 中的 imshow 函数运行它。令我惊讶的是,它们都产生了截然不同的图像。一个有颜色,另一个没有,一个比另一个显示更多细节。我很困惑为什么会这样。我找到了Difference between plt.show and cv2.imshow? 并尝试将像素转换为 BRG 而不是 cv2 使用的 RGB,但这没有任何改变。我想知道为什么这两个框架以如此不同的方式显示相同的像素缓冲区。下面是我的代码和显示结果的图像

import cv2
import os
import pydicom
import numpy as np
import matplotlib.pyplot as plt
inputdir = 'datasets/dicom/98890234/20030505/CT/CT2/'
outdir = 'datasets/dicom/pngs/'

test_list = [ f for f in  os.listdir(inputdir)]
for f in test_list[:1]:   # remove "[:10]" to convert all images 
    ds = pydicom.dcmread(inputdir + f)
    img = np.array(ds.pixel_array, dtype = np.uint8)  # get image array
    rows,cols = img.shape    
    cannyImg = cv2.Canny(img, cols, rows)
    cv2.imshow('thing',cv2.cvtColor(img, cv2.COLOR_BRG2RBG))
    cv2.imshow('thingCanny', cannyImg)
    plt.imshow(ds.pixel_array)
    plt.show()
    cv2.waitKey()

【问题讨论】:

    标签: python-3.x opencv matplotlib dicom


    【解决方案1】:

    不是答案,但评论太长了。我认为您的问题的根本原因已经在数组的初始化中:

    img = np.array(ds.pixel_array, dtype = np.uint8)
    

    uint8 可能不是您在 DICOM 文件中的内容。首先是因为它看起来像通常以 10+ bpp 存储的 CT 图像,其次是因为您所面对的伪影对我来说看起来非常熟悉。如果 >8 位像素数据被解释为 8 位,则通常会出现此类伪影(以黑色显示的密集骨骼、渐变效果)。

    顺便说一句:对我来说,这两个渲染看起来显然不正确。

    很抱歉,我不是 python 专家,只能说出问题所在,但无法说出如何正确解决问题。

    【讨论】:

      【解决方案2】:

      将cmap 参数与imshow() 一起使用可能会解决此问题。试试这个:

      plt.imshow(arr, cmap='gray', vmin=0, vmax=255)
      

      请参阅docs 了解更多信息。

      【讨论】:

        猜你喜欢
        • 2017-08-23
        • 2015-07-30
        • 2023-03-21
        • 2012-04-12
        • 1970-01-01
        • 2018-05-31
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        相关资源
        最近更新 更多