我有这个过滤功能,它接受输入图像,使用给定的内核执行卷积,并返回结果图像。但是,我似乎无法解决如何使它采用不同的内核大小。例如,代码中的预定义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
答案 0 :(得分:0)
我已对代码进行了评论并标记了要更改的地点<--
。此示例中的kernel
是3 * 3 = 9个元素的列向量。除了更改内核本身,您可能还需要更改图像周围的零填充量。例如,对于5x5内核,您需要两行和两列填充而不是一行。然后更新我标记为“抓住每个像素”的内部循环以拉出内核大小的区域(例如,for x=1:5
和for y=1:5
用于5x5内核)。实际的卷积没有改变。
提醒:该功能正在拍摄uint8
(0..255值)的RGB图像。 window
和kernel
为double
,因此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