查找信号峰值不正确

时间:2018-12-17 13:38:17

标签: python signal-processing

我有以下图像:

enter image description here

我正在使用希尔伯特变换获取包络,并且试图找到峰值。

使用以下代码,我得到以下错误的峰值检测。

基本上,我正在尝试根据信封和峰值对字母进行细分...但是我在机器上出现了错误的峰值。

enter image description here

def normalize(v):
    norm = np.linalg.norm(v)
    if norm == 0:
        return v
    return v / norm


'''
reduces the photo to a vector representing its pixel freuqeuncy at each column 
'''


def image_reduce(img):
    col_counts = cv2.reduce(img, 0, cv2.REDUCE_SUM, dtype=cv2.CV_32SC1)
    column = col_counts.flatten().tolist()
    # print("Column counts:\n\n", column)
    return column

def slice_digits(image_name):
    img = cv2.imread(image_name, 0)

    column_frequency = image_reduce(cv2.bitwise_not(img))
    column_frequency = normalize(column_frequency)

    env = np.abs(sigtool.hilbert(column_frequency))
    peaks, _ = find_peaks(env > 0.1, height= 0.51)
    plt.plot(env)
    plt.scatter(peaks, env[peaks],  s=50, c='r')

    all_slices = []
    for i in range(len(peaks) - 1):
        x0, x1 = peaks[i:i + 2]
        image_slice = img[:, x0:x1]

        print("coords:", x0, x1)
        # Now do something with the slice, e.g.
        all_slices.append(image_slice)
        plt.figure("Slice %d)" % i)
        plt.imshow(image_slice)

    plt.show()

if __name__ == '__main__':
    image = r"c:\ahmed\doc.png"
    res_image = slice_digits(image)

1 个答案:

答案 0 :(得分:1)

只需替换行:

peaks, _ = find_peaks(env > 0.1, height= 0.51)

作者

peaks, _ = find_peaks(env, height = 0.1, width = 4)

给予

enter image description here

我建议您花些时间阅读所用功能的文档。敌人的例子,在这里设置height = 0.51毫无意义,因为高度是:

  

所需的峰高。一个数字,无,匹配x的数组   或前者的2元素序列。第一个元素永远是   解释为最小值,如果提供,则解释为最大值   所需的高度。

但是,请记住,如果信号差异太大,则很难对找到峰的函数进行可靠的“校准”。例如,此处的参数width设置为4,但是我建议您使用所有参数来查看它们的作用。

最后,这总是一个品味问题。左侧的第一个图片是双图片。您怎么知道最大值实际上是您想要的?在信号中找到可靠的峰值非常困难。