2017-10-17 4 views
0

グレースケールの8ビットイメージの各ピクセルのMBSのみを保持するスクリプトを作成しました。これを行うには、各ピクセルを0b10000000でマスクしますが、期待される出力は得られません。cv2を使用してグレースケールイメージの7つの低ビットを削除する方法

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

望ましい結果: あなたは、バイナリイメージ(0、255)であるたかった何enter image description here

+1

問題を説明できますか?各ピクセルを0b10000000でマスキングすると、0b10000000 = 128(中間グレー)または0(黒)の2つの可能なピクセル値が得られます。表示される「正しい結果」には、255(白)と0(黒)の2つの値が表示されます。 –

+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() 

したがって、しきい値関数を使用してください。

2

ですから、基本的にすべての値をしたい:あなたがバイナリを避けることができます0

ことは255、

  • 低いか等しい127 (0 = 0b00000000 to 127 = 0b01111111)ことが127 (128 = 0b1000000 to 255 = 0b11111111)より

    • 大きいですAND &を使用し、単にthreshold関数を使用します。

      _, result = cv2.threshold(result, 127, 255, cv2.THRESH_BINARY) 
      
  • 関連する問題