Python конвертировать .dcm в .png, изображения слишком яркие - PullRequest
3 голосов
/ 14 февраля 2020

Мне нужно конвертировать некоторые файлы, которые по умолчанию приходят как .dcm в .png, я нашел несколько примеров кода для достижения этой цели, но конечные результаты слишком яркие. Кто-нибудь может взглянуть на это, пожалуйста?

 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)

Я настроил код, но, похоже, ничего не работает.

Вот так выглядит реальная вещь как дихома, а справа - результат выполнения этого кода enter image description here

Ответы [ 2 ]

8 голосов
/ 14 февраля 2020

Для некоторых наборов данных DICOM требуется ширина окна / масштабирование уровня исходной интенсивности пикселей (через (0028,1050) Центр окна и (0028,1051) Ширина окна элементов в модуле VOI LUT ), чтобы воспроизвести то, как они были «просмотрены».

Последний выпуск pydicom (v1.4) имеет функцию apply_voi_lut () для применения этого окна:

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...

В зависимости от типа набора данных вам может понадобиться заранее использовать apply_modality_lut () .

0 голосов
/ 14 февраля 2020

A .dcm изображение имеет диапазон яркости и контрастности при анализе конкретного изображения. Причина, по которой он может выглядеть немного ярче в вашем случае, заключается в том, что вы выбрали только определенный вид изображения.

Чтобы сделать изображение темнее, похоже, вам просто нужно увеличить значение знаменателя:

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

Это гарантирует, что некоторые пиксели не будут яркими.

...