散度与梯度在图像中的应用
梯度和散度概念
首先回顧一下梯度和散度的概念。這里給出梯度和散度的公式:
對于u = u(x,y,z),
那么u的梯度就為:,梯度操作的是函數(shù),得到的是偏導(dǎo)數(shù)作為各分量構(gòu)成一個向量。
而散度則為
參考:
http://www.zhihu.com/question/24591127
Nonlocal Variational Model for Pansharpening Image Fusion
在了解了梯度和散度的的概念之后,我們將其應(yīng)用到圖像中去。首先,我們經(jīng)常用到的是求圖像的梯度,也就是使用差分法分別在圖像的x,y方向求得圖像的梯度分量,然后利用sqrt(x.^2 + y.^2)就生成了圖像的梯度圖了。那按照散度的公式,如果我們將x,y方向的梯度分量當(dāng)做2個向量場,即把x當(dāng)做P(x,y,z),y當(dāng)做Q(x,y,z),那么繼續(xù)對x,y方向的梯度分量求梯度就可以得到散度公式中的2個加數(shù),得到的正是下面所說的zx_x和zy_y。對于某點(diǎn)來說,也就是得到了該點(diǎn)的流動速率。
下面詳細(xì)一些說明:
1. 什么是散度
1.1 散度的定義
散度是作用在向量場上的一個算子。
用三維空間來舉例,向量場就是在空間每一點(diǎn)處都對應(yīng)一個特殊的三維向量的向量函數(shù):
。比如海洋里,各點(diǎn)在單位時間單位體積中水的流量就是一個三維場,這個場也稱為通量。
散度算子定義為:
。
它是一個標(biāo)量函數(shù)(場),也就是說,在定義空間中每一點(diǎn)的散度是一個值。
1.2 散度的物理意義
用水流來解釋,散度的物理意義可以敘述為:
- 如果一點(diǎn)的散度大于0,那么在這一點(diǎn)有一個水龍頭不斷往外冒水(稱為源點(diǎn))
- 如果一點(diǎn)的散度小于0,那么在這一點(diǎn)有一個下水道,總有一些水只進(jìn)不出(稱為匯點(diǎn))
- 如果一點(diǎn)的散度等于0,那么請放心,在這個點(diǎn)周圍的小區(qū)域里,單位時間進(jìn)來多少水就出去多少水。
1.3 數(shù)學(xué)推導(dǎo)
咱們來看看在一點(diǎn)的附近到底發(fā)生了什么。以這一點(diǎn)為中心,用一個邊長分別為的平行于坐標(biāo)軸的長方體盒子包圍它,來詳細(xì)分析長方體各表面水向外跑了多少。先看盒子在方向上的兩個面:
第一個面是一個面積為的長方形,它的中心坐標(biāo)是,這一點(diǎn)的通量是,用Taylor展開式可以近似為:,又因?yàn)檫@一長方形的外法線方向是,因此這一面在單位時間向外的流量就是二者相乘再乘以面積,由于法線的特殊形式,y、z分量自動消失了:
同理,在x負(fù)半軸上的那個面單位時間向外的流量是:
因此單位時間在x方向上的總的向外的流量是:
把三個坐標(biāo)軸向外的流量加在一起,我們就得到了圍繞點(diǎn),體積為的長方體單位時間向外的流量是。
從上面的推導(dǎo)立即可以得出結(jié)論:
- 在一個區(qū)域中,單位時間向外的總流量就是把每一個小區(qū)域向外的流量加起來(內(nèi)部相互抵消,最終只有區(qū)域邊界上的值得以展現(xiàn)):
- 平均到一個點(diǎn)上,單位時間向外流量的密度就是
- 一個區(qū)域無論多復(fù)雜,只要不包含源點(diǎn)和匯點(diǎn),其上散度的積分一定為0
1.4 散度與擴(kuò)散
假設(shè)在空間中有一個濃度場,則在每一點(diǎn)都有一個濃度上升最快的方向,我們稱其為梯度,它是一個向量場。濃度差帶來的后果就是空間物質(zhì)會發(fā)生運(yùn)動,從高濃度向低濃度運(yùn)動,其結(jié)果就是濃度中和,趨向平衡。這種運(yùn)動可以用一個偏微分方程描述:
這個方程被形象地稱為擴(kuò)散方程,來源于物理上的連續(xù)性方程。等式右邊一定是負(fù)散度,因?yàn)槿粢粋€點(diǎn)散度為正,說明它濃度大,擴(kuò)散應(yīng)該減少它的值,然而因?yàn)闈舛葘?yīng)的運(yùn)動場是梯度的負(fù)值(高濃度向低濃度流動),因此恰好內(nèi)外兩個負(fù)號抵消了,最終右端就出現(xiàn)了貌似不科學(xué)的正散度結(jié)果,不要被迷惑住。散度算子內(nèi)部的量可以是標(biāo)量,也可以是矩陣,用于調(diào)節(jié)濃度差與擴(kuò)散方向之間的關(guān)系。
為了更加直觀地理解,咱先略去多余因子,這樣方程就變成了:
等式右邊被稱為Laplace算子,一般用一個正三角來簡寫,你可以用二階導(dǎo)數(shù)來理解它。在一小段時間間隔上,這個方程又可以離散化為:
直接含義就是:在每個小時間段內(nèi),如果一個點(diǎn)的二階導(dǎo)數(shù)大于0,則把它的濃度增加一些,如果一個點(diǎn)二階導(dǎo)數(shù)小于0,則把它的濃度降低一些。因?yàn)槎A導(dǎo)數(shù)大于0的點(diǎn)往往是下凹的點(diǎn),是局部極小值,因此增加它可以讓局部濃度變平滑;類似地,二階導(dǎo)數(shù)小于0的點(diǎn)往往是上凸點(diǎn),是局部極大值,要減少它才能更平滑。
當(dāng)時間趨向于無窮大時,方程達(dá)到穩(wěn)定,左端為0,那么我們就得到穩(wěn)定值滿足的條件:整個區(qū)域上散度為0。也可以理解為最終消滅了所有的源點(diǎn)和匯點(diǎn),場變得光滑了。?
2. 散度在圖像去噪中的應(yīng)用
在圖像領(lǐng)域散度算子主要用在去噪中。假設(shè)一幅圖像為,它的梯度算子是一個二維場,那么我們立即可以用散度算子構(gòu)造一個擴(kuò)散方程:
把這個擴(kuò)散方程作用于圖像就可以去噪了,上面已經(jīng)解釋了它的作用過程是比較圖像上的每個點(diǎn),如果一個點(diǎn)值比周圍點(diǎn)低,就增加它,如果比周圍點(diǎn)高,就減少它,實(shí)質(zhì)就是平滑圖像。但是由于它是各向同性的均勻擴(kuò)散方程,導(dǎo)致圖像上所有細(xì)節(jié)均勻模糊,去噪效果很糟糕。
Perona和Malik在90年代初發(fā)現(xiàn),由于圖像邊緣往往處在梯度值較大的點(diǎn)處,如果擴(kuò)散方程在梯度值較大的區(qū)域減速擴(kuò)散,在梯度值較小的區(qū)域加速擴(kuò)散,則可以在著重去噪的同時保護(hù)圖像有用細(xì)節(jié)。他們修改后的擴(kuò)散方程就是有名的P-M方程:
其中函數(shù)g是一個遞減函數(shù),保證隨圖像梯度模值增大函數(shù)值遞減,起到只在圖像平滑區(qū)域(小梯度點(diǎn))猛烈擴(kuò)散的作用。同時,這個方程還可以變形為在圖像局部沿邊緣方向和跨邊緣方向上的兩個一維擴(kuò)散之和,好的算法能保證在沿著邊緣方向擴(kuò)散地多,跨邊緣擴(kuò)散地少,也就是保證c_2" src="http://zhihu.com/equation?tex=c_1%3Ec_2" eeimg="1" >,起到在去噪的同時保護(hù)邊緣的作用。散度形式和方向?qū)?shù)形式的擴(kuò)散方程是隨后P-M方程改進(jìn)的兩個主要方向。
基于擴(kuò)散方程的去噪方法的優(yōu)點(diǎn)主要有:
缺點(diǎn)主要有:
?
代碼:
% 生成7×7整數(shù)型的矩陣 z = randi(7,7); [zx,zy] = gradient(z); div = divergence(zx,zy);[zx_x,zx_y] = gradient(zx); [zy_x,zy_y] = gradient(zy); % divergence(zx,zy) =zx_x + zy_y res = zx_x + zy_y - divergence(zx,zy); function [imx,imy,imnorm] = my_gradient(im) % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % 該函數(shù)用來求圖像的梯度 % % 輸入: % % im : 輸入圖像 % % 輸出: % % imx : 圖像x方向的梯度 % % imy : 圖像y方向的梯度 % % imxy : 圖像梯度的幅值 % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % imx = [im(:,end,:) - im(:, 1,:),-diff(im,1,2)]; imy = [im(end,:,:) - im(1, :,:);-diff(im,1,1)]; imnorm = sqrt(imx.^2 + imy.^2);end總結(jié)
以上是生活随笔為你收集整理的散度与梯度在图像中的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell日志切割
- 下一篇: CocoaPods打包静态库