如何检测图像中心点的最近方格?

时间:2015-10-26 15:29:36

标签: python python-2.7 opencv math

如何找到距离图像中心最近的方格?

我已经有了正方形的顶点和中心,只需找出哪个正方形最接近中心。

enter image description here

我遇到与此图像类似的问题。我想选择最近的方块(红色方块)。

2 个答案:

答案 0 :(得分:2)

这是我解决问题的方法。其中x0和y0可以是我图像中心的坐标,x1和y1将是方形中心坐标的中心。

import math
def dist(x0, y0, x1, y1):
    a = (x1 - x0)**2 + (y1 - y0)**2
    b = math.sqrt(a)
    return b
print dist(5, 5, 4, 6)
print dist(5, 5, 9, 2)

答案 1 :(得分:2)

两种可能性,其中一个在您的答案和comment by @miki

中提及
  1. 广场中心
  2. 您无需实施自己的距离功能。 SciPy已经有一些。例如,scipy.spatial.distance.euclidean中的欧几里德距离:

    from scipy.spatial import distance
    distance.euclidean((x0, y0), (x1, y1))
    

    无需重新发明轮子。

    1. 方边
    2. 在下面的例子中,可以说红色或蓝色方块是否更接近中心。通过欧几里德距离,它是蓝色的。但红色与中心重叠。

      enter image description here

      如果你想让距离中心的像素最近的正方形,你可以做类似

      的事情
      square = (upper_left_x, upper_left_y, lower_right_x, lower_right_y)
      center = (x, y)
      
      if upper_left_x <= x <= lower_right_x and upper_left_y <= y <= lower_right_y:
          return 0 # point in square
      elif upper_left_x <= x <= lower_right_x: # on vertical line
          return min(upper_left_y -y, lower_right_y - y)
      elif upper_left_y <= y <= lower_right_y: # on horizontal line
          return min(upper_left_x -x, lower_right_x - x)
      else:
          points = []
          for x in (upper_left_x, lower_right_x):
              for y in (upper_left_y, lower_right_y):
                  points.append((x,y))
          return min([distance.euclidean((x,y), p) for p in points])
      

      编辑前的原始答案

      您可以将其拆分:

      1. 导入图片
      2. 找到正方形
        1. 找到角落
        2. 连接他们
      3. 计算到图像中心的距离
      4. 这里的要点可能是其中任何一个(可能除了1.2)。

        有一个整洁的OpenCV Python tutorial,告诉你如何做到这一点。让我们开始吧:

        进口

        import cv2
        img = cv2.imread('L3h9H.png')
        

        导入图像。

        要查看您是否正确导入,可以使用

        from matplotlib import pyplot as plt
        plt.imshow(img, cmap = 'gray', interpolation = 'bicubic')
        plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
        plt.show()
        

        向您展示。

        find corners

        import numpy as np
        gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
        gray = np.float32(gray)
        dst = cv2.cornerHarris(gray, 2,3,0.04)
        for i, valx in enumerate(dst):
            for j, valy in enumerate(valx):
                if valy > 0:
                    print '%s, %s: %s' % (i, j, valy)
        

        使用其中一种内置算法查找角落。之后列出了角落。

        接下来的步骤是:

        • 计算角落之间的线(可能)。
        • 显示线到图像中心的最小距离。

        说你是否需要更多帮助。