【问题标题】:Line detection in sketches草图中的线检测
【发布时间】:2016-06-09 10:50:33
【问题描述】:

我正在寻找一种在手绘草图中找到笔触的方法。我的实际方法是从 OpenCV 应用自适应阈值和 findContours。这个问题是 findContours 给了我右手边和左手边,一个笔画的上轮廓和下轮廓。有没有办法从手绘笔画中导出一个轮廓表示?

提前致谢

已编辑:

这是我到目前为止所取得的代码和图像:

首先我将自适应阈值应用于初始图像:

Imgproc.GaussianBlur(image, image, new Size(5, 5), 3);
Mat thresholded = Mat.zeros(image.size(), CvType.CV_8U);

然后我在阈值图像上应用 findCountours,并在每个轮廓上应用 approxPolyDB。

Imgproc.findContours(thresholded, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0,0));

List<MatOfPoint> refinedContours = new ArrayList<MatOfPoint>();
for (int i = 0; i < contours.size(); i++) {
    MatOfPoint2f approx = new MatOfPoint2f();
    Imgproc.approxPolyDP(mop2mop2f(contours.get(i)), approx, 6, true);
}

然后,我在角度大于固定阈值的点处分割每个轮廓。作为最后一步,我删除了所有不超过给定阈值的轮廓。

In the picture you can see the thresholded image as the final contours

我的目标是避免出现平行轮廓,使草图中的一个笔画只有一个轮廓。

谢谢

【问题讨论】:

  • 您能发布您的代码和示例图片吗?

标签: algorithm opencv computer-vision


【解决方案1】:

轮廓查找器用于查找轮廓。仅当您对某个厚度的主体的轮廓感兴趣时,这才有意义。 你对线条感兴趣。如果您在粗线上应用轮廓查找器,您最终会得到 2 条线,而不是 1 条,这会为您提供更多数据来处理。

我建议您改用细化算法。使用合适的阈值对图像进行二值化,然后应用细化/骨架化算法。

如果需要,您可以在细化之前使用形态闭合来填补一些小空白。

使用修剪算法清理你的骨架。

阅读: http://homepages.inf.ed.ac.uk/rbf/HIPR2/thin.htm

【讨论】:

  • 感谢您的回答。我实现了某种细化,它就像一个魅力,但你知道如何检索细线的表示,就像 findCountours 对等高线所做的那样?
  • 如果您指的是 findContours 返回的点向量,只需使用线条像素作为坐标。如果你适当地细化你的线,它的粗细将为 1,所以它非常直截了当。当然,如果您是这个意思,那么有无数数学方法可以提取此类结构的特征。
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 2015-09-05
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 2020-09-05
  • 2021-12-02
相关资源
最近更新 更多