投影曲線的波峰查詢

2021-07-05 02:45:56 字數 3444 閱讀 4880

影象分析:投影曲線的波峰查詢 - 

☆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...