波峰波谷的判断

给定一个数组h, 从左往右扫描。 

用S记录当前的状态(未知0, 下坡1,上坡2) 

当S=0, 如果 h[i] >  h[i+1]  修改状态为 下坡1, 否则为上坡 2 

当S=1, 如果 h[i]  <  h[i+1], 则判断为由下坡变为上坡, 此处为一个波谷。 如果该波谷比上一个rangesize范围内的波谷更低,则修改上一个波谷的值。 否则就将该波谷加入波谷列表。 

当S=2, 如果 h[i]  > h[i+1], 则判断为由上坡变为下坡, 此处为一个波峰。 如果该波峰比上一个rangesize范围内的波峰更高,则修改上一个波谷的值。 否则就将该波峰加入波峰列表。 

最后返回波峰和波谷列表。 

 

 

import numpy as np

def get_peaks_troughs(h,rangesize):
    peaks = list()
    troughs = list()
    S = 0
    for x in range(1,len(h)-1):
        if S == 0:
            if h[x] > h[x+1]:
                S = 1 ## down
            else:
                S = 2 ## up
        elif S == 1:
            if h[x] < h[x+1]:
                S = 2
                ## from down to up
                if len(troughs):
                    ## check if need merge
                    (prev_x,prev_trough) =  troughs[-1]
                    if x - prev_x < rangesize:
                        if prev_trough > h[x]:
                            troughs[-1] = (x,h[x])
                    else:
                        troughs.append((x,h[x])) 
                else:
                    troughs.append((x,h[x]))                           
 
          
        elif S == 2:
            if h[x] > h[x+1]:
                S = 1
                ## from up to down
                if len(peaks):
                    prev_x,prev_peak =  peaks[-1]
                    if x - prev_x < rangesize:
                        if prev_peak < h[x]:
                            peaks[-1] = (x,h[x])
                    else:
                        peaks.append((x,h[x]))
                else:
                    peaks.append((x,h[x]))
                
    return peaks,troughs
                
        
if __name__ == "__main__":
    import cv2 as cv
    import numpy as np
    from matplotlib import pyplot as plt


    img = cv.imread("peak.png",0)
    img =  255 - img

    Y,X = img.shape
    print Y,X

    h = np.zeros((X,1))
    for i in range(X):
        for j in range(Y):
            if img[j,i] > 0:
                h[i] = Y - j  

    peaks,troughs = get_peaks_troughs(h,10)

    plt.subplot(1,2,1)
    plt.imshow(img)
    plt.subplot(1,2,2)
    plt.plot(np.arange(len(h)),h)
    for x,y in peaks:
        plt.text(x,y,y,fontsize=10,verticalalignment="bottom",horizontalalignment="center")
    for x,y in troughs:
        plt.text(x,y,y,fontsize=10,verticalalignment="top",horizontalalignment="center")

    plt.show()
 

peaks,troughs = get_peaks_troughs(h,50)  ##  跨度修改成50后

跨度为50

 

  • 19
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值