-1

要检测下图中峰值的位置(在 x 轴上)

在此处输入图像描述

如果图像是垂直的,我会应用 CvMinMax 来定位峰值。但由于这里是水平的,我面临着困难。有没有办法可以使用 CvMinMax 来定位这个峰值?(我不想旋转图像)

作为最后一个选项,我必须搜索每一列,我不想这样做,因为这将非常昂贵。有没有优化的方法来搜索这些峰值?

4

2 回答 2

0

这是一个快速的方法:

  1. 使用 . 一次获取所有列的总和cv.Reduce。这给了我们一个列和的向量。
  2. 阈值这个向量,所以它实际上是二进制的。
  3. 在垂直轴上翻转图像。
  4. 使用cv.MinMaxLoc,它报告从左侧找到的第一个最小值和第一个最大值的位置(由于图像是二进制的,它为我们提供了第一个非零值)。
  5. 计算列位置。

这里它是用python实现的,应该很容易转换成C,因为它们都是内置的opencv函数。

def find_left_max4(im):
    sums = cv.CreateImage((im.width, 1), cv.IPL_DEPTH_32F, 1)
    cv.Reduce(im, sums, dim=0, op=cv.CV_REDUCE_SUM)
    cv.Threshold(sums, sums,200, 255, cv.CV_THRESH_BINARY)
    cv.Flip(sums, flipMode=1)
    return sums.width - cv.MinMaxLoc(sums)[3][0] - 1

im = cv.LoadImage('zfUHp.jpg',cv.CV_LOAD_IMAGE_GRAYSCALE)
print find_right_max4(im)
#Output:
324

我认为您无法在速度上击败这种方法。对于我的慢速计算机,它的时钟速度为 54 µs(比我之前的帖子快十倍)。

于 2012-05-28T07:35:05.827 回答
0

逐行访问图像的像素并使用简单的距离方法。我希望你也不需要代码。

于 2012-05-29T11:04:57.483 回答