影象分析:投影曲線的波峰查詢 -
☆ronny丶
時間2014-03-21 20:57:17 ronny
技術成長之路
原文主題 向量
一、前言
在影象分析裡,投影曲線是我們經常要用到的乙個影象特徵,通過投影曲線我們可以看到在某乙個方向上,影象灰度變化的規律,這在影象分割,文字提取方面應用比較廣。乙個投影曲線,它的關鍵資訊就在於波峰與波谷,所以我們面臨的第乙個問題就是找到波峰與波谷。
第一次涉及到求波峰與波谷時,很多人都不以為意,覺得波谷波峰還不容易,無非是一些曲線變化為零的點,從離散的角度來說,也就是:
波峰:$f(x)>f(x-1)
且 f(x)>f(x+1)$
波谷:$f(x)且
f(x)
這麼簡單嗎?顯示不是,你首先就會遇到這樣的曲線圖,然後圖上的波峰點並不滿足上面的條件。
看到這種情況,你也許會考慮在上面的等式中把$>$
和$<$
改為$\ge$
和$\le$。
波峰:$f(x)\ge f(x-1) \&\& f(x) > f(x+1)$
或者 $f(x)> f(x-1) \&\& f(x) \ge f(x+1)$
波谷:$f(x)\le f(x-1) \&\& f(x) < f(x+1)$
或者 $f(x)< f(x-1) \&\& f(x) \le f(x+1)$
這次是否就這樣簡單,答案顯示不是,下面的這個圖就會讓你對一些非峰值點作出錯誤的判斷。
上面這幅圖真正的峰值只有乙個,其他平台上的點,你如果按上面修改的公式,就會被錯誤的當成波峰點。
下面讓我們看一下,到底如何能求得準確的曲線波峰與波谷。
二、波峰波谷演算法
投影曲線實際上是乙個一維的向量:
$$v=[v_1,v_2,\dots,v_n]$$
其中$v_i,i \in [1,2,\dots,n]$
,代表影象在第
$i$行或列上的灰度累積。當然不僅僅是投影曲線,
$t$也可以是某一事件中變數的觀測值,我們需要研究這個變數的變化規律。
下面給出波峰與波谷的演算法:
1,假投影曲線可以表示為
$v=[v_1,v_2,\dots,v_n]$。
2,計算
v的一階差分向量
$diff_v$:
$$diff_v(i)=v(i+1)-v(i),其中
i\in $$
3,對差分向量進行取符號函式運算,
$trend=sign(diff_v)$,
即遍歷$diff_v$
,若$diff_v(i)$大於0
,則取1
;如果小於
0,則取
-1,否則則值為0。
$$ sign(x)=\left\
1& if\ \ x>0 \\
0& if\ \ x=0 \\
-1& if\ \ x<0 \\
\end
\right.
4,從尾部遍歷
$trend$向量,
進行如下操作:
if\ trend(i)=0且
trend(i+1)\ge0
,則trend(i)=1 \\
if\ trend(i)=0且
trend(i+1)<0
,則trend(i)=-1
5,對$trend$
向量進行一階差分運算,如同步驟
2,得到
$r=diff(trend)$。
6,遍歷得到的差分向量
$r$,如果
$r(i)=-2$
,則$i+1$
為投影向量
$v$的乙個峰值位,對應的峰值為
$v(i+1)$
;如果$r(i)=2$
,則$i+1$
為投影向量
$v$的乙個波谷位,對應的波谷為
$v(i+1)$。
下面我們來結合乙個實際的向量值,給中中間結合的計算。
1,$v=[-5,10,10,14,14,8,8,6,6,-3,2,2,2,2,-3]$。
它的曲線影象如下把示,圖中紅色圈標出了曲線的峰值,而綠字圈標出了影象的波谷位置。
2,計算
$v$的一階差分,我們得到
$diff(v)=[15,0,4,0,,-6,0,-2,0,-9,5,0,0,0,-5]$。
3,對$diff_v$
進行取符號運算,得到向量
$trend=[1,0,1,0,-1,0,-1,0,-1,1,0,0,0,1]$。
4,對$trend$
作一次遍歷,如步驟4。
$trend=[1,1,1,-1,-1,-1,-1,-1,-1,1,-1,-1,-1]$。
5,對$trend$
做一階差分,得到向量
$r=diff(trend)=[0,0,-2,,0,0,0,0,0,2,-2,0,0,0]$。
6,遍歷向量
$r$,
我們就得到了兩個峰值點和乙個波谷點。
三、演算法原理
其實上述演算法的核心思路非常簡單,曲線的峰值點,滿足一階導數為0
,並且滿足二階導數為負;而波谷點,則滿足一階導數為
0,二階導數為正。
在上面的演算法裡面,我們首先計算了一階的導數$diff_v$
,然後我們將其符號化,是因為我們並不關心一階導數的大小。
然後我們去看那些一階層數為0
的地方,我們發現,那些平台上的點,有些並不是波峰與波谷,然後很多處在上坡與下坡的路上,所以我們將它們的一階導數設為與它們所在的坡面梯度方向相同。
最後我們再來計算二階導數時,就會發現只要為2
或者-2,
所以曲線斜在這個點發生了變化,由正變負或由負變正。找到這些點,也就找到了原曲線中的波峰或波谷點。
四、實現
下面給出這個演算法的c++
實現,findpeaks
是查詢波峰函式,而查詢波谷函式則類似,這裡沒有寫在乙個函式內。函式接受乙個
vecotr
的向量,輸出為乙個
vector
的位置向量。
1 void findpeak(const vector& v, vector& peakpositions)
2 14 // 對
trend
作了乙個遍歷
15 for (int i = diff_v.size() - 1; i >= 0; i--)
16
21 else if (diff_v[i] == 0)
22
28 }
29 30 for (vector::size_type i = 0; i != diff_v.size() - 1; i++)
31
35 }
box shadow實現曲線投影效果
一般的投影效果,尤其通過css實現的投影效果 無論是css3,還是ie濾鏡 都是直來直往的。紙張是有卷角的,其投影就是曲面的,如何使用css模擬出紙張的卷邊曲線投影效果就是本篇的內容了。首先,曲線投影的終效果其實是多投影重疊的效果 一點點傾斜的投影重疊乙個直直的投影。一般的直來直往的投影顯然是使用b...
Hibernate的投影查詢
當查詢的記錄不是所有字段,而是指定的字段。如果需要使用乙個實體類接收。那麼需要乙個有引數的構造方法。我們將這種,有構造方法引數的查詢,稱為投影查詢。session.createquery select new customer c.custname,c.custsource from custome...
hibernate 投影查詢
1.投影查詢就是想查詢某一字段的值或者某幾個欄位的值 2.投影查詢的案例 如果查詢多個字段,例如下面這種方式 listlist session.createquery select c.cust name,c.cust level from customer c list for object ob...