Проблемы применения фильтров MATLAB к изображениям Dicom

Я работаю с комодом Dicom PA. У меня нет проблем с загрузкой изображений и выполнением базовой пороговой обработки, однако мне нужно применить некоторые фильтры. В будущем я буду разрабатывать свои собственные фильтры, но сейчас я хочу использовать фильтры MATLAB. Изображения 16-битные, и в документах MATLAB говорится, что fspecial отлично работает с 16-битными изображениями.

Когда я пытаюсь использовать функции fspecial или edge, я получаю результаты, аналогичные изображениям, как показано ниже.

Мой вопрос: почему это происходит и как это исправить?

Ваша помощь приветствуется. С уважением,

full_path = 'I:\Find and Treat\Anonymized_Data\000026_20050607112512_1.dcm';
dicominfo_image = dicominfo(full_path);
dicomread_image = dicomread(dicominfo_image);
dicomread_image = mat2gray(dicomread_image);
c = imcomplement(dicomread_image);

figure,
subplot(1,3,1)
imshow(c)
f = fspecial('laplacian');
cf = filter2(f,c);
subplot(1,3,2)
imshow(cf)
f1 = fspecial('log');
cf1 = filter2(f1,c);
subplot(1,3,3)
imshow(cf1)

результаты

ИЗМЕНИТЬ

Я добавил и изменил следующий код, чтобы учесть динамический диапазон, и построил график сетки. Я получил следующий результат и сообщение об ошибке.

Предупреждение: ошибка при обновлении LineStrip.

Обновление не удалось по неизвестной причине

Предупреждение: ошибка при обновлении LineStrip.

Обновление не удалось по неизвестной причине

figure,
subplot(2,3,1)
imshow(c, [])
f=fspecial('laplacian');
cf=filter2(f,c);
subplot(2,3,2)
imshow(cf, [])
f1=fspecial('log');
cf1=filter2(f1,c);
subplot(2,3,3)
imshow(cf1, [])

subplot(2,3,4)
mesh(c)
subplot(2,3,5)
mesh(cf)
subplot(2,3,6)
mesh(cf1)

обновленное изображение

ИЗМЕНИТЬ

ССЫЛКА НА ФАЙЛ ИЗОБРАЖЕНИЯ


person bilaly    schedule 18.05.2015    source источник
comment
Вы пытались перезаписать динамический диапазон на мин/макс imshow(cf1, [])?   -  person JohnnyQ    schedule 18.05.2015
comment
Я предлагаю вам визуализировать изображение с помощью mesh(image) и посмотреть на результат. Если это неправильно, проблемы исходят от filter. Если вывод сетки выглядит нормально, вам следует посмотреть на визуализацию.   -  person Steffen    schedule 18.05.2015
comment
я обновил вопрос, чтобы принять во внимание оба приведенных выше предложения, это не очень помогло ..   -  person bilaly    schedule 18.05.2015
comment
Вы пробовали менять значения фильтров? Похоже, что у вашего изображения просто недостаточно контраста, чтобы эти фильтры работали. Можете выложить исходное изображение?   -  person Ander Biguri    schedule 18.05.2015
comment
извините за медленный ответ @AnderBiguri, я ждал разрешения от больницы на загрузку файла, я загрузил другой, который, по их словам, мне разрешили использовать, так как он уже доступен в Интернете .. у меня та же проблема с ним ...   -  person bilaly    schedule 19.05.2015
comment
Я бы всегда избегал запуска функции Matlab для недвойных данных.   -  person user3528438    schedule 19.05.2015
comment
данные изображения, используемые в фильтрах, являются двойными   -  person bilaly    schedule 19.05.2015


Ответы (1)


Ваши изображения просто слишком большие.

Оператор Лапласа представляет собой матрицу 3x3, которая аппроксимирует вторую производную изображений. Ваше изображение имеет размер 2700x2200, что означает, что изменчивость пикселей в этом маленьком размере (по сравнению со всем изображением) незначительна. Вы можете увидеть это лучше, если начертите изображение фильтра Лапласа как imshow(cf(300:end-300,300:end-300), []), удаляя границы (где у вас действительно есть большой разрыв). Чтобы решить эту проблему, вам нужно или переопределить фильтр Лапласа с более высоким размером, или изменить размер изображения, которое у вас есть, на меньший размер (imresize — ваш друг).

То же самое происходит и с фильтром log, но в этом случае с этим можно что-то сделать. Фильтр журнала по умолчанию, возвращаемый fspecial, имеет размер 5x5, но вы можете попросить fspecial создать фильтры большего размера.

Если вы называете это следующим образом:

f1=fspecial('log',50,0.3);
cf1=filter2(f1,c);
imshow(cf1, [])

Вы получаете следующую цифру, которая выглядит как хороший результат логарифмического фильтра.

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

person Ander Biguri    schedule 19.05.2015
comment
Не могу сказать ничего, кроме +1. - person rayryeng; 20.05.2015
comment
@rayryeng Спасибо! Это было относительно легко увидеть, как только было опубликовано огромное изображение! - person Ander Biguri; 20.05.2015