OpenCV:在x轴上寻找峰位置的优化方法

时间:2012-05-28 06:42:58

标签: image-processing opencv opencvdotnet

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

enter image description here

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

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

2 个答案:

答案 0 :(得分:0)

这是一种快速方法:

  1. 使用cv.Reduce一次获取所有列的总和。这为我们提供了列和的向量。
  2. 阈值此向量,因此它实际上是二进制的。
  3. 在垂直轴上翻转图像。
  4. 使用cv.MinMaxLoc,它会报告从左侧找到的第一个最小值和第一个最大值的位置(因为图像是二进制值,它为我们提供了第一个非零值)。
  5. 计算列位置。
  6. 这里是在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(比我上一篇文章快十倍)。

答案 1 :(得分:0)

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