Обнаружение ребер Python и расчет кривизны - PullRequest
9 голосов
/ 04 февраля 2012

Я знаю, что проблема обнаружения края была опубликована ранее (в Java: Подсчет количества объектов в изображении , не зависит от языка: Обнаружение края изображения ), но я хочузнаю, как реализовать это в python.

Я делаю определение края и вычисление кривизны вокруг края на некоторых простых формах (двоичная форма с некоторым шумом).Я знаю, что есть некоторые обертки для OpenCV, но не уверен, какой из них лучше: pyopencv, pycv, pycvf?

Поскольку я в основном только делаю эти две задачи, я также не уверен, будет ли этобыстрее реализовать его самостоятельно, чем использовать библиотеку.

Ответы [ 4 ]

12 голосов
/ 07 февраля 2012

У нас есть активно разработанные алгоритмы сегментации и обнаружения фронтов scikit-image, которые могут оказаться полезными:

Примеры изображений Scikit

5 голосов
/ 30 августа 2015

С помощью scipy в python вы можете легко обнаружить края.

from scipy import ndimage
edge_horizont = ndimage.sobel(greyscale, 0)
edge_vertical = ndimage.sobel(greyscale, 1)
magnitude = np.hypot(edge_horizont, edge_vertical)

А вот пример исходного изображения и изображения после обнаружения края. enter image description here

В scikit-image есть специальная страница с пояснениями о том, как сделать обнаружение краев.

3 голосов
/ 21 июля 2013

Существует очень простой способ найти контуры в python с помощью изображения scikit. Это всего лишь пара строк кода, например:

    from skimage import measure
    contours = measure.find_contours(gimg, 0.8)

Возвращает векторное представление контурных линий. В отдельном массиве для каждой строки. И также легко уменьшить количество точек в линии, вычисляя приближение. Вот немного более длинное описание с исходным кодом: векторизация изображения с python

0 голосов
/ 26 июня 2019

Существуют различные краевые детекторы, которые вы можете использовать: Канни, Собел, Лапласиан, Шарр, Превитт, Робертс .Вы можете сделать это с помощью OpenCV :

import cv2
import numpy as np

img = cv2.imread('your_image.jpg', 0)

# Canny
edges_canny = cv2.Canny(img, 100, 100)

# Sobel
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
edges_sobel = np.hypot(sobel_x, sobel_y)
edges_sobel *= 255.0 / np.max(edges_sobel)

# Laplacian
edges_laplacian = cv2.Laplacian(img, cv2.CV_64F)

# Scharr
schar_x = cv2.Scharr(img, cv2.CV_64F, 1, 0)
schar_y = cv2.Scharr(img, cv2.CV_64F, 0, 1)
edges_scharr = np.hypot(schar_x, schar_y)
edges_scharr *= 255.0 / np.max(edges_scharr)

или scikit-image :

import cv2
from skimage import feature, filters

img = cv2.imread('your_image.jpg', 0)

edges_canny = feature.canny(img) # Canny
edges_sobel = filters.sobel(img) # Sobel
edges_laplace = filters.laplace(img) # Laplacian
edges_scharr = filters.scharr(img) # Scharr
edges_prewitt = filters.prewitt(img) # Prewitt
edges_roberts = filters.roberts(img) # Roberts

Детектор Canny Edge , вероятно, является наиболее часто используемым и наиболее эффективным методом, но также и наиболее сложным.Для получения более подробной информации о том, чем отличаются упомянутые методы, проверьте это сообщение в блоге .

...