一.原理
1.公式
r: 模板的半徑,模板矩陣的尺寸就是 [ 2r+1 ][ 2r+1 ], 模板最好是奇數
Y:閾值函數,範圍在[0,255]
x:輸入值,當前檢測的像素點
xout:輸出值,作爲計算結果,覆蓋掉x
xi: 當前矩陣中的全部元素.
- 當 xi 進行加減運算時,是對矩陣每個元素單獨加減.結果還是一個矩陣.
w=1 - abs (imgn( i - r:i + r , j - r:j + r ) - imgn( i , j )) / ( 2.5 * T ) ;
的結果 w (式子中 未累加的分母) 是一個[2r+1][2r+1]的矩陣
- 當 xi 進行乘除運算時,也是對矩陣每個元素單獨加減.即 點乘.* 點除 ./
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
調用該函數
輸出結果: