Получение полного белого изображения при понижающей дискретизации

Я выполнил уменьшение изображения с помощью операции усреднения. Изображение делится на 2 на 2 блока, затем оно уменьшается в 4 раза. Новые значения пикселей изображения с пониженной дискретизацией заменяются средним значением каждого блока следующим образом:

img = imread('cameraman.tif');
avgfilter = fspecial('average', [2 2]);
avgimg = filter2(avgfilter, img);
down1 = avgimg(1:2:end,1:2:end);
imshow(down1);

Я использовал изображение в градациях серого в качестве входных данных. Тем не менее, я получаю полное белое изображение в качестве вывода при понижающей дискретизации. Почему это происходит? Пожалуйста помоги.

1 ответ

Решение

Причина этого заключается в том, что ваше среднее изображение после использования filter2 это изображение двойного типа. Вы не первый человек (и, вероятно, не последний человек), чтобы испытать эту путаницу с imshow, На самом деле, почти все проблемы, которые я решил в отношении imshow здесь на Stackru из-за этой небольшой путаницы с imshow,

Вы должны знать тип изображения, которое вы пытаетесь отобразить imshow прежде чем вы решите использовать функцию. Изображения типа double ожидается, что его интенсивность / цветовые каналы будут находиться в диапазоне между [0,1], Все, что ниже 0 настроен на черный цвет 1 установлен на белый цвет, поэтому вы получаете полностью белое изображение.

Вам необходимо преобразовать обратно в uint8 правильно отображать изображение. Поэтому попробуйте сделать это, прежде чем показать свое изображение:

down1 = uint8(down1);
imshow(down1);

Когда я делаю это, это то, что я получаю, когда показываю уменьшенное изображение.


Незначительный комментарий

FWIW, когда дело доходит до фильтрации изображений, я бы лично использовал imfilter вместо. imfilter предназначен для фильтрации изображений, где filter2 для более общих 2D-сигналов. Одна вещь, которая хороша imfilter является то, что он будет выводить изображение того же типа, где filter2 по умолчанию будет double, Я бы держался подальше от filter2 если вы не вынуждены использовать его на изображениях.

Таким образом, замените ваш filter2 синтаксис с:

avgimg = imfilter(img, avgfilter);

Если вы сделаете это вместо этого, вам не нужно приводить изображение обратно в uint8, Вы сможете правильно визуализировать результаты с imshow,

Другие вопросы по тегам