Die Matplotlib-Anzeigeausnahme kann ein Datenüberlaufproblem sein

Art der Daten

Der Speicherbereich von uint16 beträgt 2 ** 16 = 65535. Wenn der Wert nach der Datenverarbeitung größer als 65535 ist, treten Probleme auf

Zum Beispiel

import matplotlib.pyplot as plt
if __name__=="__main__":
    path = r'C:\Users\user\Desktop\00000002.dcm'
    ds = dicom.dcmread(path)
    img = dicom.pixel_data_handlers.apply_rescale(ds.pixel_array, ds)  # 288 234 uint16
    print(img.dtype)
    img = img / img.max() *255
    # img=np.array(img,np.int32)
    print(img.max(),img.min())
    plt.imshow(img,cmap=plt.cm.gray,vmin=0,vmax=255)
    plt.show()

Erläuterung:
Die wichtige Operation lautet: img = img / img.max() *255
Der Zweck der obigen Operation besteht darin, die Daten in den Bereich von 0 bis 255 umzuwandeln. Wenn der Wertebereich von img nicht konvertiert wird, wird sein Maximalwert angezeigt ist: 377,
weil: 377x255=96135 > 65535 Es wird also Probleme mit der Speicherung geben. Das Ergebnis wird also die folgende Realität sein.
Fügen Sie hier eine Bildbeschreibung ein
Wenn der x255 nach hinten verschoben wird, kann er normal angezeigt werden

# opencv show numpy array
# opencv 可以直接显示numpy数组
import pydicom as dicom
import cv2
import numpy as np

import matplotlib.pyplot as plt
if __name__=="__main__":
    path = r'C:\Users\user\Desktop\00000002.dcm'
    ds = dicom.dcmread(path)
    img = dicom.pixel_data_handlers.apply_rescale(ds.pixel_array, ds)  # 288 234 uint16
    print(img.dtype)
    print(img.max(),img.min())
    img = img / img.max() * 255
    # img=np.array(img,np.int32)
    print(img.max(),img.min())
    plt.imshow(img,cmap=plt.cm.gray,vmin=0,vmax=255)
    plt.show()

Das angezeigte Ergebnis ist:
Fügen Sie hier eine Bildbeschreibung ein

Guess you like

Origin blog.csdn.net/m0_45290027/article/details/131535832