1.公式
r: 模板的半径,模板矩阵的尺寸就是 [ 2r+1 ][ 2r+1 ], 模板最好是奇数
Y:阈值函数,范围在[0,255]
x:输入值,当前检测的像素点
xout:输出值,作为计算结果,覆盖掉x
xi: 当前矩阵中的全部元素.
w=1 - abs (imgn( i - r:i + r , j - r:j + r ) - imgn( i , j )) / ( 2.5 * T ) ;
的结果 w (式子中 未累加的分母) 是一个[2r+1][2r+1]的矩阵
2.模板矩阵
举例,半径r=3px,矩阵=[7][7]
3.扩展矩阵
为了边界扩展,生成一个 imgn 矩阵来容纳 img 和边界
依次填充:
Surface Blur.m
function [img] = SurfaceBlur(A,r,T)
%UNTITLED10 此处显示有关此函数的摘要
%srcData:源图像
%r:半径
%T:阈值
%
% 此处显示详细说明
w=zeros(2*r+1,2*r+1); %模板矩阵的尺寸
%图像初始化处理
img=rgb2gray(A); %源图片转灰度图
subplot(1,2,1),imshow(img);title("原图");
img=double(img); %转为矩阵
%解决边界值问题
[m,n]=size(img);
imgn=zeros(m+2*r,n+2*r); %创建一个长宽各增加[2r]的扩容矩阵
imgn(r+1:r+m,r+1:r+n)=img;
imgn(1:r,r+1:r+n)=img(1:r,1:n); %上边界填充
imgn(1:m+r,n+r+1:n+2*r)=imgn(1:m+r,n+1:n+r); %右边界填充
imgn(m+r+1:m+2*r,r+1:n+2*r)=imgn(m+1:m+r,r+1:n+2*r); %下边界填充
imgn(1:m+2*r,1:r)=imgn(1:m+2*r,r+1:2*r); %左边界填充
%开始计算每个像素,共计算m*n次
for i=r+1:r+m
for j=r+1:r+n %遍历imgn 中部的源img部分
%计算式子的分母
w=1-abs(imgn(i-r:i+r,j-r:j+r)-imgn(i,j))/(2.5*T); %w是一个以img中的元素为核心,size=[2r+1][2r+1]的矩阵,这样的模板会计算m*n次
%灰度值溢出检查
for p=1:2*r+1
for q=1:2*r+1
if w(p,q) <=0
w(p,q)=0;
end
end
end
%计算式子的分子
s=w.*imgn(i-r:i+r,j-r:j+r);
%计算总式
imgn(i,j)=sum(sum(s))/sum(sum(w)); %一个sum()对一维数组求和,sum(sum())就是对二维矩阵求和
end
end
img=imgn(r+1:r+m,r+1:r+n); %从imgn截取出源img部分
subplot(1,2,2),imshow(mat2gray(img));title("SurfaceBlur算法后");
end
调用该函数
输出结果: