如何将图像2x2子矩阵broadcast到同尺寸零矩阵以获得指定输出结果
3x4矩阵滑动2x2窗口生成对应全零填充矩阵实现方案
实现逻辑
你需要的效果本质是对原3行4列矩阵做2x2尺寸的滑动窗口遍历,每个窗口单独放到同尺寸全零矩阵的对应位置,总共有(3-2+1)*(4-2+1) = 6个结果,和你给出的输出数量完全匹配:
- 行方向窗口起始位置可选值:0、1(共2种,保证窗口不会超出原矩阵行边界)
- 列方向窗口起始位置可选值:0、1、2(共3种,保证窗口不会超出原矩阵列边界)
代码实现
NumPy版本(最简洁,适合图像处理场景)
import numpy as np # 定义原3x4图像矩阵 img = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]]) kernel_size = 2 rows, cols = img.shape result = [] # 遍历所有合法的窗口起始坐标 for i in range(rows - kernel_size + 1): for j in range(cols - kernel_size + 1): # 初始化同尺寸全零矩阵 zero_mat = np.zeros_like(img) # 把对应位置的2x2子矩阵赋值到全零矩阵 zero_mat[i:i+kernel_size, j:j+kernel_size] = img[i:i+kernel_size, j:j+kernel_size] result.append(zero_mat) # 打印验证结果 for item in result: print(item.tolist()) print()
原生Python列表版本(无需依赖第三方库)
# 定义原3x4图像矩阵 img = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] kernel_size = 2 rows = len(img) cols = len(img[0]) result = [] # 遍历所有合法的窗口起始坐标 for i in range(rows - kernel_size + 1): for j in range(cols - kernel_size + 1): # 初始化同尺寸全零矩阵 zero_mat = [[0]*cols for _ in range(rows)] # 逐个赋值2x2窗口的元素 for di in range(kernel_size): for dj in range(kernel_size): zero_mat[i+di][j+dj] = img[i+di][j+dj] result.append(zero_mat) # 打印验证结果 for item in result: print(item) print()
以上两种实现运行后输出的结果和你给出的示例完全一致。
内容的提问来源于stack exchange,提问作者opiyo philip lutaya
相关产品推荐
相关产品推荐

