在直方图(1D数组)中查找最小区域设置(Python)

时间:2017-09-19 12:33:30

标签: python histogram minimum

我处理了雷达图像并检测水,我必须在直方图中找到局部最小值。每个区域的直方图略有不同,因此我必须根据每个直方图自动找到局部最小值。

Histogram for Sigma0_VV

我的输入数组是一维图像值数组(0.82154,0.012211,...)。我知道如何在numpy和matplotlib中创建直方图,但我不知道如何确定图片中显示的locale minimum。我使用python scipy库。

第一步应该是平滑直方图以便更容易地确定最小值,你能告诉我使用什么来平滑数据吗?像这样:

Smoothed/Unsmoothed

1 个答案:

答案 0 :(得分:0)

您可以使用numpy.convolve() numpy平滑数据,也可以使用以下功能:

import numpy

def smooth(x,window_len=11,window='hanning'):
    if x.ndim != 1:
        raise ValueError, "smooth only accepts 1 dimension arrays."

    if x.size < window_len:
        raise ValueError, "Input vector needs to be bigger than window size."


    if window_len<3:
        return x


    if not window in ['flat', 'hanning', 'hamming', 'bartlett', 'blackman']:
        raise ValueError, "Window is on of 'flat', 'hanning', 'hamming', 'bartlett', 'blackman'"


    s=numpy.r_[x[window_len-1:0:-1],x,x[-2:-window_len-1:-1]]
    #print(len(s))
    if window == 'flat': #moving average
        w=numpy.ones(window_len,'d')
    else:
        w=eval('numpy.'+window+'(window_len)')

    y=numpy.convolve(w/w.sum(),s,mode='valid')
    return y

另请参阅scipy文档:

如果您要查找的1d数组中的所有条目a小于其邻居,您可以尝试

numpy.r_[True, a[1:] < a[:-1]] & numpy.r_[a[:-1] < a[1:], True]

在SciPy&gt; = 0.11中,您可以使用以下内容:

import numpy as np
from scipy.signal import argrelextrema

x = np.random.random(12)

# for local minima
argrelextrema(x, np.less)