Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python edge detection and curvature calculation

I know the edge detection problem has been posted before (in Java: Count the number of objects in an Image, language independent: Image edge detection), but I want to know how to implement it in python.

I'm doing edge detection and curvature calculation around the edge on some simple shapes (binary shape with some noise). I know there are some wrapper for OpenCV, but not sure which one is better: pyopencv, pycv, pycvf?

Since I'm basically only doing this two tasks, I'm also not sure whether it would be faster to implement it by myself rather than using the library.

like image 925
clwen Avatar asked Feb 04 '12 00:02

clwen


3 Answers

There are different edge detectors you can use: Canny, Sobel, Laplacian, Scharr, Prewitt, Roberts. You can do it with 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)

or with 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 detector is probably the most commonly used and most effective method, but also the most complex. For more details on what is the difference between the mentioned methods check this blog post.

like image 132
tsveti_iko Avatar answered Sep 24 '22 09:09

tsveti_iko


We have segmentation and edge detection algorithms in the actively developed scikit-image that you may find useful:

Scikit Images Examples

like image 13
Stefan van der Walt Avatar answered Oct 23 '22 13:10

Stefan van der Walt


You can easily achieve edge detection with scipy in python.

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

And here is an example of original image and the image after edge detection. enter image description here

In scikit-image, there is a special page with explanations of how to do edge detection.

like image 6
Salvador Dali Avatar answered Oct 23 '22 13:10

Salvador Dali