cv2 imshow与matplotlib imshow的巨大差异?

时间:2019-09-21 16:26:40

标签: python-3.x opencv matplotlib dicom

我当前正在开发一个程序,该程序需要我读取DICOM文件并正确显示它们。从DICOM文件中提取像素阵列后,我通过matplotlib和cv2的imshow函数来运行它。令我惊讶的是,它们都产生了截然不同的图像。一种具有颜色,而另一种则没有,而一种则显示出更多的细节。我对为什么会这样感到困惑。我发现Difference between plt.show and cv2.imshow?并尝试将cv2使用的像素转换为BRG而不是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()

enter image description here

2 个答案:

答案 0 :(得分:2)

System.setProperty("java.net.useSystemProxies", "true"); 参数与cmap一起使用可以解决此问题。试试这个:

imshow()

有关更多信息,请参考docs

答案 1 :(得分:1)

不是答案,但评论太久。我认为问题的根本原因在于数组初始化:

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

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

顺便说一句:对我来说,两个效果图显然都不正确。

很抱歉,您不是Python专家,只能说出问题所在,却无法说出正确的方法。