2011-08-25 17 views
10

Sto provando ad applicare il filtro Sobel su un'immagine per rilevare i bordi utilizzando scipy. Sto usando Python 3.2 (64 bit) e scipy 0.9.0 su Windows 7 Ultimate (64 bit). Attualmente il mio codice è il seguente:Applicazione del filtro Sobel utilizzando scipy

import scipy 
from scipy import ndimage 

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

Non so cosa sto facendo male, ma l'immagine elaborata non sembra niente di quello che dovrebbe. L'immagine, 'bike.jpg' è un'immagine in scala di grigi (modalità 'L' non 'RGB') in modo che a ciascun pixel sia associato un solo valore.

Purtroppo non riesco a postare le immagini qui ancora (non hanno abbastanza reputazione), ma ho fornito i link qui sotto:

immagine originale (bike.jpg): http://s2.postimage.org/64q8w613j/bike.jpg

SciPy filtrato (sobel.jpg): http://s2.postimage.org/64qajpdlb/sobel.jpg

risultato atteso: http://s1.postimage.org/5vexz7kdr/normal_sobel.jpg

sono ovviamente andare s sbagliate omewhere! Qualcuno può dirmi dove? Grazie.

risposta

20

1) Utilizzare una precisione maggiore. 2) Si sta solo calcolando l'approssimazione della derivata lungo l'asse zero. L'operatore 2D Sobel è spiegato su Wikipedia. Prova questo codice:

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) 
+0

Sì, ho voluto il derivato in tutto il 0 asse (dx). In realtà sto cercando di implementare il rilevatore di bordo Canny e ho riscontrato problemi nel calcolo del gradiente usando gli operatori Sobel. Grazie mille! Dovevo cambiare la precisione. – Feanor

6

Non ho potuto commentare la risposta di cgohlke così ho ripetuto la sua risposta con una correzione. Parametro viene utilizzato per verticale derivato e per orizzontale derivato (primo asse di una matrice immagine è direzione y/verticale - righe, e secondo asse è x/orizzontale direzione - colonne). Volevo solo avvertire gli altri utenti, perché ho perso 1 ora cercando errori nei posti sbagliati.

import numpy 
import scipy 
from scipy import ndimage 

im = scipy.misc.imread('bike.jpg') 
im = im.astype('int32') 
dx = ndimage.sobel(im, 1) # horizontal derivative 
dy = ndimage.sobel(im, 0) # vertical derivative 
mag = numpy.hypot(dx, dy) # magnitude 
mag *= 255.0/numpy.max(mag) # normalize (Q&D) 
scipy.misc.imsave('sobel.jpg', mag) 
+1

Giusto per essere chiari, il gradiente essendo ortogonale al bordo, la derivata orizzontale rileva i bordi * verticali *. – dtk

0

oppure è possibile utilizzare:

def sobel_filter(im, k_size): 

    im = im.astype(np.float) 
    width, height, c = im.shape 
    if c > 1: 
     img = 0.2126 * im[:,:,0] + 0.7152 * im[:,:,1] + 0.0722 * im[:,:,2] 
    else: 
     img = im 

    assert(k_size == 3 or k_size == 5); 

    if k_size == 3: 
     kh = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtype = np.float) 
     kv = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]], dtype = np.float) 
    else: 
     kh = np.array([[-1, -2, 0, 2, 1], 
        [-4, -8, 0, 8, 4], 
        [-6, -12, 0, 12, 6], 
        [-4, -8, 0, 8, 4], 
        [-1, -2, 0, 2, 1]], dtype = np.float) 
     kv = np.array([[1, 4, 6, 4, 1], 
        [2, 8, 12, 8, 2], 
        [0, 0, 0, 0, 0], 
        [-2, -8, -12, -8, -2], 
        [-1, -4, -6, -4, -1]], dtype = np.float) 

    gx = signal.convolve2d(img, kh, mode='same', boundary = 'symm', fillvalue=0) 
    gy = signal.convolve2d(img, kv, mode='same', boundary = 'symm', fillvalue=0) 

    g = np.sqrt(gx * gx + gy * gy) 
    g *= 255.0/np.max(g) 

    #plt.figure() 
    #plt.imshow(g, cmap=plt.cm.gray)  

    return g 

per più vedere here

+0

Si prega di includere una spiegazione della risposta nel testo della risposta. Avere il collegamento è ok, ma avendo * solo * il collegamento dovrebbe essere evitato in quanto i collegamenti possono rompersi nel tempo. – toonice

Problemi correlati