Как работать с изображениями Dicom в python? проблемы с cv2 - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь применить фильтры cv2, некоторые работают, но другие нет, так как они говорят, что должны использовать uint8, но изображения dicom теряют информацию, если я их преобразую.

Следующий код работает, если вы изменитеto uint8 Я попытался сделать то же самое с float, но он не работает

import matplotlib.pyplot as plt
import matplotlib.image as img
import numpy as np
import cv2
import pydicom #read dicom files

from PIL import Image, ImageFilter


A=pydicom.read_file('prueba.dcm')       
imag=A.pixel_array
#img=np.float32(imag)
img= cv2.medianBlur(img,13).astype('uint16')

roi = img[1200:1500,650:1000]
hist = cv2.calcHist([roi],[0],None,[4095],[70,4095])

ret1,th1 = cv2.threshold(roi,1800,4095,cv2.THRESH_BINARY)

# Otsu's thresholding
ret2,th2 = cv2.threshold(roi,0,4095,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# Otsu's thresholding after Gaussian filtering
blur = cv2.GaussianBlur(roi,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,4095,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# plot all the images and their histograms
images = [roi, 0, th1,
          roi, 0, th2,
          blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding     (v=127)',
          'Original Noisy Image','Histogram',"Otsu's Thresholding",
          'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]

for i in range(3):
    plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
    plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
    plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
    plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()`

ошибка: (-215: утверждение не выполнено) src.type () == CV_8UC1 в функции 'cv :: threshold'

...