Подогнать сплайн на изображении - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь найти способ разместить сплайн на изображении. Я знаю, что в изображениях, которые нужно обработать, есть строка:

  • несколько горизонтально
  • слева направо
  • не непрерывно

Я не могу найти способ разместить там сплайн. Этого можно достичь с помощью 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()

Схема c Изображение ниже описывает, чего я достиг и каков ожидаемый результат (красный сплайн, нарисованный вручную).

Example image from COCO

Ответы [ 2 ]

1 голос
/ 09 апреля 2020

Оказывается, что подгонка сплайна невозможна в OpenCV, но я нашел обходной путь с помощью @triiiiista. Для дальнейшего использования (для простоты используется верхняя часть исходного изображения):

import numpy as np
import cv2
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt

frame = cv2.imread("./download.png")
blur = cv2.blur(frame,(5,5))
edged = cv2.Canny(blur, 50, 200)

# remove vertical parts
kernel_remove_vertical = cv2.getStructuringElement(cv2.MORPH_RECT, ksize=(3, 1))# remove vertical parts
edged_hor = cv2.erode(edged, kernel_remove_vertical)
cv2.imshow('edge', edged)
cv2.imshow('edge_hor', edged_hor)
cv2.waitKey(1)

# Find coordinates for white pixels
# Hope that there aren't too many outliers :)
pixels = np.argwhere(edged_hor == 255)
x = (pixels[:, 1])
y = (pixels[:, 0])

# Interpolate with scipy
f = interp1d(x, y, kind='cubic')
xnew = np.linspace(10, 630)

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

В результате: enter image description here

1 голос
/ 08 апреля 2020

Вы можете попробовать морфологические операции, такие как разрушение и расширение OpenCV. Уменьшите вертикальные края и откормите горизонтальные края, используя различные формы ядра. Сделайте это несколько раз, после чего вы соедините горизонтальные края. Наконец-то истончите толстые горизонтальные края.

Некоторые примеры использования эрозии и расширения можно найти по адресу: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_imgproc/py_morphological_ops/py_morphological_ops.html.

...