用图片的中风检测算法,用于检测直线和曲线。

3
我正在寻找一种算法,可以检测图片中包括曲线在内的所有线条,以便我可以使用绘图程序(如paint)在我的软件中重新绘制它。目前,我只想将其重新绘制为黑白色。我的方法是制作图片的模板,尝试读取所有黑色像素作为线条,并最终绘制它。线条计算大致如下:
 * 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

我的方法可以工作,但效果不太好。有些大纲会被检测为两行。

My approach

你对我的算法有改进意见吗?或者有更好的算法吗?


我认为你要做的是将图像二值化,并找到轮廓或边缘。 - Bilal
1
你的问题需要更加明确... 你实际上想要做什么?你展示的三张图片是什么?你熟悉哪种编程语言和操作系统? - Mark Setchell
左边的图片是输入,中间的图片是左边图片的模板,最后一个是我的程序的输出。我正在使用Java AWT的Robot类在Microsoft Paint中绘制图像。 - Aura Lee
好的,首先看中间(模板)的那个,你是怎么做的,为什么不用它?然后,同样的问题再问右边的那个。 - Mark Setchell
使用3x3的滤镜(就像卷积滤镜一样),并使用所有9个颜色之间的标准差作为亮度值。虽然我可以用特定的亮度绘制所有点,但这会使图片看起来过于像素化,而且看起来不像机器人正在画线。 - Aura Lee
显示剩余3条评论
1个回答

3
尝试使用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()

注意:要自动确定下限和上限阈值,请查看使用Python和OpenCV进行零参数自动Canny边缘检测


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接