В чем может быть причина плохого изображения dicom image

Что может быть причиной того, что dicom-файл этого обычного рентгеновского снимка строится неправильно:

введите описание изображения здесь

Используемый алгоритм следующий:

Исходная матрица изображения 3d:

int [1:2014, 1:2014, 1:3] 110 51 99 113 52 101 111 53 102 110 ...

Этот rgb преобразуется в шкалу серого по формуле:

gray = 0.3*mat[,,1] + 0.59*mat[,,2] + 0.11*mat[,,3] ; 

И затем он строится после указания цветов как:

grey(0:64/64)

Где могла быть ошибка?

Я использую пакет oro.dicom в R с функцией:

jj = readDICOMFile(fname, endian = "little", flipud = TRUE, DICM = TRUE, skipSequence = FALSE, pixelData = TRUE, warn = -1, debug = FALSE) 

и он возвращает матрицу jj $ img, структура которой:

int [1:2014, 1:2014, 1:3] 110 51.... 

Затем я конвертирую его в серый цвет и рисую. Если бы это было rgba, матрица была бы 2014 * 2014 * 4, а не * 3. В заголовке изображения dicom «PhotometricInterpretation» упоминается как «RGB». В заголовке также упоминаются строки и столбцы по состоянию на 2014 год. Может быть, это связано с битовой проблемой: leadtools.com/sdk/medical/dicom-spec17.htm

Изменить: выделенные биты - 8, сохраненные биты - 8, а highBit - 7.

Ниже приведена ссылка на образец изображения dicom, которое имеет аналогичную матрицу изображений и дает аналогичную ошибку: http://www.barre.nom.fr/medical/samples/files/US-RGB-8-esopecho.gz


person rnso    schedule 13.09.2014    source источник
comment
Для меня это проблема с шагом. Как будто вы индексируете, предполагая, что это RGBA или что-то в этом роде.   -  person Jim    schedule 13.09.2014
comment
Выделено 8 бит, 8 сохраненных битов и 7. HighBit 7. Помогает ли это?   -  person rnso    schedule 13.09.2014
comment
Как преобразовать rgba в шкалу серого? Не сразу нашел в сети.   -  person rnso    schedule 13.09.2014
comment
Что ж, ваш альфа-канал, вероятно, не имеет значения. Просто сложите RGB так же, как и вы (0,3r + 0,59g + 0,11b), и игнорируйте альфа-канал. Если это даже проблема. Это может быть много чего, но это то, как выглядит неправильная индексация. Я действительно не знаю, какой у вас формат ввода. Как вы сделали этот массив 2048x2048x3?   -  person Jim    schedule 13.09.2014
comment
Я использую пакет oro.dicom в R с функцией: jj = readDICOMFile (fname, endian = little, flipud = TRUE, DICM = TRUE, skipSequence = FALSE, pixelData = TRUE, warn = -1, debug = FALSE), и он возвращает a матрица jj $ img со структурой: int [1: 2014, 1: 2014, 1: 3] 110 51 .... Затем я конвертирую ее в серый цвет и рисую. Если бы это было rgba, матрица была бы 2014 * 2014 * 4, а не * 3. В заголовке изображения dicom PhotometricInterpretation упоминается как RGB. В заголовке также упоминаются строки и столбцы по состоянию на 2014 год. Может быть, это связано с битовой проблемой: leadtools.com/sdk/medical/dicom-spec17.htm   -  person rnso    schedule 13.09.2014
comment
Есть ли способ поделиться файлом?   -  person MrFlick    schedule 15.09.2014
comment
Следующее изображение имеет аналогичную матрицу и также не отображается должным образом: barre.nom.fr/medical/samples/files/US-RGB-8-esopecho.gz   -  person rnso    schedule 15.09.2014
comment
См. Исправленную ссылку в комментарии выше.   -  person rnso    schedule 15.09.2014


Ответы (1)


В readDICOMFile может быть ошибка. Исправить можно, переставив массив изображений:

jj = readDICOMFile(fname, flipud = FALSE, DICM = TRUE, skipSequence = FALSE, pixelData = TRUE, warn = -1, debug = FALSE)
img <- jj$img # extract image part
img <- aperm(array(c(aperm(img, c(2, 1, 3))), c(3, 256, 120)), c(3, 2, 1)) # rearrange dimension
img <- img[120:1,,] # flip ud
grid::grid.raster(scales::rescale(img))

введите описание изображения здесь


ОБНОВЛЕНИЕ

readDICOMFile есть еще одна ошибка. Это то, что вам нужно. Возможно, вам лучше сообщить об этом, но авторам oro.dicom.

img <- jj$img # extract image part
img <- aperm(array(c(aperm(img, c(2, 1, 3))), c(3, 256, 120)), c(3, 2, 1)) # rearrange dimension

# conversion b/w unsigned and signed
img <- ifelse(img > 0, img, 256+img)

# window-ing
wc <- 127
ww <- 255

ymin <- 0
ymax <- 1

img2 <- ifelse(img <= wc - 0.5 - (ww-1)/2, ymin, 
               ifelse(img > wc - 0.5 + (ww-1)/2, ymax,
                      ((img - (wc - 0.5)) / (ww - 1) + 0.5) * (ymax - ymin) + ymin
                      ))

grid::grid.raster(img2)

введите описание изображения здесь

person kohske    schedule 16.09.2014
comment
Было бы полезно, если бы вы также могли объяснить, что делает ваш код. - person rnso; 16.09.2014
comment
Да, это работает. Однако изображение сильно отличается от оригинала, вероятно, из-за разницы в ширине / центре / цветовой палитре окна. Как мы можем настроить их так, чтобы они выглядели как оригинальные (которые я публикую в своем вопросе выше). - person rnso; 16.09.2014
comment
Центр окна и ширина этого изображения 127 и 256 соответственно. (и его не нужно переворачивать вверх ногами) - person rnso; 16.09.2014
comment
Здорово. Вы создали код для правильного отображения этих изображений. Я просто подожду еще какое-то время для любых других ответов, прежде чем принимать ваш. Было бы еще лучше, если бы вы могли объяснить более подробно. - person rnso; 16.09.2014
comment
Просто пояснение: преобразование ч / б без знака и подписи необходимо для всех изображений dicom или нужно проверять заголовок каждого изображения? - person rnso; 17.09.2014
comment
Если данные DICOM беззнаковые, вам нужно преобразование (и я думаю, что 8-битный DICOM обычно или абсолютно беззнаковый). Но это преобразование работает только с 8-битными данными. Для 16-битных данных требуется другое преобразование. - person kohske; 17.09.2014
comment
В этом изображении было выделено 8 битов, сохранено 8 битов, а highBit 7. В другом файле dicom выделено 16 битов, сохранено 12 битов, а highBit равно 11. Этот файл открывается хорошо, но это MONOCHROME2, а не rgb. - person rnso; 17.09.2014