使用图像每个像素的每一位制作8张图像

时间:2019-03-17 13:02:30

标签: python-3.x image numpy opencv matrix

所以我有一个512x512灰度图像,我想使用图像像素的每一位来制作8个不同的黑白图像,每个图像都有各自的位。为此,我使用了opencv库。 灰度图像x_img_g由矩阵表示:

[[162 162 162 ... 170 155 128]
[162 162 162 ... 170 155 128]
[162 162 162 ... 170 155 128]
...
[ 43  43  50 ... 104 100  98]
[ 44  44  55 ... 104 105 108]
[ 44  44  55 ... 104 105 108]]

You can see the image here

我认为我设法用这样的方式制作出了最高位的图像:

def makeImages():
    y = x_img_g>128
    cv2.imshow('BW',np.uint8(y*255))
    cv2.waitKey(0)
    cv2.destroyAllWindows()

Which makes this image

但是我在制作其他图像时遇到了麻烦,所以我真的很感激任何帮助。

哦,如果有人也可以解释这一点,我也想制作一张仅包含x_img_g的4个最高有效位的图像

1 个答案:

答案 0 :(得分:1)

扩展到3D,并在其末尾添加新轴,并沿同一方向使用np.unpackbits-

np.unpackbits(a[...,None], axis=-1) # a is input array

样品运行-

In [145]: np.random.seed(0)

In [146]: a = np.random.randint(0,256,(2,3),dtype=np.uint8)

In [147]: a
Out[147]: 
array([[172,  10, 127],
       [140,  47, 170]], dtype=uint8)

In [149]: out = np.unpackbits(a[...,None], axis=-1)

In [150]: out
Out[150]: 
array([[[1, 0, 1, 0, 1, 1, 0, 0],
        [0, 0, 0, 0, 1, 0, 1, 0],
        [0, 1, 1, 1, 1, 1, 1, 1]],

       [[1, 0, 0, 0, 1, 1, 0, 0],
        [0, 0, 1, 0, 1, 1, 1, 1],
        [1, 0, 1, 0, 1, 0, 1, 0]]], dtype=uint8)

因此,out[...,0]将是具有最低有效位的二进制图像,依此类推,直到out[...,7]是具有最高有效位的二进制图像。

或者,换句话说,我们可以沿第一个轴使用新轴延伸-

out = np.unpackbits(a[None], axis=0)

因此,out[0]将是具有最低有效位的二进制图像,依此类推,直到out[7]是具有最高有效位的二进制图像。