图像滤波边界处理方法对图像滤波的影响

%边缘效应与滤波
%实现空间滤波领域处理时的一个重要考虑因素,当滤波掩模的中心靠近图像轮廓时发生的情况
% 当一个n*n的方形掩模,其中心距离图像边缘为(n-1)/2个像素时,该掩模至少有一条边与图像轮廓相重合
%当掩模的中心继续向图像边缘靠近,那么掩模的行或列就会处于图像平面之外。

%通常处理方法为:
% (1)对图像边缘进行一定程度的扩展,保证原图像边缘也进行滤波操作 'same'参数
% 对边缘进行扩展时,又可以采用不同的方法:
    % a)完全填充 0值
    % b)边界外的矩阵取镜像反射 'symmetric'参数
    % c)边界外的矩阵取最邻近的边界值 ‘replicate'参数
    %d)边界外的矩阵取周期性的重复值 'circular'参数
% (2)不扩展图像边缘,滤波后仅取被掩模完全覆盖过的区域 'valid'参数


%当图像滤波是对实时图像数据进行操作时,显然上面不同的处理方法会带来巨大的差异
%由于实时图像处理,每次处理仅仅针对大幅图像数据中的局部小块,大量局部小块经过处理后拼合成大幅图像
%因此涉及到大量局部小图块的大量边界

%下面验证不同的边界处理方法对图像处理的影响


%===读入一幅大的图像===
img=imread('C:\Users\ThinkPad\Pictures\lena.jpg');
img=double(img);
%------------------------------

%===滤波后的图像===
fdimg=zeros(size(img));
fdimg1=fdimg;
fdimg2=fdimg1;
fdimg3=fdimg1;
fdimg4=fdimg1;
%--------------------------

Height=size(img,1);
Width=size(img,2);

%===设置一个掩模===
h=[0,-1,0;-1,4,-1;0,-1,0]; %laplace边缘算子
%-------------------------

%===整个图像滤波===
fdimg=imfilter(img,h,0,'same','corr');
%-------------------------

%===循环处理每个图像块===
Nb=20; %每个图像块的大小Nb*Nb
for i=1:Nb:Height-Nb+1
    for j=1:Nb:Width-Nb+1
        block=img(i:i+Nb-1,j:j+Nb-1); %划分当前处理的图像块
        
        %
        filted_block=imfilter(block,h,0,'same','corr'); %边界外填充0
        fdimg1(i:i+Nb-1,j:j+Nb-1)= filted_block;
        
        filted_block=imfilter(block,h,'symmetric','same','corr'); %边界外的矩阵取镜像反射
        fdimg2(i:i+Nb-1,j:j+Nb-1)= filted_block;
        
        filted_block=imfilter(block,h,'replicate','same','corr'); %边界外的矩阵取最邻近的边界值
        fdimg3(i:i+Nb-1,j:j+Nb-1)= filted_block;
        
       filted_block=imfilter(block,h,'circular','same','corr'); %边界外的矩阵取周期性的重复值
        fdimg4(i:i+Nb-1,j:j+Nb-1)= filted_block; 
        
    end
end

%---------------------------------

%===显示各种滤波边界处理方法下的滤波===
figure
subplot(1,2,1)
imshow(img,[]);
title('原始图');
subplot(1,2,2)
imshow(fdimg,[]);
title('滤波后的图像');

figure
subplot(2,2,1)
imshow(fdimg1,[]);
title('边界外填充0');

subplot(2,2,2)
imshow(fdimg2,[]);
title('边界外的矩阵取镜像反射');

subplot(2,2,3)
imshow(fdimg3,[]);
title('边界外的矩阵取最邻近的边界值');

subplot(2,2,4)
imshow(fdimg4,[]);
title('边界外的矩阵取周期性的重复值');
%---------------------------------------------------

%===通过图像块滤波后的图像与之间整体滤波的图像差异===
dev1=fdimg-fdimg1;
dev2=fdimg-fdimg2;
dev3=fdimg-fdimg3;
dev4=fdimg-fdimg4;

figure
subplot(2,2,1)
imshow(dev1,[]);
title('边界外填充0');

subplot(2,2,2)
imshow(dev2,[]);
title('边界外的矩阵取镜像反射');

subplot(2,2,3)
imshow(dev3,[]);
title('边界外的矩阵取最邻近的边界值');

subplot(2,2,4)
imshow(dev4,[]);
title('边界外的矩阵取周期性的重复值');
%--------------------------------------------------------------------

%====不同方法的准确性评价====
%取图像除了边界1圈外的其他区域的dev的绝对值和作为准确性评价的指标delta
%delta反映了 分块滤波的结果与大图一次滤波的总体差异
%delta越小,说明分块滤波的效果越好

de1=abs(dev1(2:Height-1,2:Width-1));
delta1=sum(de1,2); %按列求和

de2=abs(dev2(2:Height-1,2:Width-1));
delta2=sum(de2,2);

de3=abs(dev3(2:Height-1,2:Width-1));
delta3=sum(de3,2);

de4=abs(dev4(2:Height-1,2:Width-1));
delta4=sum(de4,2);

figure
plot(delta1,'b');
hold on
plot(delta2,'g');
plot(delta3,'r');
plot(delta4,'y');
%-----------------------------------------

%===结论===
% delta2和delta3值最小,delta1最大
%因此,边界外的图像值取镜像反射或者最邻近的边界值更适合 图像实时处理时采用的边界处理方法

%----------------

% imfilter(A,h,'replicate','same','corr');
%第三个参数:
%X:边界之外的矩阵取值X,默认为0
%'symmetric':边界外的矩阵取镜像反射
%'replicate':边界外的矩阵取最邻近的边界值
%'circular':边界外的矩阵取周期性的重复值

%第四个参数:
%'same':输出矩阵和输入矩阵保持相同的size,默认该选项
%'full':输出矩阵取输入矩阵和滤波器的 full,具体见filter2中的 'full'

%第五个参数:
%'corr':滤波时执行 correlation,与filter2方法相同
%‘conv':滤波时执行 convolution
% corr-correlation操作,无需将卷积核旋转180度;conv-convolution操作,需要将卷积核旋转180度再做卷积
% 对于旋转对称的卷积核来说,只要输入图像是整数,两种方法的结果完全一致
% 对于不是整数的输入,结果有非常细微的差异

 图像滤波边界处理方法对图像滤波的影响_第1张图片

 

图像滤波边界处理方法对图像滤波的影响_第2张图片

图像滤波边界处理方法对图像滤波的影响_第3张图片

图像滤波边界处理方法对图像滤波的影响_第4张图片

 对按块作卷积得到的图像和直接对整个图像作卷积得到的图像进行比较

红色曲线(与绿色曲线完全重合)为边界外的矩阵取镜像反射 'symmetric'(边界外的矩阵取最邻近的边界值 'replicate')

这两种的效果最好,其次是黄色曲线,表示 'circular':边界外的矩阵取周期性的重复值

因此,边界外的图像值取镜像反射或者最邻近的边界值更适合 图像实时处理时采用的边界处理方法

你可能感兴趣的:(图像滤波边界处理方法对图像滤波的影响)