Python 图像处理:求助于 PIL 或任何相关模块进行角点检测。

8

我对图像处理还不熟悉,需要对这张图片进行角点检测: enter image description here

在这张图片中,我需要提取每个线段的起点和终点或角点坐标。这只是我的项目中的一小部分,由于我没有图像处理的经验,所以卡住了。

5个回答

28

这是一个使用scikit-image的解决方案:

from skimage import io, color, morphology
from scipy.signal import convolve2d
import numpy as np
import matplotlib.pyplot as plt

img = color.rgb2gray(io.imread('6EnOn.png'))

# Reduce all lines to one pixel thickness
snakes = morphology.skeletonize(img < 1)

# Find pixels with only one neighbor
corners = convolve2d(snakes, [[1, 1, 1],
                              [1, 0, 1],
                              [1, 1, 1]], mode='same') == 1
corners = corners & snakes

# Those are the start and end positions of the segments
y, x = np.where(corners)

plt.imshow(img, cmap=plt.cm.gray, interpolation='nearest')
plt.scatter(x, y)
plt.axis('off')
plt.show()

线段的端点


很棒 - 在这里使用了卷积的精彩技巧 - 如果我自己做的话,可能会用8个不同的“np.rolls”,因此阅读你的答案让我变得更好! ;) - pelson
很高兴你觉得有帮助! - Stefan van der Walt

2

被接受的答案未能找到图像中的所有角落。

使用Harris角点检测,可以找到所有可能的角落。由于OP的模块选择没有受限制,所以我选择使用OpenCV库执行以下操作。

结果:

enter image description here

识别出图像中的每个角落。

此页面提供了算法和代码的详细信息。


2
我建议使用OpenCV,它带有Harris角点检测器和Shi-Tomasi角点检测器。

1

我不确定我是否正确理解了问题,但我认为一种低效的方法是扫描每个像素并检查该像素周围的4个方向。如果有2个非相对方向(即上和左或上和右等)被着色,则它是一个角落。

希望这可以帮到你。


1
如果线条只有1像素的厚度,那么这个方法是可行的。但这种情况很少发生,而且示例图像也不例外(放大查看)。有效的算法要复杂得多(链接)。 - Max Li

0
这有点靠运气,但我认为你可以解析png头来检索图像的宽度/高度(参考此RFC以获取png详细信息)。将其与图像的位深度结合起来,您应该能够使用简单的数学确定每个角落的位置。一旦找到角落,您应该能够使用简单的算法检查相邻像素数据来跟随线条。
这也听起来像是作业。如果是这样,你应该标记它。

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