两种可能性,其中一种在您的回答和comment by @miki中提到
- 方形中心
您不需要实现自己的距离函数。 SciPy 已经有了一些。例如您在scipy.spatial.distance.euclidean 中的欧式距离:
from scipy.spatial import distance
distance.euclidean((x0, y0), (x1, y1))
无需重新发明轮子。
- 方形边
在下面的示例中,可以争论红色或蓝色方块是否更靠近中心。通过欧几里得距离,它是蓝色的。不过,红色的部分与中心重叠。
如果你想让正方形的像素离中心最近,你可以这样做
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)。
有一个简洁的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()
向你展示它。
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)
使用其中一种内置算法查找角点。角在后面列出。
接下来的步骤是:
- 计算拐角之间的线(可能)。
- 显示线到图像中心的最小距离。
如果您需要更多帮助,请说。