如何在Julia中高效获取图像的8×8二维滑动窗口?
Julia中高效提取图像滑动窗口的方案
问题描述
现有一张2000×2000像素的灰度图像,需要提取所有尺寸为8×8的滑动窗口(子数组),步长固定为1,功能等价于Python NumPy中的np.lib.stride_tricks.sliding_window_view(img, (8,8))。
已尝试方案
曾尝试ImageFiltering.jl中的mapwindow函数,但该函数不支持8×8这类偶数尺寸的窗口,即使指定border=Inner()参数也无法得到正确结果。
期望结果
对2000×2000的数组,得到1993×1993个(共3972049个)形状为8×8的子数组,无需填充,步长固定为1。
自定义实现
已编写以下自定义函数实现需求,但希望找到现成的高效方案:
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
推荐的高效现成方案
使用Strided.jl包
Strided.jl提供了高效的滑动窗口实现,返回原始数据的视图而非复制数据,性能更优。
- 安装包:
using Pkg Pkg.add("Strided")
- 提取滑动窗口:
using Strided # 示例:生成2000×2000的灰度图像 img = rand(2000, 2000) # 提取8×8滑动窗口,返回形状为(8,8,1993,1993)的四维视图 windows = slidingwindow(img, (8, 8)) # 若需要将窗口维度调整到最后(形状变为(1993,1993,8,8)),可使用permutedims windows_reshaped = permutedims(windows, (3, 4, 1, 2))
该方案避免了内存复制,比自定义列表推导式更高效,尤其适合处理大尺寸图像。
内容的提问来源于stack exchange,提问作者Siddharth Yadav
相关产品推荐
相关产品推荐

