程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【OpenCV-Numpy】 Python-OpenCV中的飽和運算和Numpy中的模運算(不飽和運算)

編輯:Python

一、前言

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


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved