Как удалить семь младших бит изображения в градациях серого с помощью cv2

Я написал сценарий для удаления семи младших битов и сохранения MBS только для каждого пикселя 8-битного изображения в оттенках серого. Для этого я маскирую каждый пиксель 0b10000000, но не получаю ожидаемого результата.

import cv2
import numpy as np

imageSource = 'input.jpg'
original_img = cv2.imread(imageSource,cv2.COLOR_BGR2GRAY)
cv2.imshow( "original", original_img )
result = original_img & 0b10000000
cv2.imshow( "out", result )
cv2.imwrite('out.jpg',result)
cv2.waitKey(0)
cv2.destroyAllWindows()

Исходное изображение: https://i.stack.imgur.com/r597Y.png

Вывод из моего кода: введите здесь описание изображения

Желаемый результат: введите здесь описание изображения


person Kaihan    schedule 17.10.2017    source источник
comment
Не могли бы вы описать проблему? Маскирование каждого пикселя с помощью 0b10000000 приведет к двум возможным значениям пикселей: 0b10000000=128 (средне-серый) или 0 (черный). Правильный результат, который вы показываете, имеет два значения: 255 (белый) и 0 (черный).   -  person Paul Cornelius    schedule 18.10.2017
comment
COLOR_BGR2GRAY не является допустимым режимом для imread. Начните с чтения изображения с [правильным режимом]   -  person MFisherKDX    schedule 18.10.2017
comment
Пожалуйста, добавьте изображение, которое вы получаете с вашим кодом. Вопрос должен включать как текущее поведение, так и желаемое поведение.   -  person klutt    schedule 18.10.2017


Ответы (2)


Таким образом, вам в основном нужны все значения, которые:

  • больше 127 (128 = 0b1000000 to 255 = 0b11111111) будет 255,
  • меньше или равно 127 (0 = 0b00000000 to 127 = 0b01111111) равным 0.

Вы можете избежать двоичного И & и просто использовать функцию threshold:

_, result = cv2.threshold(result, 127, 255, cv2.THRESH_BINARY)
person Miki    schedule 18.10.2017

import cv2
import numpy as np

imageSource = 'input.png'
original_img = cv2.imread(imageSource, cv2.CV_LOAD_IMAGE_GRAYSCALE)
cv2.imshow("original", original_img)
result = original_img & 0b10000000
_, result = cv2.threshold(result, 1, 255, cv2.THRESH_BINARY)
cv2.imshow("out", result)
cv2.imwrite('out.jpg', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

То, что вам нужно, это двоичное изображение (0, 255), поэтому используйте пороговую функцию.

person Hao Li    schedule 18.10.2017