函数接受输入图像和不同的内核大小

时间:2013-10-26 11:41:56

标签: matlab image-processing

我有这个过滤功能,它接受输入图像,使用给定的内核执行卷积,并返回结果图像。但是,我似乎无法解决如何使它采用不同的内核大小。例如,代码中的预定义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

1 个答案:

答案 0 :(得分:0)

我已对代码进行了评论并标记了要更改的地点<--。此示例中的kernel是3 * 3 = 9个元素的列向量。除了更改内核本身,您可能还需要更改图像周围的零填充量。例如,对于5x5内核,您需要两行和两列填充而不是一行。然后更新我标记为“抓住每个像素”的内部循环以拉出内核大小的区域(例如,for x=1:5for y=1:5用于5x5内核)。实际的卷积没有改变。

提醒:该功能正在拍摄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