Julia 中的 Sobel 算子
Sobel Operator in Julia
我是 Julia 编程的初学者,我想实现 Sobel 运算符。不幸的是,以下代码的输出只是一张黑色图像。
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)
我将 kernel_x
和 kernel_y
转换为 Array64。基本想法是将代码从 python 转换为 Julia,因为我不知道语法。你能帮我一些提示吗?
谢谢!
您的代码可能需要进行一些编辑(不必要的类型调用、全局变量等),但我认为其中的大部分内容不会导致错误结果。
看起来你的 sobel
函数接受了一个 img
,但它只在第一行使用它来创建一个黑色(全 0)edge_img
,然后才有效on edge_img
用于函数的其余部分。我认为这就是为什么你最终得到一张黑色图像的原因。也许您打算在 gx = ...
和 gy = ...
行中索引来自 img
的值?
您可以尝试使用 ImageFiltering
:
using ImageFiltering, TestImages, Plots
im = testimage("cameraman")
kernel = [1 0 -1; 2 0 -2;1 0 -1]
ims = imfilter(im, kernel)
Plots.plot(hcat(im, ims))
我是 Julia 编程的初学者,我想实现 Sobel 运算符。不幸的是,以下代码的输出只是一张黑色图像。
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)
我将 kernel_x
和 kernel_y
转换为 Array64。基本想法是将代码从 python 转换为 Julia,因为我不知道语法。你能帮我一些提示吗?
谢谢!
您的代码可能需要进行一些编辑(不必要的类型调用、全局变量等),但我认为其中的大部分内容不会导致错误结果。
看起来你的 sobel
函数接受了一个 img
,但它只在第一行使用它来创建一个黑色(全 0)edge_img
,然后才有效on edge_img
用于函数的其余部分。我认为这就是为什么你最终得到一张黑色图像的原因。也许您打算在 gx = ...
和 gy = ...
行中索引来自 img
的值?
您可以尝试使用 ImageFiltering
:
using ImageFiltering, TestImages, Plots
im = testimage("cameraman")
kernel = [1 0 -1; 2 0 -2;1 0 -1]
ims = imfilter(im, kernel)
Plots.plot(hcat(im, ims))