【问题标题】:OpenCV: Find similar object with contours matchingOpenCV:找到具有轮廓匹配的相似对象
【发布时间】:2020-06-21 18:48:04
【问题描述】:

我有一堆不同的鸟类图像,但其中一些包含羽毛、略微可见的鸟类等。我需要找到鸟类清晰可见的图像并删除带有羽毛、远距离鸟类等的图像。

我已经尝试过 ORB,简单的模板匹配,Canny 边缘检测。而且我不能使用神经网络。

现在我尝试使用这样的算法:

  1. 二值化模板图像以获得形状

  2. 使用滑动窗口在另一个二值化图像上滑动窗口,并在每个窗口中使用模板计算 matchShape

  3. 找到最佳匹配

如你所见,这种方法给了我奇怪的结果

二进制模板

.

其他二值图像上的形状,例如:

我在这张图片的不同部分计算了matchShapes,得到了最好的结果~0.05我在这部分得到了:

这显然与原来的形状不相似。

滑动窗口代码:

import cv2

OFFSET = 5
SCALE_RATIO = [0.5, 1]

def get_scaled_list(img_path, template):
    matcher_list = []

    img = cv2.imread(img_path)
    #JUST BINARIZATION AND RESIZING
    img = preprocess(resize_image(img))

    height, width = img.shape

    # building size of scale window
    for scaler in SCALE_RATIO:
        x_point = 0
        y_point = 0

        x1_point = int(width * scaler)
        y1_point = x1_point

        if x1_point > height:
            y1_point = height

        while y1_point <= height:
            while x1_point <= width:
                img1 = img[y_point:y1_point, x_point:x1_point]

                #Comparing template and part of image
                diff = cv2.matchShapes(template, img1, cv2.CONTOURS_MATCH_I1, 0)

                data_tuple = (img_path, x_point, y_point, int(width * scaler), diff)
                matcher_list.append(data_tuple)

                x_point += OFFSET
                x1_point += OFFSET

            x_point = 0
            x1_point = int(width * scaler)

            y_point += OFFSET
            y1_point += OFFSET
    return matcher_list

我怎样才能执行正确的形状匹配,为什么这里执行最好的结果?

【问题讨论】:

标签: python opencv image-processing


【解决方案1】:

带有刚性模板的天真窗口滑动方法将非常糟糕。尤其是尺寸不同,无法正确重叠。


你想要实现的目标很困难,因为你只有边缘信息,而且边缘很复杂,被分成几个独立的弧线和交叉点。

当您有一条闭合曲线(例如查找“弹性轮廓匹配”)时,您可以找到许多解决方案,但不适用于您的情况。这将是“近似弹性图匹配”的情况。

其他可能的方法是通过特殊的距离函数,例如倒角距离或 Hausdorff 距离,但由于尺寸不匹配,您仍然可能会卡住。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-13
    • 2016-04-13
    • 2012-01-04
    • 2021-06-13
    • 2019-01-15
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多