2017-08-22 6 views
0

シーン内で動きがあると仮定して、次の画像と前の画像との違いを追跡しようとしていました。 2つのjpg画像の間で対応するピクセル値の減算を適用し、結果のマトリックスの平均値を計算して、それがある閾値レベルを下回るか下回っているかどうかを確認することにしました。OpenCV image subtraction vs Numpy subtraction

減算は、cv2減算およびnp減算法によって行われました。私は結果にかなり大きな違いがあることに気づいた。何とかしてヒストグラムを伸ばし、結果の値を正規化したようですが、なぜですか?

イメージはcv2.open経由で読み込まれました。私はこの方法がチャンネルのBGR順序を使用することを知っていますが、何が起こったのか説明していません。読み込まれたイメージはnpy.uint値を持つnumpy nd.arrayです。 Python 3.7でSpyderを操作する

編集:cv2.imreadで引数0グレースケール

OpenCV subtraction result

Numpy subtraction result

#loading images 

img_cam0 = cv2.imread(r'C:\Users\Krzysztof\Desktop\1.jpg',0) 
img_cam1 = cv2.imread(r'C:\Users\Krzysztof\Desktop\2.jpg', 0) 
print('img0 type:',type(img_cam0), 'and shape:', img_cam0.shape) 
print('img1 type:',type(img_cam1),'and shape:', np.shape(img_cam1)) 
print('\n') 

#opencv subtraction 

cv2_subt = cv2.subtract(img_cam0,img_cam1) 
cv2_mean = cv2.mean(cv2_subt) 

print('open cv mean is:', cv2_mean) 
f.show_im(cv2_subt, 'cv2_subtr') 

#np subtraction and mean 

np_subtr = np.subtract(img_cam0, img_cam1) 
np_mean = np.mean(np_subtr) 

print('numpy mean is:', np_mean) 
f.show_im(np_subtr, 'np_subtr') 
+0

あなたが実際に画像がどのように見えるかcv2_subt-np_subtr見てみたいです。それは豆をこぼします。 –

+1

シンプル - 'cv2.subtract'は彩度を実行し、' np.subtract'はぼやけません(アンダーフローの結果が表示されます)。 –

答えて

6

にイメージをロードするように指示差は単純です - 飽和なし対飽和。

cv2.subtractは飽和を実行します。ドキュメントによれば:

dst(I) = saturate(src1(I) - src2(I))

numpy.subtractは普通の減算を行うので、結果(すなわち値がラップアラウンド)integer overflowの対象となっています。


飽和入力値vがターゲット・タイプの範囲外である場合、結果は単に入力の下位ビットを取ることによって形成されておらず、代わりに値がクリップされることを意味します。たとえば、次のターゲット・タイプがunsigned charsigned charunsigned short又はsigned shortとき

uchar a = saturate_cast<uchar>(-100); // a = 0 (UCHAR_MIN) 
short b = saturate_cast<short>(33333.33333); // b = 32767 (SHRT_MAX) 

このようなクリッピングが行われます。 32ビット整数の場合、クリッピングは行われません。


>>> import cv2 
>>> import numpy as np 

>>> a = np.arange(9, dtype=np.uint8).reshape(3,3) 
>>> a 
array([[0, 1, 2], 
     [3, 4, 5], 
     [6, 7, 8]], dtype=uint8) 
>>> b = np.full((3,3), 4, np.uint8) 
>>> b 
array([[4, 4, 4], 
     [4, 4, 4], 
     [4, 4, 4]], dtype=uint8) 

>>> np.subtract(b,a) 
array([[ 4, 3, 2], 
     [ 1, 0, 255], 
     [254, 253, 252]], dtype=uint8) 

>>> cv2.subtract(b,a) 
array([[4, 3, 2], 
     [1, 0, 0], 
     [0, 0, 0]], dtype=uint8)