numpy如何加法截断/饱和加运算

本文介绍了在使用numpy进行非饱和运算时的具体表现,如uint8类型的溢出取模现象,并对比了OpenCV中更为直观的加法运算方式,使结果更贴近实际场景。

使用numpy的+或者add 在溢出后会进行取模
例如unit8时,255+97=96
这就是非饱和运算
使用openCV的加法 可以使255+97=255
更符合我们的实际情况

### 图像加法运算的实现方法 在 OpenCV 中,`cv2.add()` 是一种常用的图像加法运算函数。该函数可以将两幅相同尺寸和类型的图像相,并返回结果图像[^1]。 #### 函数定义 `cv2.add(src1, src2[, dst[, mask]]) → dst` - `src1`: 输入的第一张图像。 - `src2`: 输入的第二张图像。 - `dst`: 输出的结果图像,默认与输入图像具有相同的类型和尺寸。 - `mask`: 可选参数,指定操作区域的掩码。 以下是具体实现的一个例子: ```python import cv2 import numpy as np # 读取两张图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 确保两张图像是相同尺寸 if img1.shape == img2.shape: # 使用 cv2.add 进行图像加法运算 result = cv2.add(img1, img2) # 显示结果图像 cv2.imshow('Result', result) cv2.waitKey(0) cv2.destroyAllWindows() else: print("Error: Images must have the same dimensions.") ``` 上述代码展示了如何载两张图像并执行加法运算。需要注意的是,只有当两张图像具有相同的尺寸和通道数时,才能成功调用 `cv2.add()`。 --- #### 饱和运算 vs 模运算 值得注意的是,OpenCV加法运算是基于 **饱和运算** (saturated operation),这意味着像素值不会超过数据类型的上限(例如对于 uint8 类型,最大值为 255)。如果计算结果超出范围,则会截断到边界值。相比之下,Numpy加法则采用 **模运算** (modulo operation),即溢出部分会被重新映射回有效范围内[^2]。 以下是对两种方式的对比示例: ```python import cv2 import numpy as np # 创建两个简单的数组 a = np.array([200], dtype=np.uint8) b = np.array([100], dtype=np.uint8) # OpenCV 加法 opencv_add = cv2.add(a, b) # 结果为 [255] # Numpy 加法 numpy_add = a + b # 结果为 [(200+100)%256=44] print(f"OpenCV Add Result: {opencv_add}") print(f"Numpy Add Result: {numpy_add}") ``` 通过运行此代码可以看出两者之间的差异。 --- #### 图像融合(加法) 除了基本的加法运算外,还可以使用 `cv2.addWeighted()` 来实现图像的线性组合或称为“图像融合”。其公式如下所示: \[ \text{result} = (\alpha \times \text{img1}) + (\beta \times \text{img2}) + \gamma \] 其中: - `\(\alpha\)` 和 `\(\beta\)` 是权重系数; - `\(\gamma\)` 是偏移量。 下面是具体的实现代码: ```python import cv2 import numpy as np # 读取两张图像 img1 = cv2.imread('moon.jpg') img2 = cv2.imread('sspu.png') # 调整图像大小使其一致 resized_img1 = cv2.resize(img1, (img2.shape[1], img2.shape[0])) # 应用加法 blended_image = cv2.addWeighted(resized_img1, 0.7, img2, 0.3, 0) # 展示结果 cv2.imshow('Blended Image', blended_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在此代码中,调整了图像大小以匹配维度,并设置了不同的权重来控制每张图像对最终结果的影响程度[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值