столбец для блокировки, используя скользящее окно в Matlab - PullRequest
0 голосов
/ 19 апреля 2011

используя im2col скользящее окно в Matlab. Я преобразовал блок входного изображения в столбец и снова, используя col2im, я делаю обратный процесс, но результат не совпадает с входным изображением. Как я могу восстановить входное изображение? Может кто-нибудь, пожалуйста, помогите мне.

Вот код

in=imread('tire.tif');
[mm nn]=size(in);
m=8;n=8;
figure,imshow(in);
i1=im2col(in,[8 8],'sliding');
i2 = reshape( sum(i1),mm-m+1,nn-n+1);
out=col2im(i2,[m n],[mm nn],'sliding');
figure,imshow(out,[]);

спасибо заранее ...

Ответы [ 3 ]

3 голосов
/ 19 апреля 2011

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

  1. Вы не должны ожидать, что выходные данные будут точно такими же, как входные, поскольку вы заменяете каждое значение пикселя суммой пикселей в окрестности 8 на 8. Кроме того, вы получите сжатие результирующего изображения на 7 пикселей в каждом направлении (т. Е. [m-1 n-1]), поскольку параметр 'sliding' IM2COL не дополняет массив нулями для создания окрестностей для пикселей вблизи края.

  2. Эти две строки являются избыточными:

    i2 = reshape( sum(i1),mm-m+1,nn-n+1);
    out=col2im(i2,[m n],[mm nn],'sliding');
    

    Вам нужен только один или другой, а не оба:

    %# Use this:
    out = reshape(sum(i1),mm-m+1,nn-n+1);
    %# OR this:
    out = col2im(sum(i1),[m n],[mm nn],'sliding');
    
  3. Данные изображения в MATLAB равны , как правило, типа 'uint8', что означает, что каждый пиксель представлен в виде 8-разрядного целого числа без знака, охватывающего диапазон от 0 до 255. Если предположить, что это in, то при выполнении операции суммирования вы неявно преобразуете ее в тип 'double' (поскольку 8-разрядное целое число без знака, скорее всего, не будет достаточно большой, чтобы держать итоговые суммы). Когда значения пикселей изображения представлены двойным типом, ожидается, что значения пикселей будут охватывать диапазон от 0 до 1, поэтому вам потребуется масштабировать полученное изображение по его максимальному значению, чтобы оно отображалось правильно:

    out = out./max(out(:));
    
  4. Наконец, проверьте, какой тип входного изображения вы используете. Для вашего кода вы, по сути, предполагаете, что in является 2-мерным (то есть изображение в градациях серого ). Если это truecolor (то есть RGB) изображение , третье измерение вызовет у вас некоторые проблемы, и вам придется либо обрабатывать каждую цветовую плоскость отдельно и рекомбинировать их, либо конвертировать RGB-изображение в градациях серого . Если это индексированное изображение (со связанной картой цветов), вы не сможете выполнить описанную выше обработку, не превратив ее сначала в представление в оттенках серого .

0 голосов
/ 08 апреля 2015

i1 полученный из опции 'sliding' содержит информацию, которую вы также получите из опции 'distinct', которую необходимо отфильтровать. Теперь, возможно, это не лучший способ его кодирования, но он работает. Предположим, что mm кратно m, а nn кратно n. Если это не так, то вам придется соответственно дополнить нулями, чтобы это произошло.

in=imread('tire.tif');
[mm nn]=size(in);        
m=8;n=8;
i1 = im2col(in,[m,n],'sliding');

inSel = [];
for k=0:mm/m-1
 inSel = [inSel 1:n:nn+(nn-n+1)*n*k];
end
out = col2im(i1(:,inSel),[m,n],[mm,nn],'distinct');
0 голосов
/ 19 апреля 2011

Почему вы ожидаете, что результат будет таким же?

i2 - это результат выполнения SUM вокруг пиксельной окрестности (по сути, фильтра нижних частот), который является окончательным размытым изображением, которое вы видите.т.е. вы НЕ выполняете обратный процесс с вызовом COL2IM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...