Следующая процедура вычитает среднее значение из изображения, делая его более резким.
- im - это матрица изображений.
- sz является целым числом.
Как работает эта процедура:
- Изображение сначала преобразуется в двойное.
- половина
sz
используется в качестве значения размера площадки (это означает, что эта процедура будет применять свертку на изображении).
- m - высота изображения, n - ширина изображения, o - нет. каналов в изображении.
- 2d массив размером
sz
x sz
инициализируется с 1 с.
- Объявляется цикл for, который работает на трех итерациях, поскольку эта процедура будет применять операцию свертки на каждом из каналов.
im(:,:,q)
означает, что фильтр применяется на месте.
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
?