OpenCV轻松入门:面向Python
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 图像加权和

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

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+亮度调节量”。

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

根据题目要求,编写程序如下:

        1. import cv2
        2. import numpy as np
        3. img1=np.ones((3,4), dtype=np.uint8)*100
        4. img2=np.ones((3,4), dtype=np.uint8)*10
        5. gamma=3
        6. img3=cv2.addWeighted(img1,0.6, img2,5, gamma)
        7. 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]]

例3.5】使用函数cv2.addWeighted()对两幅图像进行加权混合,观察处理结果。

根据题目要求,编写程序如下:

        import cv2
        a=cv2.imread("boat.bmp")
        b=cv2.imread("lena.bmp")
        result=cv2.addWeighted(a,0.6, b,0.4,0)
        cv2.imshow("boat", a)
        cv2.imshow("lena", b)
        cv2.imshow("result", result)
        cv2.waitKey()
        cv2.destroyAllWindows()

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

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

● 左图是原始图像boat。

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

● 右图是图像boat和图像lena加权混合后的结果图像。

图3-2 【例3.5】程序的运行结果

例3.6】使用函数cv2.addWeighted()将一幅图像的ROI混合在另外一幅图像内。

根据题目要求,编写程序如下:

        import cv2
        lena=cv2.imread("lena512.bmp", cv2.IMREAD_UNCHANGED)
        dollar=cv2.imread("dollar.bmp", cv2.IMREAD_UNCHANGED)
        cv2.imshow("lena", lena)
        cv2.imshow("dollar", dollar)
        face1=lena[220:400,250:350]
        face2=dollar[160:340,200:300]
        add=cv2.addWeighted(face1,0.6, face2,0.4,0)
        dollar[160:340,200:300]=add
        cv2.imshow("result", dollar)
        cv2.waitKey()
        cv2.destroyAllWindows()

在本例中,face1是图像lena中的面部部分,face2是图像dollar中的面部部分。通过函数cv2.addWeighted()将lena图像内的面部face1与dollar图像内的面部face2进行了混合计算。

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

● 左图是原始图像lena。

● 中间的图是原始图像dollar。

● 右图是图像lena的面部与图像dollar的面部加权混合得到的图像。

图3-3 图像加权混合结果