2017-10-17 208 views
0

我编写了一个脚本来去除七个最低有效位,并且只保留灰度8位图像的每个像素的MBS。要做到这一点,我用0b10000000掩盖每个像素,但没有得到预期的输出。如何使用cv2去除七个灰度图像的低位

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

输出从我的代码: enter image description here

期望的结果: enter image description here

+1

你能描述一下这个问题吗?用0b10000000掩盖每个像素将导致有两个可能的像素值,0b10000000 = 128(中间灰色)或0(黑色)。您显示的“正确结果”似乎有两个值,255(白色)和0(黑色)。 –

+1

COLOR_BGR2GRAY不是imread的有效模式。从[正确模式]开始阅读图像https://docs.opencv.org/3.3.0/d4/da8/group__imgcodecs.html#gga61d9b0126a3e57d9277ac48327799c80af660544735200cbe942eea09232eb822 – MFisherKDX

+0

请将您获得的图像添加到代码中。一个问题应该包括当前的行为和期望的行为。 – klutt

回答

1
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) ,所以使用阈值功能。

2

所以你基本上想要的都值:

  • 大于127 (128 = 0b1000000 to 255 = 0b11111111)是255,
  • 低于或等于127 (0 = 0b00000000 to 127 = 0b01111111)为0

可以避开二进制AND &,并简单地使用threshold功能:

_, result = cv2.threshold(result, 127, 255, cv2.THRESH_BINARY)