Átlagoló szűrő

Készítünk egy függvényt, amely paraméterként várja az input képet és a szűrő méretét.

function result = myaveragefilter( img, kernel_size )

        k = floor(kernel_size / 2);
        result = img;

        [height, width, channels] = size(img);
   
        for c = 1:channels;
            for i = 1:height-1;
                for j=1:width-1;
                    from_row = max( 1, i- k );
                    to_row = min( i+k, height-1);
                    from_col = max(1, j-k);
                    to_col = min( j+k, width-1 );
                    s = sum(sum(img(from_row:to_row, from_col:to_col,c)));
                    s = s / ( (to_row-from_row+1) * (to_col - from_col+1) );
                    result(i,j,c) = s;
                end
            end
        end
   
  
end

 

 Egy másik megoldás: egy tempoláris képbe eltolásokkal összegezzük a képpontok intezitásait, majd leosztjuk az összegeket a környezet méretével.

function result = myaveragefilter2( img, kernel_size )

    k = floor(kernel_size / 2); 
    [height, width, channels] = size(img);
    
    padimg = zeros(height+kernel_size, width+kernel_size, channels, 'uint16');
    result = padimg;
   
    for c = 1:channels;
        counter = 0;
        for u=-k:1:k-1;
           for v = -k:1:k-1;
             value = result(1+u+k:u+k+height, 1+v+k:v+k+width, c) + uint16(img(:,:, c));
             result(1+u+k:u+k+height, 1+v+k:v+k+width, c) = value;
             counter = counter + 1;
           end
        end
        result(:,:,c) = result(:,:,c) ./ counter;
     end
   
     result = result(k:k+height-1, k:k+width-1,:);
     result = uint8(result);

    
end