要检测下图中峰值的位置(在 x 轴上)
如果图像是垂直的,我会应用 CvMinMax 来定位峰值。但由于这里是水平的,我面临着困难。有没有办法可以使用 CvMinMax 来定位这个峰值?(我不想旋转图像)
作为最后一个选项,我必须搜索每一列,我不想这样做,因为这将非常昂贵。有没有优化的方法来搜索这些峰值?
要检测下图中峰值的位置(在 x 轴上)
如果图像是垂直的,我会应用 CvMinMax 来定位峰值。但由于这里是水平的,我面临着困难。有没有办法可以使用 CvMinMax 来定位这个峰值?(我不想旋转图像)
作为最后一个选项,我必须搜索每一列,我不想这样做,因为这将非常昂贵。有没有优化的方法来搜索这些峰值?
这是一个快速的方法:
cv.Reduce
。这给了我们一个列和的向量。cv.MinMaxLoc
,它报告从左侧找到的第一个最小值和第一个最大值的位置(由于图像是二进制的,它为我们提供了第一个非零值)。这里它是用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(比我之前的帖子快十倍)。
逐行访问图像的像素并使用简单的距离方法。我希望你也不需要代码。