灰度图像块像素重排优化:替代四层嵌套循环的高效方案
优化灰度图像块对应像素重排的四层循环效率问题
现有一张灰度图像,已划分为128×128规格的图像块,输入图像(Image_input)的行方向块数为68(num_block_row),列方向块数为54(num_block_col)。当前通过四层嵌套for循环实现将每个块的对应像素(即所有块中位置相同的像素)并排排列的功能,代码可正常运行但耗时极高,原代码如下:
for t in range(blocksize[0]): for s in range(blocksize[0]): for i in range(num_block_row): for j in range(num_block_col): Image_result[(t*num_block_row) + i ,(s*num_block_col) + j] = Image_input[(i * blocksize[0]) + t, (j * blocksize[0]) + s]
优化方案:使用Numpy向量化操作替代循环
Python嵌套循环的逐元素操作效率极低,尤其是处理大尺寸图像时。利用Numpy的维度变换(reshape + transpose)可以实现完全相同的功能,且效率提升几个数量级。
核心思路通过三步完成像素重排:
- 按块拆分维度:将输入图像从
(num_block_row*128, num_block_col*128)转换为(num_block_row, 128, num_block_col, 128),对应维度为(块行索引,块内行索引,块列索引,块内列索引)。 - 调整轴顺序:把块内行/列索引移到最外层,将数组形状转为
(128, num_block_row, 128, num_block_col),让每个块内相同位置的像素集中到对应子数组。 - 合并维度:将调整后的数组合并为
(128*num_block_row, 128*num_block_col),得到与原循环完全一致的结果。
优化后的代码:
import numpy as np # 确保输入图像形状符合预期 assert Image_input.shape == (num_block_row * blocksize[0], num_block_col * blocksize[1]) # 按块拆分维度 blocked_img = Image_input.reshape(num_block_row, blocksize[0], num_block_col, blocksize[1]) # 调整轴顺序 reordered_img = blocked_img.transpose(1, 0, 3, 2) # 合并维度得到结果 Image_result = reordered_img.reshape(blocksize[0] * num_block_row, blocksize[1] * num_block_col)
验证正确性
可以随机选取位置对比原循环与优化代码的输出,确保结果一致:
# 随机选取参数验证 t, s = 50, 60 i, j = 10, 20 val_original = Image_input[(i * blocksize[0]) + t, (j * blocksize[0]) + s] val_optimized = Image_result[(t*num_block_row) + i, (s*num_block_col) + j] assert val_original == val_optimized, "结果不一致,请检查参数或步骤"
内容的提问来源于stack exchange,提问作者Afra Mirhosseini
相关产品推荐
相关产品推荐

