【问题标题】:How to detect the nearest square to the image center points? [closed]如何检测离图像中心点最近的正方形? [关闭]
【发布时间】:2016-01-25 18:37:06
【问题描述】:

如何找到离图像中心最近的正方形?

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

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

【问题讨论】:

  • 让我们看看你的代码。到目前为止,您尝试过什么?
  • 如何取图像中心和矩形中心之间的最小(欧几里得)距离?
  • @Matheus208 目前我正在通过计算面积来考虑正方形的大小来做出选择,但我认为如果我有中心和正方形之间的距离将是最有效的。
  • @Miki 我会尝试并发布结果。

标签: python python-2.7 opencv math


【解决方案1】:

两种可能性,其中一种在您的回答和comment by @miki中提到

  1. 方形中心

您不需要实现自己的距离函数。 SciPy 已经有了一些。例如您在scipy.spatial.distance.euclidean 中的欧式距离:

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

无需重新发明轮子。

  1. 方形边

在下面的示例中,可以争论红色或蓝色方块是否更靠近中心。通过欧几里得距离,它是蓝色的。不过,红色的部分与中心重叠。

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

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. 计算到图像中心的距离

这里的重点可能是其中任何一个(可能除了 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)

使用其中一种内置算法查找角点。角在后面列出。

接下来的步骤是:

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

如果您需要更多帮助,请说。

【讨论】:

    【解决方案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)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多