This is a small post to show you an important difference in arithmetic operations in OpenCV and Numpy.
As an example, I take addition as operation.
As you know, images are loaded in OpenCV as "uint8" data. ie 8 bit data. So all the values in the matrix (or image) lie between 0 and 255.
So, even if you add or subtract two numbers, result lies between 0 and 255.
For eg, 255+1 ≠ 256 for 'uint8' data
So what is the answer in above case?
There lies the difference between OpenCV and Numpy. I will demonstrate it using Python terminal.
First create two datas of uint8 type, x = 255, y = 1
>>> x = np.array(,np.uint8) >>> y = np.array(,np.uint8)
Now we add x and y using OpenCV function, cv2.add
>>> cv2.add(x,y) array([], dtype=uint8)
ie 255+1 = 255 in OpenCV. It is because arithmetic operations in OpenCV are clipped or saturated operations. ie , they clip values wrt data type. If uint8, it clips all values 0 and 255. So if you add two gray pixels, a = 127 and b = 129, you get c = 255, a white pixel, which is OK and necessary in Image Processing
Now we add x and y in Numpy.
>>> x+y array(, dtype=uint8)
ie 255+1 = 0 in Numpy. It is because Numpy performs a modulo-256 operation. So 256 % 256 = 0.
But what it implies in image processing? If you add a value of '1' to a white pixel, you get a pure black pixel, which is completely unfavorable in image processing. If you add a = 127 and b = 128, again you get a black pixel.
So better stick to OpenCV functions for image arithmetic operations.