3
votes

Python convertit .dcm en .png, les images sont trop lumineuses

Je dois convertir certains fichiers qui sont par défaut .dcm en .png , j'ai trouvé des exemples de code pour y parvenir ici mais les résultats finaux sont trop brillants. Quelqu'un pourrait-il jeter un coup d'œil à cela, s'il vous plaît?

 def convert_to_png(file):
    ds = pydicom.dcmread(file)

    shape = ds.pixel_array.shape

    # Convert to float to avoid overflow or underflow losses.
    image_2d = ds.pixel_array.astype(float)

    # Rescaling grey scale between 0-255
    image_2d_scaled = (np.maximum(image_2d,0) / image_2d.max()) * 255.0

    # Convert to uint
    image_2d_scaled = np.uint8(image_2d_scaled)

    # Write the PNG file
    with open(f'{file.strip(".dcm")}.png', 'wb') as png_file:
        w = png.Writer(shape[1], shape[0], greyscale=True)
        w.write(png_file, image_2d_scaled)

J'ai modifié le code mais rien ne semble fonctionner.

Voici à quoi ressemble la chose réelle en tant que dicom et sur le côté droit est le résultat de l'exécution de ce code entrez la description de l'image ici


0 commentaires

3 Réponses :


1
votes

Une image .dcm semble avoir une plage de luminosité et de contraste lors de l'analyse d'une image particulière. La raison pour laquelle cela peut sembler un peu brillant dans votre cas est que vous n'avez sélectionné qu'une vue particulière de l'image.

Pour rendre l'image plus sombre, il semble que vous deviez simplement augmenter la valeur de votre dénominateur:

threshold = 500 # Adjust as needed
image_2d_scaled = (np.maximum(image_2d, 0) / (np.amax(image_2d) + threshold)) * 255.0

Cela garantirait que certains pixels ne sont pas brillants.


0 commentaires

8
votes

Certains jeux de données DICOM nécessitent un redimensionnement de la largeur / niveau de la fenêtre des intensités de pixels d'origine (via les éléments (0028,1050) Window Center et (0028,1051) Window Width dans le module VOI LUT ) afin de reproduire la façon dont ils ont été «visualisés» .

La version la plus récente de pydicom (v1.4) a une fonction apply_voi_lut () pour appliquer ce fenêtrage:

from pydicom import dcmread
from pydicom.pixel_data_handlers.util import apply_voi_lut

ds = dcmread(file)
if 'WindowWidth' in ds:
    print('Dataset has windowing')

windowed = apply_voi_lut(ds.pixel_array, ds)

# Add code for rescaling to 8-bit...

Selon le type de jeu de données, vous devrez peut-être utiliser apply_modality_lut () au préalable.


1 commentaires

FWIW, les MR générés par Phillips ont régulièrement une modalité LUT pour autant que je me souvienne, donc cela peut valoir la peine de l'utiliser également.



0
votes

Eh bien, j'ai aussi eu le même problème, vous pouvez utiliser exposition.equalize_adapthist () de la bibliothèque d'images Scikit.

filename = "sample.dcm"
ds = pydicom.read_file(filename)
image = ds.pixel_array
image = exposure.equalize_adapthist(image)

cv2.imshow("dicom", image)
cv2.waitKey(0)


0 commentaires