Hi,

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([255],np.uint8) >>> y = np.array([1],np.uint8)

__OpenCV__Now we add x and y using OpenCV function,

**cv2.add**

>>> cv2.add(x,y) array([[255]], 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

__Numpy__Now we add x and y in Numpy.

>>> x+y array([0], 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.**

Regards,

ARK

## No comments:

## Post a Comment