0

入力画像を受け取り、特定のカーネルを使用して畳み込みを実行し、結果の画像を返すこのフィルタリング関数があります。ただし、異なるカーネル サイズを使用する方法がわかりません。たとえば、以下のコードのように定義済みの 3x3 カーネルの代わりに、5x5 または 7x7 を使用できます。次に、ユーザーは必要なカーネル/フィルターのタイプを入力できます(意図した効果によって異なります)。私はそれについて頭を置くことができないようです。私はmatlabが初めてです。

function [newImg] = kernelFunc(imgB)


img=imread(imgB);

figure,imshow(img); 




img2=zeros(size(img)+2);

newImg=zeros(size(img));




for rgb=1:3

        for x=1:size(img,1)

            for y=1:size(img,2)

                img2(x+1,y+1,rgb)=img(x,y,rgb);

            end

        end

end


for rgb=1:3
    for i= 1:size(img2,1)-2

        for j=1:size(img2,2)-2

            window=zeros(9,1);

            inc=1;

            for x=1:3

                for y=1:3

                    window(inc)=img2(i+x-1,j+y-1,rgb);

                    inc=inc+1;

                end

            end

           kernel=[1;2;1;2;4;2;1;2;1]/16;



            med=window.*kernel;

            disp(med);

            med=sum(med);

            med=floor(med);


            newImg(i,j,rgb)=med;



        end

    end

end


newImg=uint8(newImg);

figure,imshow(newImg);

end
4

1 に答える 1

0

コードにコメントを付けて、変更する場所をマークしました<--kernelこの例では、3*3=9 要素の列ベクトルです。カーネル自体を変更するだけでなく、画像の周りのゼロ パディングの量も変更する必要がある場合があります。たとえば、5x5 カーネルの場合、1 つではなく 2 行と 2 列のパディングが必要になります。次に、「各ピクセルをグラブ」とマークした内部ループを更新して、カーネルのサイズの領域をプルします (たとえば、for x=1:55x5for y=1:5カーネルの場合)。実際の畳み込みは変更されません。

注意: この関数はuint8(0..255 値の) RGB 画像を取得しています。 windowkerneldoubleであるため、truncは新しいピクセル値を に入れる前に小数部分を切り捨てますuint8 newImg

function [newImg] = kernelFunc(imgB)

img=imread(imgB);
figure,imshow(img); 

img2=zeros(size(img)+2);  % one extra column on each side, and one extra
                          % row top and bottom. <-- May need more padding.
newImg=zeros(size(img));    % the destination

% Pad the image with zeros at the left and top (transform img->img2)
for rgb=1:3
    for x=1:size(img,1) %for each row
        for y=1:size(img,2) %for each column
            img2(x+1,y+1,rgb)=img(x,y,rgb);    % <-- adjust per kernel size
        end
    end
end

% Process the padded image (img2->newImg)
for rgb=1:3
    for i= 1:size(img2,1)-2         % for each row
        for j=1:size(img2,2)-2      % for each column

            % Build a row vector of the pixels to be convolved.
            window=zeros(9,1);      % <-- 9=kernel size
            inc=1;
            for x=1:3               % <-- grab each pixel 
                for y=1:3           % <-- under the kernel
                    window(inc)=img2(i+x-1,j+y-1,rgb);
                    inc=inc+1;
                end
            end

            kernel=[1;2;1;2;4;2;1;2;1]/16;  % <-- the kernel itself

            med=window.*kernel;     % start the convolution
            disp(med);
            med=sum(med);           % finish the convolution
            med=floor(med);         % fit the pixels back into uint8.

            newImg(i,j,rgb)=med;    % store the result

        end %for each column
    end %for each row
end %for each color channel


newImg=uint8(newImg);
figure,imshow(newImg);

end
于 2013-10-26T15:49:58.513 に答える