gpt4 book ai didi

julia - 我想在 Julia 中对图像进行逻辑屏蔽

转载 作者:行者123 更新时间:2023-12-05 02:04:14 24 4
gpt4 key购买 nike

我想在 Julia 中做逻辑屏蔽。
如果图像的第2和第3个元素相等,则应将它们更改为0,其他不更改。
我试过了;

mask = img[:, :, 2] .== img[:, :, 3]
img[:, :, 2][mask] .= 0

图像大小为(1200, 1920, 3),但img[:, :, 2]的大小为(1676348,)。
我猜蒙版上的“真”值会保留,但“假”值会被移除。
我想将 logical-masked-image 作为图像处理,因此它应该是 (1200, 1920, 1)。
如何通过逻辑掩码保持大小?

最佳答案

编辑:

最快的方法是:

@views @. img[:, :, 2] *= img[:, :, 2] != img[:, :, 3]

这是一个基准:

julia> img = rand(1:3, 10000, 10000, 3);

julia> @time @views @. img[:, :, 2] *= img[:, :, 2] != img[:, :, 3];
0.111409 seconds (28 allocations: 1.219 KiB)

有其他方法可以完成您想要的操作,但如果我们想要遵循您的实现,那么请执行以下操作:

julia> img = rand(1:3, 4,4,3)
4×4×3 Array{Int64,3}:
[:, :, 1] =
1 3 2 3
1 1 1 3
3 2 1 3
2 2 3 1

[:, :, 2] =
1 2 3 2
2 2 1 1
3 3 3 2
1 3 2 1

[:, :, 3] =
3 2 2 2
3 2 2 1
3 2 3 3
2 2 1 2

julia> mask = img[:, :, 2] .== img[:, :, 3]
4×4 BitArray{2}:
0 1 0 1
0 1 0 1
1 0 1 0
0 0 0 0

julia> view(img,:, :, 2)[mask] .= 0;

julia> img
4×4×3 Array{Int64,3}:
[:, :, 1] =
1 3 2 3
1 1 1 3
3 2 1 3
2 2 3 1

[:, :, 2] =
1 0 3 0
2 0 1 0
0 3 0 2
1 3 2 1

[:, :, 3] =
3 2 2 2
3 2 2 1
3 2 3 3
2 2 1 2

(使用 view 获取您想要的内容至关重要,否则 img[:, :, 2] 会创建一个副本)

或者在 Julia 中,使用循环编写相同的代码很容易,例如:

function applymask!(img)
for i in axes(img, 1), j in axes(img, 2)
img[i, j, 2] == img[i, j, 3] && (img[i, j, 2] = 0)
end
end

(这不是最快的实现,因为它使用分支并进行边界检查,但在大多数情况下应该足够好)

现在你可以写:

julia> img = rand(1:3, 4,4,3)
4×4×3 Array{Int64,3}:
[:, :, 1] =
1 3 1 3
3 3 1 2
3 3 3 3
2 1 3 1

[:, :, 2] =
3 1 3 1
3 3 3 3
2 1 1 3
1 2 3 3

[:, :, 3] =
1 1 2 1
2 1 3 2
3 3 1 1
1 2 1 3

julia> applymask!(img)

julia> img
4×4×3 Array{Int64,3}:
[:, :, 1] =
1 3 1 3
3 3 1 2
3 3 3 3
2 1 3 1

[:, :, 2] =
3 0 3 0
3 3 0 3
2 1 0 3
0 0 3 0

[:, :, 3] =
1 1 2 1
2 1 3 2
3 3 1 1
1 2 1 3

关于julia - 我想在 Julia 中对图像进行逻辑屏蔽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64549136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com