Why does my Sobel edge detection code not work?

940 Views Asked by At

Here is my code for edge detection using the Sobel operator:

from PIL import Image
import numpy as np
from scipy import misc

a = np.array([1, 2, 1])
b = np.array([1, 0, -1])
Gy = np.outer(a, b)
Gx = np.rot90(Gy, k=3)

def apply(X):
    a = (X * Gx)
    b = (X * Gy)
    return np.abs(a.sum()) + np.abs(b.sum())

data = np.uint8(misc.lena())
data2 = np.copy(data)
center = offset = 1
for i in range(offset, data.shape[0]-offset):
    for j in range(offset, data.shape[1]-offset):
        X = data[i-offset:i+offset+1, j-offset:j+offset+1]
        data[i, j] = apply(X)

image = Image.fromarray(data)
image.show()
image = Image.fromarray(data2)
image.show()

Which results in:

enter image description here

Instead of:

enter image description here

For what it's worth, I'm fairly certain my for loops and general idea of image kernels are correct. For example, I was able to generate this custom filter (Gaussian with center subtracted):

enter image description here

What's wrong with my Sobel filter?

1

There are 1 best solutions below

1
On BEST ANSWER

Finally figured it out. I shouldn't have been modifying the array in place because it obviously changes the values that are computed in subsequent applications of the filter. This works:

...
new_data = np.zeros(data.shape)
center = offset = 1
for i in range(offset, new_data.shape[0]-offset):
    for j in range(offset, new_data.shape[1]-offset):
        X = data[i-offset:i+offset+1, j-offset:j+offset+1]
        new_data[i, j] = apply(X)
...

Which produces:

enter image description here