什么是图像加权和?
所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为:
dst = saturate(src1 × 𝛼 + src2 × 𝛽 + 𝛾)
式中,saturate()表示取饱和值(最大值)。图像进行加权和计算时,要求 src1 和 src2 必须大小、类型相同,但是对具体是什么类型和通道没有特殊限制。它们可以是任意数据类型,也可以有任意数量的通道(灰度图像或者彩色图像),只要二者相同即可。
OpenCV 中提供了函数 cv2.addWeighted(),用来实现图像的加权和(混合、融合),该函数的语法格式为:
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()的使用。
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”的混合值。
运行效果:
[[113 113 113 113][113 113 113 113][113 113 113 113]]
对数组的操作没有直观的效果,下面我们拿两张图片就行加权和的操作看看效果
示例原图
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
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 函数是什么效果呢,我们来看看
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()
运行效果:
从效果看明显 图像加权和的效果好多了