我需要使用 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
这似乎适用于范围。 考虑这个图像 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)