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
3 Réponses :
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.
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.
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.
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)