Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing OpenCV:用于在x轴上查找峰值位置的优化方法_Image Processing_Opencv_Opencvdotnet - Fatal编程技术网

Image processing OpenCV:用于在x轴上查找峰值位置的优化方法

Image processing OpenCV:用于在x轴上查找峰值位置的优化方法,image-processing,opencv,opencvdotnet,Image Processing,Opencv,Opencvdotnet,要检测下图中峰值(x轴上)的位置 如果图像是垂直的,我会应用CvMinMax来定位峰值。但由于这里是水平的,我面临着困难。有没有一种方法可以使用CvMinMax来定位此峰值?(我不想旋转图像) 作为最后一个选择,我必须搜索每一列,我不想这样做,因为这将是非常昂贵的。有没有优化的方法来搜索这些峰值 这里有一个快速方法: 使用cv.Reduce一次获取所有列的总和。这给了我们一个列和向量 设置此向量的阈值,使其有效地为二进制 在垂直轴上翻转图像 使用cv.MinMaxLoc,它报告从左侧找到的第一

要检测下图中峰值(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(比我上一篇文章快十倍)。

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

    为什么不在C/C++中执行此操作?是不是Python会更快?(我在python上没有任何工作经验)@gpuguy-如果你愿意,你可以将它转换成C,(我不知道C)。代码非常简单,主操作
    cv.Sum(cv.GetCol(im,x))
    是opencv的固有操作(C中也是如此),因此这和C之间的速度差异可能很小:)翻转是否涉及任何形式的舍入?就像旋转图像时发生舍入一样?如果是,那么我可能得不到正确的结果。你能核实一下我的理解吗。只需在回答中更新此内容。@gpuguy-翻转会生成一维向量的镜像,并且没有舍入。明天有时间的时候我会补充更多的解释。可能导致错误答案的主要原因是图像中的噪声(这张图像中有一些噪声,所以我将阈值设置为200)。