Получение полного белого изображения при понижающей дискретизации
Я выполнил уменьшение изображения с помощью операции усреднения. Изображение делится на 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
,