使用python计算图像中两点之间的距离

时间:2018-09-12 12:23:08

标签: python image-processing

这是一个图像,我需要找到狗的嘴巴及其尾巴,并且需要使用图像处理找到狗的尾巴与它的嘴巴之间的距离(注意:不应该考虑整个身体的最小距离或空间距离)。

enter image description here

import cv2
import numpy as np

filename = 'Dog-catches-own-tail_1.jpg'

img = cv2.imread(filename)

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)

dst = cv2.cornerHarris(gray,2,3,0.04)
dst = cv2.dilate(dst,None)

img[dst>0.01*dst.max()]=[0,0,255]
cv2.imwrite('Image.jpg',img)

运行代码段后,我可以在这里找到弯角:

enter image description here

1 个答案:

答案 0 :(得分:0)

我已通过以下方式实现了上面评论中讨论的内容;计算是在您提取的二维灰度矩阵上完成的。我为馈入聚类器的矩阵的目标值分配了零和一,在本例中为KMeans,尽管可以根据需要将其替换为其他模型。

import cv2
import numpy as np

filename = 'Dog.jpg'

img = cv2.imread(filename)

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)

dst = cv2.cornerHarris(gray,2,3,0.04)
dst = cv2.dilate(dst,None)

gray[dst>0.01*dst.max()] = 1
gray[dst<=0.01*dst.max()] = 0

from sklearn.cluster import KMeans
km = KMeans(n_clusters=2)
km.fit(gray)
centers = km.cluster_centers_

from sklearn.metrics.pairwise import cosine_distances
print(cosine_distances(centers))

输出为:

[[0.         0.60477114]
 [0.60477114 0.        ]]

是包含中心的成对余弦距离的矩阵。可以在对.cornerHarris()的调用上进行进一步的调整,实际上,应该检查提取的簇是否至少模糊地对应于狗的尾巴和嘴巴。 此外,可能无法在其他图像上推广此方法。目前还不清楚会发生什么情况,例如,如果狗咬它的尾巴:很可能以与尾巴,嘴巴或两者都不相关的方式识别出簇。对特定图像的代码进行的调整越多,则该模型推广的可能性就越低:因此,这只狗追逐着自己的尾巴。