【问题标题】:Sobel Operator in JuliaJulia中的Sobel算子
【发布时间】:2022-01-23 06:07:06
【问题描述】:

我是 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,因为我不知道语法。你能帮我一些建议吗? 谢谢!

【问题讨论】:

    标签: image-processing julia sobel


    【解决方案1】:

    您的代码可能需要进行一些编辑(不必要的类型调用、全局变量等),但我认为这不是导致错误结果的主要原因。

    看起来你的sobel 函数接受了img,但它只在第一行使用它来创建一个黑色(全0)edge_img,然后只在edge_img 的其余部分工作功能。我认为这就是你最终得到黑色图像的原因。也许您打算在 gx = ...gy = ... 行中索引来自 img 的值?

    【讨论】:

      【解决方案2】:

      你可以试试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))
      

      【讨论】:

        猜你喜欢
        • 2018-01-31
        • 2014-04-18
        • 2021-08-31
        • 2019-12-04
        • 2018-01-16
        • 2020-03-12
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        相关资源
        最近更新 更多