检测和比较两个图像之间的形状

时间:2017-12-04 11:01:23

标签: python opencv computer-vision comparison shape

我目前正在开发一个需要两个图像中的对象形状进行比较的项目。

我必须检查形状是否超过某个阈值。

我已经拥有ROI(感兴趣区域),其中对象可以出现在图像中。我只需要比较ROI中的形状。

ROI中可能存在许多物体(物体位置可能不同),我必须通过比较形状来检查它们是否也存在于第二张图像上的大致相同的点上。简而言之,我需要检查两个图像中存在的形状之间的相似性。

  • 我尝试了轮廓,但它在查找所有轮廓方面效果不佳,并且随着不同的图像而变化。
  • 我现在正尝试使用直方图梯度(HOG)方法。我分别得到了两个图像的特征向量。但我不知道如何比较两个图像的HOG特征向量以找到形状相似性。
  • 深度学习和CNN只能在预先知道要检测的对象以及大量训练图像时使用。我的问题是对象可以是任何东西而我没有大量的训练集。所以,我决定使用HOG,SIFT,SURF等形状描述符......但我不知道如何有效地使用它们来获得所需的输出。
  • 我无法理解描述符中的输出(特征向量)。我不知道如何使用两个图像中的特征向量来比较两个图像中存在的形状。

任何人都可以帮助我理解和使用形状描述符(HOG,SIFT,SURF,......)吗?我们如何比较两个图像的HOG特征向量?或者是否有更好的方法来比较两个图像中是否有相似的形状?检测和比较形状是目标。

1 个答案:

答案 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()

比较形状

匹配模板还可以给出匹配和比例的分数,可以用来比较形状。

唯一的警告是分数不是相对的,取决于图像大小和使用的匹配算法。这需要根据需要进行调整。