OpenCV是一个广泛应用于计算机视觉和图像处理领域的开源库,它提供了许多功能强大的图像处理算法和工具。在OpenCV中,图像加法是一种常见的操作,用于将两个图像逐像素相加,生成一个新的图像。本文将介绍OpenCV实现图像加法的原理、注意事项以及其应用方面。
图像加法的原理很简单:对于给定的两个输入图像,假设为image1和image2,它们对应的像素为p1和p2。那么加法操作将每个像素的对应值相加,并将结果作为输出图像的像素值。即,输出图像中每个像素的值p等于p1和p2之和。
实现图像加法时,需要注意以下几个方面:
图像大小:在进行图像加法之前,需要确保两个输入图像的大小相同。如果两个图像的尺寸不同,可以使用resize函数将它们调整为相同的大小。这样可以避免维度不匹配导致的错误。
数据类型:在进行图像加法时,需要确保输入图像和输出图像具有相同的数据类型。通常情况下,图像存储为8位无符号整数(uint8)类型,像素值范围为0到255。因此,加法操作的结果可能会导致像素值超过该范围。为了避免溢出错误,可以将输出图像的数据类型设置为更高精度的类型,例如16位无符号整数(uint16)或浮点数(float)。
饱和度处理:当进行图像加法时,如果像素值超过了像素值范围(0-255),默认情况下OpenCV将使用饱和度处理来处理超出范围的像素值。即,任何大于255的像素值都会被截断为255,任何小于0的像素值都会被截断为0。这样可以确保图像的像素值始终在合理的范围内。
归一化处理:在某些情况下,为了得到更好的结果,可能需要对输入图像进行归一化处理。例如,当两个输入图像的像素值范围不同或者像素值分布不均匀时,通过对图像进行归一化处理,可以将它们调整到相似的范围内,从而更好地进行图像加法操作。
像素值溢出:尽管OpenCV在加法操作中使用了饱和度处理,但在某些情况下,仍然可能出现像素值溢出的问题。为了避免这种情况,可以对结果图像进行像素值裁剪,将超出范围的像素值设置为最大或最小值。
图像加法在图像处理中具有广泛的应用。它可以用于合成不同曝光或亮度条件下的图像,调整图像的对比度或亮度,以及实现图像融合、背景减除等操作。通过合理地选择图像加法操作的参数和处理步骤,并注意上述注意事项,可以获得满足需求的图像加法结果。
总之,图像加法是OpenCV中常用的图像处理操作之一。通过对两个输入图像进行逐像素相加,可以生成一个新的图像。在实现图像加法时,需要注意图像大小、数据类型,以及饱和度处理、归一化处理和像素值溢出等问题。这些注意事项的合理应用可以帮助我们获得更好的图像加法结果,并在图像处理领域中发挥更大的作用。
算数操作
学习目标
了解图像的加法
图像的加法
你可以使用OpenCV的 cv.add() 函数把两幅图像相加,
或者可以简单地通过 numpy 操作添加两个图像,
如 res= img1 + img2。
两个图像应该具有相同的大小和类型,或者第二个图像可以是标量值。
注意:OpenCV加法和Numpy加法之间存在差异。OpenCV的加法是饱和操作,而Numpy添加是模运算。
原理
代码实现
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei']
# 读取图像
img1 = cv.imread('lena.png')
img2 = cv.imread('lena_saved.png')
# 加法操作
img3 = cv.add(img1, img2) # 使用 OpenCV 的加法
img4 = img1 + img2 # 使用 NumPy 的加法(直接相加)
# 图像显示
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(5, 4), dpi=100)
'''
参数说明:
nrows=1:指定了子图区域的行数为 1,表示在图像区域中只有一行。
ncols=2:指定了子图区域的列数为 2,表示在图像区域中有两列。
figsize=(10, 8):指定图像区域的大小为宽度 10 英寸,高度 8 英寸。这里的单位是英寸。
dpi=100:指定图像区域的分辨率为 100,即每英寸的像素数。
该函数返回两个值:
fig:表示整个图像区域,可以通过这个对象对图像进行整体的设置。
axes:表示一个由实际子图对象组成的 NumPy 数组。可以通过 axes 对象对每个子图进行单独的设置和操作。
这个函数的作用是创建一个包含 1 行、2 列的子图区域,用于显示两个子图。通过 fig 和 axes 可以进一步对整个图像区域和子图进行设置和操作。'''
axes[0].imshow(img3[:, :, ::-1]) # 将 BGR 转换为 RGB 进行显示
axes[0].set_title("cv中的加法")
axes[1].imshow(img4[:, :, ::-1]) # 将 BGR 转换为 RGB 进行显示
axes[1].set_title("直接相加")
plt.show()
cv.imwrite(r'E:\All_in\opencv\img3.png',img3)
遇到的报错
解决办法
加入这段代码
from pylab import mpl
mpl.rcParams[‘font.sans-serif’] = [‘SimHei’]
运行结果展示
总结
使用cv.add() 要比np.add() 【直接相加】 方法 效果要好