从 Julia 中的图像获取二维滑动窗口

问题描述 投票:0回答:1

我需要使用 Julia 编程语言从图像中获取多个滑动窗口。我是这门语言的新手,很难找到高性能的解决方案。

问题:假设我有一个大小为 2000x2000 像素的灰度图像。我需要从此图像中获取/收集大小为 8x8 的所有可能的窗口(也称为子数组)。在 NumPy (Python) 中,只需通过

np.lib.stride_tricks.sliding_window_view(img, (8,8))
即可完成。其中
img
是形状为 2000x2000 的数组,元组 (8,8) 定义每个维度的窗口大小。

我尝试过什么:我之前见过类似的问题,例如:

不幸的是,我无法让这些建议在我的用例中正常工作。例如,

ImageFiltering.jl
中的mapwindow function不支持均匀形状的窗口,例如8x8。即使使用显式边框参数调用该函数也不会给出正确的结果;
mapwindow(collect, img, (9,9), border=Inner())

我的期望:给定一个 2000x2000 像素的数组,我需要返回 1993 个子数组,每个子数组的形状为 8x8 像素。不需要诸如填充或自定义步长之类的奇特东西(这应该只是 1)。

我已经编写了一个自定义函数(见下文)来实现此功能,但我不想重新发明轮子,因为 Julia 中的某个地方应该已经有相当高性能的东西了。

谢谢你

function get_windows(img, window_size=8)
           X, Y = size(img)

           [img[i:i+window_size-1, j:j+window_size-1]
           for i in 1:X-window_size+1
           for j in 1:Y-window_size+1]
end
image-processing multidimensional-array julia sliding-window
1个回答
0
投票

这似乎适用于范围。 考虑这个图像 4x4:

julia> img = Gray.(i*j/20 for i in 1:4, j in 1:4)
4×4 Array{Gray{Float64},2} with eltype Gray{Float64}:
 Gray{Float64}(0.05)  Gray{Float64}(0.1)  Gray{Float64}(0.15)  Gray{Float64}(0.2)
 Gray{Float64}(0.1)   Gray{Float64}(0.2)  Gray{Float64}(0.3)   Gray{Float64}(0.4)
 Gray{Float64}(0.15)  Gray{Float64}(0.3)  Gray{Float64}(0.45)  Gray{Float64}(0.6)
 Gray{Float64}(0.2)   Gray{Float64}(0.4)  Gray{Float64}(0.6)   Gray{Float64}(0.8)

您可以使用以下代码制作均匀形状的窗口(此处为 2x2):

julia> windows = mapwindow(collect, img, (0:1,0:1),border=Inner())
3×3 OffsetArray(::Matrix{Matrix{Gray{Float64}}}, 1:3, 1:3) with eltype Matrix{Gray{Float64}} with indices 1:3×1:3:
...

让我们看看:

julia> windows[1,1] # top left
2×2 Array{Gray{Float64},2} with eltype Gray{Float64}:
 Gray{Float64}(0.05)  Gray{Float64}(0.1)
 Gray{Float64}(0.1)   Gray{Float64}(0.2)

julia> windows[2,2] # middle
2×2 Array{Gray{Float64},2} with eltype Gray{Float64}:
 Gray{Float64}(0.2)  Gray{Float64}(0.3)
 Gray{Float64}(0.3)  Gray{Float64}(0.45)

julia> windows[3,3] # bottom right
2×2 Array{Gray{Float64},2} with eltype Gray{Float64}:
 Gray{Float64}(0.45)  Gray{Float64}(0.6)
 Gray{Float64}(0.6)   Gray{Float64}(0.8)
© www.soinside.com 2019 - 2024. All rights reserved.