首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Julia中的Sobel算子

Julia中的Sobel算子
EN

Stack Overflow用户
提问于 2021-12-21 21:40:37
回答 2查看 172关注 0票数 2

我是朱莉娅编程的初学者,我想实现Sobel运算符。不幸的是,以下代码的输出只是一个黑色的图像。

代码语言:javascript
复制
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,因为我不知道语法。你能帮我拿些小费吗?谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-12-21 22:27:43

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

它看起来像您的sobel函数接受一个img,但它只在第一行中使用它来创建一个黑色(全部为0)的edge_img,然后只对函数的其余部分使用edge_img。我想这就是为什么你最后会有一个黑色的形象。也许您打算在imggy = ...行中索引来自gy = ...的值?

票数 3
EN

Stack Overflow用户

发布于 2021-12-21 22:49:14

您可以尝试使用ImageFiltering

代码语言:javascript
复制
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))

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70441886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档