image-processing - Julia 的索贝尔算子

标签 image-processing julia sobel

我是 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_xkernel_y 转换为 Array64。基本想法是将代码从 python 转换为 Julia,因为我不知道语法。你能帮我一些建议吗? 谢谢!

最佳答案

您的代码可以使用一些编辑(不必要的类型调用、全局变量等),但我认为它不会对错误结果负责。

看起来您的 sobel 函数接受了 img,但它仅在第一行中使用它来创建黑色(全 0)edge_img,则该函数的其余部分仅适用于 edge_img。我认为这就是为什么你最终得到黑色图像的原因。也许您打算在 gx = ...gy = ... 行中对 img 中的值进行索引?

关于image-processing - Julia 的索贝尔算子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70441886/

相关文章:

opencv - 线段检测器与概率霍夫变换

c++ - OpenCV/C++ 中的 MATLAB sub2ind/ind2sub

templates - Julia 函数签名和子类型,特别是 String、ByteString

python - 使用 julia 的数组或条件评估集

java - 在 Java 中实现 Sobel 过滤器 - 标准化值

algorithm - Lowe 如何计算他的 SIFT 算法的 “repeatability”?

c++ - 曲线/路径骨架二值图像处理

Julia:读取工作目录中的许多文件

java - 使用 BufferedImage.TYPE_BYTE_BINARY 作为输出的 Sobel 边缘检测

java - 索贝尔算子 MaskX