Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Applying the Sobel filter using scipy

I'm trying to apply the Sobel filter on an image to detect edges using scipy. I'm using Python 3.2 (64 bit) and scipy 0.9.0 on Windows 7 Ultimate (64 bit). Currently my code is as follows:

import scipy
from scipy import ndimage

im = scipy.misc.imread('bike.jpg')
processed = ndimage.sobel(im, 0)
scipy.misc.imsave('sobel.jpg', processed)

I don't know what I'm doing wrong, but the processed image does not look anything like what it should. The image, 'bike.jpg' is a greyscale (mode 'L' not 'RGB') image so each pixel has only one value associated with it.

Unfortunately I can't post the images here yet (don't have enough reputation) but I've provided links below:

Original Image (bike.jpg): http://s2.postimage.org/64q8w613j/bike.jpg

Scipy Filtered (sobel.jpg): http://s2.postimage.org/64qajpdlb/sobel.jpg

Expected Output: http://s1.postimage.org/5vexz7kdr/normal_sobel.jpg

I'm obviously going wrong somewhere! Can someone please tell me where. Thanks.

like image 936
Feanor Avatar asked Aug 25 '11 05:08

Feanor


1 Answers

1) Use a higher precision. 2) You are only calculating the approximation of the derivative along the zero axis. The 2D Sobel operator is explained on Wikipedia. Try this code:

import numpy
import scipy
from scipy import ndimage

im = scipy.misc.imread('bike.jpg')
im = im.astype('int32')
dx = ndimage.sobel(im, 0)  # horizontal derivative
dy = ndimage.sobel(im, 1)  # vertical derivative
mag = numpy.hypot(dx, dy)  # magnitude
mag *= 255.0 / numpy.max(mag)  # normalize (Q&D)
scipy.misc.imsave('sobel.jpg', mag)
like image 96
cgohlke Avatar answered Sep 22 '22 18:09

cgohlke