Почему вывод `conv2 ()` делится на `sz ^ 2`? - PullRequest
0 голосов
/ 03 сентября 2018

Следующая процедура вычитает среднее значение из изображения, делая его более резким.

  • im - это матрица изображений.
  • sz является целым числом.

Как работает эта процедура:

  1. Изображение сначала преобразуется в двойное.
  2. половина sz используется в качестве значения размера площадки (это означает, что эта процедура будет применять свертку на изображении).
  3. m - высота изображения, n - ширина изображения, o - нет. каналов в изображении.
  4. 2d массив размером sz x sz инициализируется с 1 с.
  5. Объявляется цикл for, который работает на трех итерациях, поскольку эта процедура будет применять операцию свертки на каждом из каналов.
  6. im(:,:,q) означает, что фильтр применяется на месте.
  7. same означает, что операция свертки возвращает центральную часть свертки, размер которой равен im. То есть он обрезает вывод свертки.

.

function pad = erase_mean(im, sz)    
    im = double(im);

    pad = floor(sz/2);
    [m,n,o] = size(im);

    mask = ones(sz,sz);

    for q=1:o       
        im(:,:,q)=double(im(:,:,q))-conv2(double(im(:,:,q)),mask,'same')./sz^2;

        mx=max(max(im(1+pad*2:m-pad*2,1+pad*2:n-pad*2,q)));

        im(:,:,q)=(im(:,:,q)./mx).*255;        
    end;

    mx = max(max(im(1+pad*2:m-pad*2,1+pad*2:n-pad*2,q)));
    im = uint8((im./mx(1)).*255);
    pad = im(1+pad*2:m-pad*2,1+pad*2:n-pad*2,:);

Почему вывод conv2() делится на sz^2?

1 Ответ

0 голосов
/ 03 сентября 2018

Обратите внимание, что

conv2(double(im(:,:,q)),mask,'same')./sz^2

совпадает с

conv2(double(im(:,:,q)),mask./sz^2,'same')

Это потому, что свертка и умножение коммутируют.

Таким образом, операция свертки вычисляет локальное среднее значение. Без деления это была бы местная сумма.

...