opencv -10 基础运算之 图像加权和(图像融合&图像修复&视频合成)

什么是图像加权和?

所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为:

python 复制代码
dst = saturate(src1 × 𝛼 + src2 × 𝛽 + 𝛾)

式中,saturate()表示取饱和值(最大值)。图像进行加权和计算时,要求 src1 和 src2 必须大小、类型相同,但是对具体是什么类型和通道没有特殊限制。它们可以是任意数据类型,也可以有任意数量的通道(灰度图像或者彩色图像),只要二者相同即可。

OpenCV 中提供了函数 cv2.addWeighted(),用来实现图像的加权和(混合、融合),该函数的语法格式为:

python 复制代码
dst=cv2.addWeighted(src1, alpha, src2, beta, gamma)

其中,参数 alpha 和 beta 是 src1 和 src2 所对应的系数,它们的和可以等于 1,也可以不等于 1。

该函数实现的功能是 dst = src1×alpha + src2×beta + gamma。需要注意,式中参数 gamma 的值可以是 0,但是该参数是必选参数,不能省略。可以将上式理解为"结果图像=图像 1×系数 1+图像 2×系数 2+亮度调节量"

应用场景

以下是一些常见的应用场景,可以使用图像加权:

**图像融合:**将两张图像按照一定权重进行加权融合,可以实现图像混合、渐变过渡和图像叠加效果。这在图像编辑、艺术设计和特效制作中常用于创建创意效果和过渡效果。

**图像修复:**在图像修复和恢复任务中,可以使用图像加权来合并原始图像和修复图像,以实现缺失区域的修复。通过适当的权重调整,可以使修复区域与周围图像保持平滑过渡,以获得更自然的修复结果。

**图像混合:**图像加权可用于将多张图像进行混合,以实现多重曝光效果、平均图像、透明效果和图像融合等。这在摄影、艺术和图像处理中常用于创造独特的视觉效果和风格。

**视频合成:**在视频编辑和合成中,图像加权可以用于将多个视频帧进行混合,以实现过渡效果、特殊效果和图像合成。通过调整权重,可以控制视频帧之间的平滑过渡和融合效果。

图像加噪处理:通过将原始图像与带有噪声的图像进行加权,可以实现图像降噪和去噪效果。通过调整权重,可以控制噪声的减少程度,从而改善图像的质量和清晰度。

这些只是图像加权的一些常见应用场景,实际上,图像加权在图像处理、计算机视觉和图像合成等领域中具有广泛的应用。通过调整权重和选择合适的图像,可以实现多种创造性和实用的效果。

使用数组演示函数 cv2.addWeighted()的使用。

python 复制代码
import numpy as np
import cv2
img1=np.ones((3,4),dtype=np.uint8)*100
img2=np.ones((3,4),dtype=np.uint8)*10
gamma=3
img3=cv2.addWeighted(img1,0.6,img2,5,gamma)
print(img3)

本例中的各行代码功能如下。

 第 3 行生成一个 3×4 大小的、元素数值都是 100 的二维数组,对应一个灰度图像 img1。

 第 4 行生成一个 3×4 大小的、元素数值都是 10 的二维数组,对应一个灰度图像 img2。

 第 5 行将调节亮度参数 gamma 的值设置为 3。

 第 6 行计算"img1×0.6+img2×5+3"的混合值。

运行效果:

python 复制代码
[[113 113 113 113]
 [113 113 113 113]
 [113 113 113 113]]

对数组的操作没有直观的效果,下面我们拿两张图片就行加权和的操作看看效果

示例原图

python 复制代码
import cv2
a=cv2.imread("hai.png")
b=cv2.imread("lena.png")
result=cv2.addWeighted(a,0.6,b,0.4,0)
cv2.imshow("dahai",a)
cv2.imshow("lena",b)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()

发现报错:

原因是两张图片的大小不一致导致,因为操作加权和 前面有讲到 大小必须一致,我们重新对图片大小设置一下,resize

python 复制代码
import cv2
a=cv2.imread("hai.png")

# 重新设置图像大小
resized_image = cv2.resize(a, (512, 512))

print(resized_image.shape)
b=cv2.imread("lena.png")
print(b.shape)
result=cv2.addWeighted(resized_image,0.6,b,0.4,0)
cv2.imshow("dahai",resized_image)
cv2.imshow("lena",b)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()

运行效果:

本程序使用 cv2.addWeighted()函数,对图像 hai和图像 lena 分别按照 0.6 和 0.4 的权重进

行混合。

运行程序,得到如图 3-2 所示的结果,其中:

 左图是原始图像 hai。

 中间的图是原始图像 lena。

 右图是图像 hai 和图像 lena 加权混合后的结果图像。

反思:如果我们不使用图像加权和,而是使用add 函数是什么效果呢,我们来看看

python 复制代码
import cv2
a=cv2.imread("hai.png")

# 重新设置图像大小
resized_image = cv2.resize(a, (512, 512))

print(resized_image.shape)
b=cv2.imread("lena.png")
print(b.shape)
result=cv2.add(resized_image,b)
cv2.imshow("dahai",resized_image)
cv2.imshow("lena",b)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()

运行效果:

从效果看明显 图像加权和的效果好多了

相关推荐
لا معنى له2 分钟前
残差网络论文学习笔记:Deep Residual Learning for Image Recognition全文翻译
网络·人工智能·笔记·深度学习·学习·机器学习
菜只因C24 分钟前
深度学习:从技术本质到未来图景的全面解析
人工智能·深度学习
工业机器视觉设计和实现29 分钟前
lenet改vgg训练cifar10突破71分
人工智能·机器学习
咚咚王者29 分钟前
人工智能之数据分析 Matplotlib:第四章 图形类型
人工智能·数据分析·matplotlib
TTGGGFF1 小时前
人工智能:用Gemini 3一键生成3D粒子电子手部映射应用
人工智能·3d·交互
LitchiCheng1 小时前
Mujoco 基础:获取模型中所有 body 的 name, id 以及位姿
人工智能·python
Allen_LVyingbo1 小时前
面向医学影像检测的深度学习模型参数分析与优化策略研究
人工智能·深度学习
CareyWYR1 小时前
每周AI论文速递(251124-251128)
人工智能
却道天凉_好个秋1 小时前
OpenCV(三十三):什么是轮廓?
人工智能·opencv·计算机视觉
xieyan08111 小时前
选股中的财务指标运用_ROE_PE_PB...
大数据·人工智能