将灰度图的十进制Numpy数组转二进制后拆分为8个Numpy数组
高效实现灰度图二进制位拆分方案
你的思路完全没问题,但手动循环处理二进制转换效率偏低,尤其是面对大尺寸图像时。这里给你推荐用Numpy原生位运算的优化方案,代码更简洁、运行速度也快得多:
核心思路
利用Numpy的**右移运算(>>)和按位与运算(&)**直接提取每一位:
- 对像素值右移
k位,能把第k位移到最低位 - 再和
1做按位与,就能保留该位的0/1值,直接得到对应位的数组
完整代码示例
import numpy as np # 模拟你的灰度图数组(shape为(H,W),取值0-255) img = np.array([[42,0,52,234],[232,123,2,243],[24,231,245,21],[21,213,241,233]]) # 生成8个二进制位数组:bits[0]对应第0位(最低位),bits[7]对应第7位(最高位) bit_arrays = [] for bit_position in range(8): # 提取当前位的0/1数组 current_bit = (img >> bit_position) & 1 bit_arrays.append(current_bit) # 可选:如果需要每个像素的8位二进制数组(shape为(H,W,8),最高位在前) bin_img = np.stack([(img >> k) & 1 for k in reversed(range(8))], axis=-1)
验证示例
以第一个像素42为例,它的二进制是00101010:
bit_arrays[0][0][0]→ 第0位:0bit_arrays[1][0][0]→ 第1位:1bit_arrays[2][0][0]→ 第2位:0- ...以此类推,和手动计算完全一致
对比你的现有代码
你的代码逻辑是对的,但存在两个小问题:
- 变量名错误:
colsA = imgB.shape[0]里的imgB未定义,应该改为imgA - 手动循环效率低:Python循环处理像素远不如Numpy向量运算高效,大图像下差距会非常明显
内容的提问来源于stack exchange,提问作者Juan De Dios Miranda Franco
相关产品推荐
相关产品推荐

