matlab練習程式(各向異性擴散)

2022-06-12 06:06:07 字數 1791 閱讀 6442

主要是用來平滑影象的,克服了高斯模糊的缺陷,各向異性擴散在平滑影象時是保留影象邊緣的(和雙邊濾波很像)。

通常我們有將影象看作矩陣的,看作圖的,看作隨機過程的,記得過去還有

看作力場

的。這次新鮮,將影象看作熱量場了。每個畫素看作熱流,根據當前畫素和周圍畫素的關係,來確定是否要向周圍擴散。比如某個鄰域畫素和當前畫素差別較大,則代表這個鄰域畫素很可能是個邊界,那麼當前畫素就不向這個方向擴散了,這個邊界也就得到保留了。

先看下效果吧:

具體的推導公式都是熱學上的,自己也不太熟悉,感興趣的可以去看原**,引用量超7000吶。

我這裡只介紹一下最終結論用到的公式。

主要迭代方程如下:

i就是影象了,因為是個迭代公式,所以有迭代次數t。

四個散度公式是在四個方向上對當前畫素求偏導,news就是東南西北嘛,公式如下:

而cn/cs/ce/cw則代表四個方向上的導熱係數,邊界的導熱係數都是小的。公式如下:

最後整個公式需要先前設定的引數主要有三個,迭代次數t,根據情況設定;導熱係數相關的k,取值越大越平滑,越不易保留邊緣;lambda同樣也是取值越大越平滑。

最後是matlab**:

clear all;

close all;

clc;

k=15

; %導熱係數,控制平滑

lambda=0.15

; %控制平滑

n=20

; %迭代次數

%當前畫素的散度,對四個方向分別求偏導,區域性不同方向上的變化量,

%如果變化較多,就證明是邊界,想方法保留邊界

ni=img(p-1,q)-img(p,q);

si=img(p+1,q)-img(p,q);

ei=img(p,q-1)-img(p,q);

wi=img(p,q+1)-img(p,q);

%四個方向上的導熱係數,該方向變化越大,求得的值越小,從而達到保留邊界的目的

cn=exp(-ni^2/(k*k));

cs=exp(-si^2/(k*k));

ce=exp(-ei^2/(k*k));

cw=exp(-wi^2/(k*k));

imgn(p,q)=img(p,q)+lambda*(cn*ni+cs*si+ce*ei+cw*wi); %擴散後的新值

endend

img=imgn; %整個影象擴散完畢,用已擴散影象的重新擴散。

endfigure;

imshow(imgn,);

參考:《特徵提取與影象處理(第二版)》

matlab各向異性擴散濾波

主要是用來平滑影象的,克服了高斯模糊的缺陷,各向異性擴散在平滑影象時是保留影象邊緣的 和雙邊濾波很像 通常我們有將影象看作矩陣的,看作圖的,看作隨機過程的,記得過去還有看作力場的。這次新鮮,將影象看作熱量場了。每個畫素看作熱流,根據當前畫素和周圍畫素的關係,來確定是否要向周圍擴散。比如某個鄰域畫素和...

各向異性擴散

主要是用來平滑影象的,克服了高斯模糊的缺陷,各向異性擴散在平滑影象時是保留影象邊緣的 和雙邊濾波很像 通常我們有將影象看作矩陣的,看作圖的,看作隨機過程的,記得過去還有 看作力場的。這次新鮮,將影象看作熱量場了。每個畫素看作熱流,根據當前畫素和周圍畫素的關係,來確定是否要向周圍擴散。比如某個鄰域畫素...

各向異性擴散

主要是用來平滑影象的,克服了高斯模糊的缺陷,各向異性擴散在平滑影象時是保留影象邊緣的 和雙邊濾波很像 通常我們有將影象看作矩陣的,看作圖的,看作隨機過程的,記得過去還有 看作力場的。這次新鮮,將影象看作熱量場了。每個畫素看作熱流,根據當前畫素和周圍畫素的關係,來確定是否要向周圍擴散。比如某個鄰域畫素...