【OpenCV-Numpy】 Python-OpenCV中的饱和运算和Numpy中的模运算(不饱和运算)

一、前言

在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]]

你可能感兴趣的:(OpenCV,opencv,numpy,python)