首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cv2 imshow与matplotlib imshow的巨大差异?

cv2 imshow与matplotlib imshow的巨大差异?
EN

Stack Overflow用户
提问于 2019-09-22 00:26:41
回答 2查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
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()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-23 22:08:15

没有答案,但评论太长了。我认为问题的根本原因在于数组的初始化:

代码语言:javascript
复制
img = np.array(ds.pixel_array, dtype = np.uint8)

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

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

抱歉,我不是python专家,只能说出哪里出了问题,却不能说出如何正确解决问题。

票数 1
EN

Stack Overflow用户

发布于 2019-09-22 00:46:24

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

代码语言:javascript
复制
plt.imshow(arr, cmap='gray', vmin=0, vmax=255)

有关更多信息,请参阅docs

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58042116

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档