Python图像处理:最好是PIL或任何相关模块中的角点检测所需的帮助
我是图像处理新手,需要对该图像进行角点检测:Python图像处理:最好是PIL或任何相关模块中的角点检测所需的帮助,python,image-processing,python-imaging-library,Python,Image Processing,Python Imaging Library,我是图像处理新手,需要对该图像进行角点检测: 在这张图中,我需要提取每条线段的起点和终点或角点的坐标。这只是我项目中的一小部分,我被困在这一点上,因为我在图像处理方面没有经验 我不知道我是否正确理解了这个问题,但我认为一种低效率的方法是扫描每个像素并检查该像素周围的4个方向。如果两个非相反方向(即向上和向左或向上和向右等)是彩色的,则它是一个角 希望这能有所帮助。这有点像是在暗中拍摄,但我假设您可以解析png标题以检索图像的宽度/高度(请看)。结合图像的位深度,您应该能够通过简单的数学计算确定
在这张图中,我需要提取每条线段的起点和终点或角点的坐标。这只是我项目中的一小部分,我被困在这一点上,因为我在图像处理方面没有经验 我不知道我是否正确理解了这个问题,但我认为一种低效率的方法是扫描每个像素并检查该像素周围的4个方向。如果两个非相反方向(即向上和向左或向上和向右等)是彩色的,则它是一个角
希望这能有所帮助。这有点像是在暗中拍摄,但我假设您可以解析png标题以检索图像的宽度/高度(请看)。结合图像的位深度,您应该能够通过简单的数学计算确定每个角的位置。一旦找到角点,您应该能够使用简单的算法检查相邻像素数据来跟踪该线 这听起来也像是家庭作业。如果是这样,您应该将其标记为这样。我建议使用Harris角点检测器和Shi-Tomasi角点检测器附带的。这里有一个解决方案,使用:
从skimage导入io、颜色、形态
从scipy.signal导入卷积2D
将numpy作为np导入
将matplotlib.pyplot作为plt导入
img=color.rgb2gray(io.imread('6EnOn.png'))
#将所有线减少到一个像素厚度
蛇=形态。骨骼化(img<1)
#查找只有一个邻居的像素
角点=卷积2D(蛇,[[1,1,1],
[1, 0, 1],
[1,1,1]],mode='same')==1
角=角和蛇
#这些是线段的起点和终点位置
y、 x=np.其中(角)
plt.imshow(img,cmap=plt.cm.gray,插值=‘最近’)
plt.散射(x,y)
打印轴(“关闭”)
plt.show()
接受的答案无法找到图像中的所有角落 使用Harris角点检测,可以找到所有可能的角点。由于OP对模块的选择没有限制,我选择使用OpenCV库执行以下操作 结果: 图像中的每个角都被正确识别
提供算法和代码的详细信息。如果线条的厚度为1像素,则此操作将有效。这种情况很少发生,示例图像也不例外(放大)。工作算法要复杂得多()。很好-这里很好地使用了卷积-我最终会使用8个不同的
np.rolls
,所以我读了你的答案就更好了!;)很高兴你发现它很有用!
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()