**:
主要是用來平滑影象的,克服了高斯模糊的缺陷,各向異性擴散在平滑影象時是保留影象邊緣的(和雙邊濾波很像)。
通常我們有將影象看作矩陣的,看作圖的,看作隨機過程的,記得過去還有
看作力場的。
這次新鮮,將影象看作熱量場了。每個畫素看作熱流,根據當前畫素和周圍畫素的關係,來確定是否要向周圍擴散。比如某個鄰域畫素和當前畫素差別較大,則代表這個鄰域畫素很可能是個邊界,那麼當前畫素就不向這個方向擴散了,這個邊界也就得到保留了。
先看下效果吧:
具體的推導公式都是熱學上的,自己也不太熟悉,感興趣的可以去看原**,引用量超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各向異性擴散濾波
主要是用來平滑影象的,克服了高斯模糊的缺陷,各向異性擴散在平滑影象時是保留影象邊緣的 和雙邊濾波很像 通常我們有將影象看作矩陣的,看作圖的,看作隨機過程的,記得過去還有看作力場的。這次新鮮,將影象看作熱量場了。每個畫素看作熱流,根據當前畫素和周圍畫素的關係,來確定是否要向周圍擴散。比如某個鄰域畫素和...
matlab練習程式(各向異性擴散)
主要是用來平滑影象的,克服了高斯模糊的缺陷,各向異性擴散在平滑影象時是保留影象邊緣的 和雙邊濾波很像 通常我們有將影象看作矩陣的,看作圖的,看作隨機過程的,記得過去還有 看作力場 的。這次新鮮,將影象看作熱量場了。每個畫素看作熱流,根據當前畫素和周圍畫素的關係,來確定是否要向周圍擴散。比如某個鄰域畫...