我目前正在开发一个需要两个图像中的对象形状进行比较的项目。
我必须检查形状是否超过某个阈值。
我已经拥有ROI(感兴趣区域),其中对象可以出现在图像中。我只需要比较ROI中的形状。
ROI中可能存在许多物体(物体位置可能不同),我必须通过比较形状来检查它们是否也存在于第二张图像上的大致相同的点上。简而言之,我需要检查两个图像中存在的形状之间的相似性。
任何人都可以帮助我理解和使用形状描述符(HOG,SIFT,SURF,......)吗?我们如何比较两个图像的HOG特征向量?或者是否有更好的方法来比较两个图像中是否有相似的形状?检测和比较形状是目标。
答案 0 :(得分:1)
检测和比较两个图像之间的形状可以分为两部分。
检测形状
比较形状
使用可用的OpenCV库可以轻松解决检测形状问题。 (https://docs.opencv.org/trunk/d4/dc6/tutorial_py_template_matching.html)
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('messi5.jpg',0)
img2 = img.copy()
template = cv2.imread('template.jpg',0)
w, h = template.shape[::-1]
# All the 6 methods for comparison in a list
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
for meth in methods:
img = img2.copy()
method = eval(meth)
# Apply template Matching
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img,top_left, bottom_right, 255, 2)
plt.subplot(121),plt.imshow(res,cmap = 'gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img,cmap = 'gray')
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.suptitle(meth)
plt.show()
匹配模板还可以给出匹配和比例的分数,可以用来比较形状。
唯一的警告是分数不是相对的,取决于图像大小和使用的匹配算法。这需要根据需要进行调整。