如何用Python的NumPy将图像数组拆分为每个含16字节的子数组?
解决数组拆分:每个子数组包含16字节而非拆分为16个数组
我明白你的问题了——你想要的是把从图像提取的数组拆成每个包含16字节的子数组,而不是把原数组分成16个部分对吧?你之前用np.array_split(i, 16)的问题在于,这个函数的第二个参数是「拆分的份数」,而不是「每个子数组的大小」,所以才会得到16个数组,和你的需求刚好相反。
下面根据两种常见的需求场景给出解决方案:
场景1:将整个图像数组全局拆分为16字节的子数组
如果希望无视原数组的行列结构,把所有元素连续拆成多个16元素的子数组(假设每个元素是1字节,比如单通道8位图像),可以这样做:
from PIL import Image import numpy as np img = Image.open("images.tif") img_array = np.array(img) # 先将二维数组展平为一维 flattened_array = img_array.flatten() # 计算能完整拆分为16字节子数组的元素总数(丢弃不足16字节的剩余部分) total_valid_elements = (len(flattened_array) // 16) * 16 trimmed_array = flattened_array[:total_valid_elements] # 拆分为每行16元素的二维数组(每个行就是一个16字节的子数组) split_arrays = trimmed_array.reshape(-1, 16) # 遍历输出每个16字节子数组 for sub_arr in split_arrays: print(sub_arr)
场景2:按行拆分,每行拆分为多个16字节的子数组
如果希望保留原数组的行结构,将每一行都拆成若干个16字节的子数组,可以这样修改你的代码:
from PIL import Image import numpy as np img = Image.open("images.tif") img_array = np.array(img) for row in img_array: # 修剪当前行,只保留能被16整除的元素数量 trimmed_row = row[:len(row) // 16 * 16] # 将行拆分为多个16元素的子数组 row_subarrays = trimmed_row.reshape(-1, 16) # 输出当前行的所有16字节子数组 print(row_subarrays)
关键说明
reshape(-1, 16)中的-1表示让NumPy自动计算拆分后的子数组数量,这样就能保证每个子数组恰好包含16个元素(也就是16字节,当元素为单字节类型时)。- 如果需要保留不足16字节的剩余元素,可以单独处理
flattened_array[total_valid_elements:](全局拆分场景)或者row[len(row)//16 *16:](按行拆分场景)。
内容的提问来源于stack exchange,提问作者DTOP
相关产品推荐
相关产品推荐

