【问题标题】:Extracting the outline of an image as a continuous path using opencv使用opencv将图像的轮廓提取为连续路径
【发布时间】:2021-10-18 13:41:10
【问题描述】:

背景

因此,我目前正在开展一个项目,该项目是编码火车傅立叶变换系列的扩展。非常感谢他启发了这个项目!

在观看了他关于编码火车徽标的傅立叶变换的视频后,我认为尝试为任何图像实现这一点会很有趣。我的目标是能够将任何图像中的主体轮廓作为 DFT 算法的连续路径输入,这样我就可以可视化所述路径的傅里叶变换。

编码火车视频链接:https://www.youtube.com/watch?v=MY4luNgGfms

我的进步

到目前为止,在 python 中使用 opencv,我已经实现了一种算法,可以从任何图像中检测主体的轮廓并显示出来。我附上了一个示例输出。

处理前 Image before processing

处理后 Image after processing

我的问题和预期结果

现在我已经完成了边缘,我希望能够将该边缘提取为由 (x,y) 坐标表示的连续路径。我需要它作为连续路径的原因是我要在这条路径上执行 DFT,如果它不连续,我的 DFT 可视化就会失败。

我不知道如何对点进行排序,以便它们不会从左到右或从上到下跳跃,而是从左到右遵循平滑的连续路径,反之亦然。

我是计算机视觉的初学者,我真的希望有人可以帮助我!如果我在某个地方搞砸了,或者我是否可以让我的代码变得更好,请随时告诉我。我真的很想学习。

代码

这是我目前的代码

img = cv2.imread("Images/selfietest.jpeg")


# convert image to gray scale
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
height, width = gray_img.shape

# white_padding = np.zeros((50, width, 3))
# white_padding[:, :] = [255, 255, 255]
# rgb_img = np.row_stack((white_padding, imgOut))

gray_img = 255 - gray_img
gray_img[gray_img > 100] = 255
gray_img[gray_img <= 100] = 0
# black_padding = np.zeros((50, width))
# gray_img = np.row_stack((black_padding, gray_img))

kernel = np.ones((30, 30), np.uint8)

# fill inside of image
filledImage = cv2.morphologyEx(gray_img, cv2.MORPH_CLOSE, kernel)
filledImageNormalized = np.uint8(filledImage)

#Canny edge detection
edges = cv2.Canny(filledImageNormalized, 100, 200)

title = ['edges']
images = [edges]


for i in range(1):
    plt.subplot(1, 1, i + 1), plt.imshow(images[i], 'gray')
    plt.title(title[i])
    plt.xticks([])
    plt.yticks([])
plt.show()```

【问题讨论】:

    标签: python opencv path dft canny-operator


    【解决方案1】:

    让我做一个假设:您只使用提供的图像。假设起点是最后一行的白色像素。那么方法是:

    • 从起点,按顺时针顺序看一个8邻域,从南邻域开始
    • 检查邻居是否是白人。
      • 如果是,保存,设置为新起点,重启进程
      • 如果不是,请查看下一个邻居
    • 继续直到你到达一个没有更多白色像素邻居的像素。

    话虽如此,也许您不仅仅使用此图像。在这种情况下,您必须调整查找起始像素的方式以匹配所有可能性。

    但是有了这个,你的大纲就会得到一个连续的路径。

    【讨论】:

    • 非常感谢您的建议!不过,我有一个澄清。如果我从左下角的白色像素开始顺时针移动,我不应该从北邻而不是南邻开始吗?由于我的这个项目的目标是为任何图像实现它,你如何看待将具有最低 x 和 y 值的像素(最西南的像素)作为每个图像的起始像素,之后我继续做我的顺时针循环以生成从西南向东移动的连续路径。
    • 每次从前一个像素跳转到当前像素时,您都可以从您移动的相同方向开始。这个解决方案可能是最容易实现的,也是最快执行的。您将在处理包含循环路径的图像时遇到一些麻烦。看看 Freeman 链码算法,它与您的问题很接近,但不能完全解决它:en.wikipedia.org/wiki/Chain_code。 (考虑喜欢我的回答;))
    • 我确实尝试过喜欢它哈哈哈,但它说我需要至少 15 声望才能这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    相关资源
    最近更新 更多