【问题标题】:Compare image edges with margin in OpenCV在 OpenCV 中比较图像边缘和边距
【发布时间】:2014-11-18 13:39:28
【问题描述】:

我有两张几乎相似的图片,不同之处在于第二张图片中的形状略有不同。大多数时候更小,但可以更大。此外,一张图像中的形状计数范围可以从 ~10 到 >100,并且可以彼此相对接近。 它看起来像这样(注意:两个图像都不是透明的):

黑色三角形是图像 1,灰色三角形是图像 2。

现在我想在图像 1 的边缘添加一个预定义的边距(此处为 3px - 到轮廓的两侧),并测试第二张图像的边缘是否与第一张图像在“相同”范围内。如果没有,请直观地显示:

左上角:两张图片之间的细微差别(用红色轮廓表示)

右下:“相同”的边缘 -> 没有区别

我怎样才能最好地做到这一点?

我在 C++ 中使用 OpenCV

【问题讨论】:

  • 通过交叉比较决定绘制红色轮廓或不应用每个轮廓的区域。先找到每个的外轮廓和​​内轮廓,然后计算面积,然后比较决定,需要FindContours()和contourArea()

标签: c++ opencv matching contour edge-detection


【解决方案1】:

如果两个图像中的形状位于相同的位置,而您只需要图像上的标记而不需要其他信息,这个简单的技巧就可以做到。

#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
    Mat img1 = imread("D:/1.png");
    Mat img2 = imread("D:/2.png");
    Mat diff;
    absdiff(img1, img2, diff);
    cv::threshold(diff, diff, 128, 255, THRESH_BINARY);
    Mat markers;
    int minRadiusDiff = 2;
    erode(diff, markers, Mat(), cv::Point(-1, -1), minRadiusDiff / 2);
    imwrite("D:/out.png", markers);
}

以下是一些示例图片:

三角形变得更大,摇晃的东西变得更小,四边形略微缩小。

所以我们希望标记三角形和摆动,而不是四边形。

这正是我们的结果。

【讨论】:

  • 我明天要测试它,但它看起来很有希望,谢谢 :)
  • 如果没有,请随意发布一些您的实际图片,我会看看我能做些什么。
  • 是否可以使用 float 而不是 int(使其更准确)?
  • 因为这是腐蚀的迭代次数,所以没有。使用这种方法,您将不得不放大图像。例如,当您想要 3.4 时,您必须按比例放大 5,然后使用 17。
猜你喜欢
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多