數字圖像處理 | 圖像增強 |圖片的模糊算法 | Matlab表面模糊程序

一.原理

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

調用該函數

 

輸出結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章