在OpenCV中的“圖像運算”官方指南文檔中,有這樣一個注意點
There is a difference between OpenCV addition and Numpy addition. OpenCV addition is a saturated operation while Numpy addition is a modulo operation.
OpenCV和Numpy的加法運算不同,OpenCV的加法運算是飽和運算,而Numpy的加法運算是模運算
想必大家都看到過類似sat(a+b)的表達式,其實這就是飽和運算;而模運算一般而言是直接用a+b來表示的。
飽和運算最大的特點是不講究溢出位,執行結果與底層關系不大;假設變量的類型是8位無符號整型,那麼最大數是255,如果在數學上相加的結果大於255,那麼飽和運算返回結果就是255。
模運算考慮溢出位,執行結果需要向計算機底層原理——二進制的方面思考;假設變量的類型是8位無符號整型,那麼最大數是255(對應二進制11111111),如果在數學上相加的結果大於255,那麼就會發生溢出,僅僅保留容器范圍內的二進制位。
為什麼np.add()的返回值是0?因為255+1=256,對應二進制位1[00000000],最前面多余的1屬於溢出位,去除後便是[00000000],對應十進制整數0。
import cv2 as cv
import numpy as np
a = np.array([[255]], dtype=np.uint8)
print(cv.add(a, 1))
print(np.add(a, 1))
# [[255]]
# [[0]]
The terminal input has been so