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 内核,您需要两行两列的填充而不是一列。然后更新我标记为“抓取每个像素”的内部循环,以拉取内核大小的区域(例如,for x=1:5对于for y=1:55x5 内核)。实际卷积不变。

提醒:该函数正在获取uint8(0..255 值)RGB 图像。 window并且kerneldouble,因此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 回答