如何为skimage view_as_windows设置非方阵步长处理RGB图像?
解决skimage view_as_windows处理RGB图像时的非方阵步长设置问题
核心结论
处理RGB这类3通道图像时,通道维度的步长必须设为1,同时窗口的通道维度要和原图像保持一致(即3)。这样既满足函数对步长元组长度的要求,又能保证每个窗口包含完整的RGB通道,且仅在图像的宽高维度按预期步长滑动。
问题原因分析
你之前的错误在于对通道维度步长的理解:
- 设置
step=(9,12,3)时,通道方向步长等于窗口大小,导致通道方向只能生成1个窗口,直接限制了整体窗口数量; - 设置
step=(9,12,1)其实是正确的,但你可能没注意到view_as_windows的输出shape结构——它会额外生成两个维度对应宽高方向的网格数,导致你误以为数量不符合预期。
修正后的代码示例
import cv2 from skimage.util import view_as_windows img = cv2.imread(img_path, cv2.IMREAD_UNCHANGED) img = cv2.cvtColor(img[:,:,:3], cv2.COLOR_BGR2RGB) # 图像shape (1376, 2124, 3) tile_shape = (250, 600, 3) # 窗口需包含完整3通道 stride = (150, 500) # 通道维度步长固定为1,避免破坏RGB通道完整性 tiles = view_as_windows(img, tile_shape, (stride[0], stride[1], 1)) # 输出shape为 (高度方向窗口数, 宽度方向窗口数, 1, 250, 600, 3) print(tiles.shape) # 若需要将窗口展平为(N, 250, 600, 3)的格式,方便后续处理 tiles_flat = tiles.reshape(-1, *tile_shape) print(tiles_flat.shape)
验证窗口数量
按你的参数计算,预期窗口数为:
- 高度方向:
(1376 - 250) // 150 + 1 = 8 - 宽度方向:
(2124 - 600) // 500 + 1 = 4 - 总窗口数:
8 * 4 = 32,对应tiles_flat的shape为(32, 250, 600, 3),完全符合预期。
内容的提问来源于stack exchange,提问作者gozi
相关产品推荐
相关产品推荐

