Огромная разница в cv2 imshow и matplotlib imshow? - PullRequest
2 голосов
/ 21 сентября 2019

В настоящее время я работаю над программой, которая требует от меня чтения файлов DICOM и их правильного отображения.После извлечения массива пикселей из файла DICOM я запустил его через функцию imshow из matplotlib и cv2.К моему удивлению, они оба дают совершенно разные изображения.Один имеет цвет, а другой нет, и один показывает больше деталей, чем другой.Я не понимаю, почему это происходит.Я обнаружил разницу между plt.show и cv2.imshow? и попытался преобразовать пиксели в BRG вместо RGB, которые использует cv2, но это ничего не меняет.Мне интересно, почему эти 2 фреймворка показывают один и тот же пиксельный буфер так по-разному.ниже мой код и изображение, чтобы показать результаты

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 ]

2 голосов
/ 21 сентября 2019

Использование параметра cmap с imshow() может решить проблему.Попробуйте это:

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

Обратитесь к документам для получения дополнительной информации.

1 голос
/ 23 сентября 2019

Не ответ, но слишком долго для комментария.Я думаю, что основная причина ваших проблем уже в инициализации массива:

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

uint8, вероятно, не то, что у вас есть в файле DICOM.Во-первых, потому что это выглядит как изображение CT, которое обычно хранится с 10+ bpp, а во-вторых, потому что артефакты, с которыми вы сталкиваетесь, выглядят мне очень знакомыми.Такие артефакты (плотные кости отображаются черным цветом, эффекты градиента) обычно возникают, если> 8-битные пиксельные данные интерпретируются как 8-битные.

Кстати: мне кажется, что оба изображения выглядят некорректно.

Извините за то, что вы не являетесь экспертом по питону и просто способны сказать, что не так, но не можете сказать, как сделать это правильно.

...