处理图像时,经常需要将大图拆成小块进行并行计算或局部操作。这时候,数组分割技巧就派上了用场。比如你在做一张高分辨率卫星图的边缘检测,直接处理整张图内存吃紧,卡得不行。不如把图像数组切成若干子区域,逐个处理,效率反而更高。
二维数组按块分割
图像本质是二维像素数组。使用 NumPy 可以轻松实现块状分割。比如把一个 512×512 的图像均分为 4 块 256×256 的子图:
import numpy as np
# 模拟一张灰度图(512x512)
image = np.random.rand(512, 512)
# 分割成 2x2 的块
block_size = 256
blocks = [image[i:i+block_size, j:j+block_size]
for i in range(0, 512, block_size)
for j in range(0, 512, block_size)]
print(len(blocks)) # 输出 4
每一块都可以单独送入滤波器、卷积核或其他算法中处理,处理完再拼回去,整个过程更灵活也更可控。
重叠分割避免边界断裂
有时候直接切块会导致边缘信息丢失。比如你对每个块做锐化,但块与块交界处的像素没有上下文,结果拼起来会有明显接缝。解决办法是让分割时有重叠区域。
例如,每块取 128×128,但步长设为 64,这样相邻块之间有一半重合:
block_size = 128
stride = 64
blocks = []
for i in range(0, 512 - block_size + 1, stride):
for j in range(0, 512 - block_size + 1, stride):
blocks.append(image[i:i+block_size, j:j+block_size])
处理完后再用加权融合或裁掉边缘的方式合并,能有效减少拼接痕迹。
利用现成工具函数快速分块
NumPy 自带的 numpy.split 和 numpy.array_split 适合规则切分。比如水平切成四条带状区域:
vertical_strips = np.array_split(image, 4, axis=1)
而 skimage.util.view_as_blocks 更适合图像场景:
from skimage.util import view_as_blocks
# 将图像划分为 64x64 的不可重叠块
patched = view_as_blocks(image, (64, 64))
print(patched.shape) # (8, 8, 64, 64),前两维是网格位置
这种结构方便遍历每个图像块做独立运算,比如统计局部亮度或识别纹理特征。
实际项目中,像图像压缩、目标检测、去噪算法都常用到这些分割方式。掌握这些技巧,处理大图不再头疼,跑模型也更稳。”}