image-processingjuliasobel

Sobel Operator in Julia


I am beginner regarding Julia programming and I want to implement Sobel operator. Unfortunately the output of the following code is just a black image.

using Images, Colors, FileIO, Plots;
img = load("Lenna.png");
img_gray = Gray.(img);
sobel_image = convert(Array{Float64}, img_gray);
kernel_x =  Array{Float64}([1 0 -1; 2 0 -2; 1 0 -1]);
kernel_y =  Array{Float64}([1 2 1; 0 0 0; -1 -2 -1]);

#plot(img_gray)
function sobel(img)
    edge_img = zeros(Gray{Float64}, size(img, 1), size(img, 2));
    for x in 1:size(edge_img, 1) - size(kernel_x,1)
        for y in 1:size(edge_img, 2) - size(kernel_y,2)
            gx = sum(Gray{Float64}.(
                @view edge_img[x:x+size(kernel_x,1)-1, y:y+size(kernel_y,2)-1]) .* kernel_x)
            gy = sum(Gray{Float64}.(
                    @view edge_img[x:x+size(kernel_x,1)-1, y:y+size(kernel_y,2)-1]) .* kernel_y)
            edge_img[x+1, y+1] = hypot(gx, gy)
        end
    end
    return edge_img;
end

last_image = sobel(sobel_image)
plot(last_image)

I converted kernel_x and kernel_y to Array64. The basic idea was to convert code from python to Julia since i do not know the syntax. Could you help me with some tips? Thanks!


Solution

  • Your code could use some editing (unnecessary type calls, global variables, etc), but I don't think much of it is responsible for the erroneous result.

    It looks like your sobel function takes in an img, but it only uses it in the first line to create a black (all 0s) edge_img, then only works on edge_img for the rest of the function. I think that's why you end up with a black image. Perhaps you meant to index values from img in the gx = ... and gy = ... lines?