2017-10-31 12 views
2

pixelの値を2枚の画像に入れたいと思います。2枚の画像の減算

out_img = cv2.imread(output_path) 
tar_img = cv2.imread(target_path) 
difference = out_img - tar_img 

しかし、私は望ましい結果を取得していないので、私はsubtractionは、特定のpixelを見て、働いていたか確認。

print out_img[0][0] #shows [254 254 254] 
print tar_img[0][0] #shows [255 255 255] 
print out_img[0][0] - tar_img[0][0] #this should show [-1 -1 -1], but shows [255 255 255] 

この原因は何ですか?

+0

opencvの減算方法では、飽和キャストを使用して、アンダーフローが発生する代わりに結果を0に切り捨てます。 – Micka

答えて

0

などunsigned int 8np.int8)。これは.astype()で行うことができます。

out_img = cv2.imread(output_path).astype(np.int8) 
tar_img = cv2.imread(target_path).astype(np.int8) 
difference = out_img - tar_img 

あなたが前に問題を取得した理由は、cv2.imread()datatypeunsigned int 8numpyarrayを返すということです。したがって、値を-1として試して保存すると、これは255にループします。

私たちは、シンプルな例でこれを証明することができます

>>> a 
array([1, 2, 3, 4], dtype=uint8) 
>>> a[0] = -1 
>>> a 
array([255, 2, 3, 4], dtype=uint8) 

をしかし、我々はsigned int datatypenp.int8)にaを変換する場合、我々は期待される方法でこれを行うことができます。うまくいけば

>>> a 
array([1, 2, 3, 4], dtype=uint8) 
>>> a = a.astype(np.int8) 
>>> a 
array([1, 2, 3, 4], dtype=int8) 
>>> a[0] = -1 
>>> a 
array([-1, 2, 3, 4], dtype=int8) 

これはあなたのためにいくつかのものをクリアします!

+0

に投票してください!ありがとうございました **:)** –

0

結果は正しいです。ピクセルは8ビットの符号なしの数値として格納されます。その範囲は0〜255です。 -1はこのタイプではサポートされていません。算術演算は範囲の先頭に再び折り返し、想定された符号ビットを溢れさせる。

あなたはほかと同様の効果があります:255 + 1 => 0あなたは負の数をサポートしていますdatatypeに読んimagesを、変換する必要があり

関連する問題