1. 自编一个二维滤波函数myfilter2(H, A),实现matlab中的filter2函数的功能(边缘采用复制的方式);选择一个空域低通滤波模板,用自编的函数对某图像做平滑.
主程序:
// An highlighted block
clear;clc;
img=imread('C:\Users\87991\Desktop\实验报告\图像处理\图\circuitboard-salt.tif');
%img=rgb2gray(img);
box=[1 2 1;2 4 2;1 2 1];
box=box/sum(box(:));
[img1,img2]=myfilter2(img,box);
subplot(131),imshow(uint8(img)),title('原图');
subplot(132),imshow(uint8(img1)),title('自定义平滑');
subplot(133),imshow(uint8(img2)),title('原函数平滑')
myfilter2类:
// An highlighted block
function [img1,img2]=myfilter2(img,box)
% clear;clc;
% img=imread('C:\Users\87991\Desktop\2.jpg');
% img=rgb2gray(img);
img=double(img);
[h,w]=size(img);
%box=[1 1;2 2]; %2X2 全1
%box=[1 1 1;2 2 2;3 3 3]; %3X3 全1
%box=[1 1 1 1;2 2 2 2;3 3 3 3;4 4 4 4]; %4X4 全2
%box=[1 1 1 1 1;2 2 2 2 2;3 3 3 3 3;4 4 4 4 4;5 5 5 5 5]; %5X5 全2
%box=[1 2 3 4;1 2 2 4;3 3 2 1 ;]; %3X4 左 1 右2 上下1
box=[1 2 3;1 2 2;3 3 2;1 2 1]; %4X3 左右1 上1 下2
box=box/sum(box(:));
str='zeros';
[n,m]=size(box);
tend_img=img;
if(mod(n,2)~=mod(m,2)) %若模板行与列分别为偶数和奇数
if (strcmp(str,'sample'))
for i=1:round((n/2))-1 %复制填充
tend_img=[img(1:h);tend_img];
end
for i=1:n/2
tend_img=[tend_img;img(end,:)];
end
[h,w]=size(tend_img);
for i=1:round((m/2))-1
tend_img=[tend_img(1:h,1),tend_img];
end
for j=1:m/2
tend_img=[tend_img,tend_img(:,end)];
end
else
for i=1:round((n/2))-1 %零填充
tend_img=[zeros(1,w);tend_img]; %上/行
end
for i=1:(n/2) %下/行
tend_img=[tend_img;zeros(1,w)];
end
[h,w]=size(tend_img);
for i=1:round((m/2))-1 %左/列
tend_img=[zeros(h,1),tend_img];
end
for j=1:(m/2) %右/列
tend_img=[tend_img,zeros(h,1)];
end
end
elseif (strcmp(str,'sample')) %奇数 复制填充
for i=1:n/2
tend_img=[img(1,:);tend_img;img(end,:)];
end
for j=1:m/2
tend_img=[tend_img(:,1),tend_img,tend_img(:,end)];
end
elseif(strcmp(str,'zeros')) %奇数 零填充
for i=1:n/2
tend_img=[zeros(1,w);tend_img;zeros(1,w)];
end
[r,l]=size(tend_img);
for j=1:m/2
tend_img=[zeros(r,1),tend_img,zeros(r,1)];
end
end
[h,w]=size(tend_img);
for i=1:h-n+1
for j=1:w-m+1
c=tend_img(i:i+(n-1),j:j+(m-1)); %取模板覆盖图像
num=c.*box; %覆盖区域与模板相乘
num=round(sum(num(:))); %相加
img1(i,j)=num;
end
end
img2=filter2(box,img);
end
% subplot(131),imshow(uint8(img)),title('原图');
% subplot(132),imshow(uint8(img1)),title('自定义平滑');
% subplot(133),imshow(uint8(img2)),title('原函数平滑');
注意点:当滤波核不为正方形时,即3X4或4X3时图像的边缘扩充会有相应变化。具体可看注释。
效果图:
原图:
自定义效果:
Matlab自带效果: