【问题标题】:Stroke detection algorithm in pictures to detect lines and curves图片中的笔画检测算法检测直线和曲线
【发布时间】:2020-04-23 11:04:00
【问题描述】:

我正在寻找一种算法来检测图片中的所有线条,包括曲线等,这样我就可以使用我的软件在绘画程序中重新绘制它。现在我只想把它重新粉刷成黑白。我的方法是制作图片的模板并尝试将所有黑色像素读取为线条并最终绘制它。线计算是这样的:

 * for every pixel
 *      Point p = (x, y)
 *      List<Point> line
 *      while p is not marked
 *          mark p
 *          p = adjacent darkest pixel //brightness of a pixel is calculated by pixel luminance divided by 2 + luminance of the 8 adjacent pixels divided by 16
 *          add p to line
 *      end while
 *      draw line
 * end for

我的方法有效,但效果不是很好。一些轮廓被检测为两条线。

你对我的算法有什么改进,或者更好的吗?

【问题讨论】:

  • 在我看来,我认为您要寻找的是二值化图像,并找到轮廓或边缘。
  • 您的问题可能需要更多的关注……您实际上想做什么?您展示的 3 张图片是什么?您熟悉什么语言和操作系统?
  • 左图是输入,中图是左图的模板,最后是我程序的输出。我正在使用 Java AWT 的 Robot 类在 Microsoft Paint 中绘制图像。
  • 好的,首先看中间(模板)的,你是怎么做的,为什么不使用它?然后,对正确的问题再次提出相同的问题。
  • 使用 3x3 过滤器(如卷积过滤器)并使用所有 9 种颜色之间的标准差作为亮度值。我可以只绘制具有特定亮度的所有点,但这会使图片看起来过于像素化,并且看起来不像机器人在画线。

标签: image algorithm image-processing computer-vision detection


【解决方案1】:

试试 Canny 边缘检测,这是一种流行的边缘检测算法。它已经在 OpenCV 中实现为cv2.Canny()。使用截图输入图像,结果如下:

输入图像

结果(反转和非反转版本)

这是 Python OpenCV 中的一个实现

import cv2

# Load image, convert to grayscale, and perform Canny edge detection
image = cv2.imread('1.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
canny = 255 - cv2.Canny(gray, 120, 255, 1)

# Show image
cv2.imshow('canny', canny)
cv2.waitKey()

注意:要自动确定下限和上限,请查看Zero-parameter, automatic Canny edge detection with Python and OpenCV

【讨论】:

    猜你喜欢
    • 2013-09-17
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-16
    • 1970-01-01
    • 2021-12-26
    • 2019-12-02
    相关资源
    最近更新 更多