Сделайте 8 изображений, используя каждый бит каждого пикселя изображения - PullRequest
2 голосов
/ 17 марта 2019

, поэтому у меня есть изображение в оттенках серого 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]]

Вы можете увидеть изображение здесь

Я думаю, что мне удалось сделать изображение с самым значительным битом, который я сделал так:

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

Что делает это изображение

Но у меня возникают проблемы при создании других изображений, поэтому я действительно буду благодарен за любую помощь.

Да, и если кто-то может объяснить это также, я хотел бы также сделать изображение только с 4 наиболее значимыми битами из x_img_g

1 Ответ

1 голос
/ 17 марта 2019

Расширение до 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] как изображением с самым старшим битом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...