在图像上显示样条线

问题描述 投票:0回答:2

我正在尝试找到一种方法来在图像上拟合样条曲线。我知道要处理的图像中有一行:

  • 有点水平
  • 从左到右边缘
  • 不连续

我找不到在那里适合花键的方法。这可以通过NI LabView来实现,因此很难相信OpenCV也没有办法。

这是我所走的距离:

import cv2
frame = cv2.imread("./download.png")
edged = cv2.Canny(frame, 50, 200)
cv2.imshow('frame', frame)
cv2.imshow('edge', edged)
cv2.waitKey()

下面的示意图描述了我已经完成的工作以及预期的输出(红色手动绘制的样条曲线)。

Example image from COCO

python opencv spline
2个回答
1
投票

您可以尝试形态学操作,例如OpenCV的腐蚀和扩张。通过使用不同的内核形状,修整垂直边缘并加宽水平边缘。重复几次,然后连接水平边缘。最后使那条肥腻的水平边缘变薄。

有关如何使用腐蚀和扩张的一些示例,请参见:https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html


0
投票

事实证明,OpenCV无法拟合样条曲线,但我在@triiiiista的帮助下找到了解决方法。以供将来参考(为简单起见,使用原始图像的上部):

frame = cv2.imread("./download.png")
blur = cv2.blur(frame,(5,5))
edged = cv2.Canny(blur, 50, 200)
kernel_remove_vertical = cv2.getStructuringElement(cv2.MORPH_RECT, ksize=(3, 1))
edged_hor = cv2.erode(edged, kernel_remove_vertical)
cv2.imshow('edge', edged)
cv2.imshow('edge_hor', edged_hor)
cv2.waitKey(1)

pixels = np.argwhere(edged_hor == 255)
x = (pixels[:, 1])
y = (pixels[:, 0])
f2 = interp1d(x, y, kind='cubic')
xnew = np.linspace(10, 630)

plt.figure()
plt.imshow(cv2.cvtColor(edged_hor, cv2.COLOR_BGR2RGB))
plt.plot(xnew, f2(xnew))

这导致:enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.