画像の画素値は uint8 型で表されるため、演算結果が [0, 255] の範囲を超えた場合、オーバーフローが発生し、結果を正しく保持できません。
1 ~ 3番目はいずれもオーバーフローが発生する可能性があるため、3つ目だけが望んだ挙動を示したのはたまたまそうなっただけだと思います。
オーバーフローを確認するコード
python
1import numpy as np
2
3# オーバーフローが発生する例
4a = np.uint8([10])
5b = np.uint8([20])
6print(a - b) # [246]
7
8a = np.uint8([255])
9b = np.uint8([10])
10print(a + b) # 9
対策
演算を行う前に、uint8 からより大きい範囲の整数を保持できる型に astype() でキャストしてください。
python
1import numpy as np
2
3a = np.uint8([10])
4b = np.uint8([20])
5# 演算前にキャストする
6print(a.astype(int) - b.astype(int)) # [-10]
7
8a = np.uint8([255])
9b = np.uint8([10])
10# 演算前にキャストする
11print(a.astype(int) + b.astype(int)) # [265]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/04 11:24