OpenCV合并图像中加权和与覆盖的讲解与实战(附Python源码)

简介: OpenCV合并图像中加权和与覆盖的讲解与实战(附Python源码)

需要源码请点赞关注收藏后评论区留言私信~~~

在处理图像时经常会遇到将两幅图像合并成一幅图像,合并图像也分两种情况:两幅图像融合在一起;每幅图像提供一部分内容,将这些内容拼接成一幅图像,OpenCV分别用加权和与覆盖两种方式来满足上述需求

一、加权和

多次曝光技术是指在一幅胶片上拍摄几个影响,最后冲印出的相片同时具有多个影响的信息

OpenCV通过计算加权和的方式,按照不同的权重取两幅图像的像素之和,最后组成新图像。加权和不会像纯加法运算那样让图像丢失信息,而是在尽量保留原有图像信息的基础上把两幅图像融合到一起。

OpenCV通过addWeighter方法计算图像的加权和 语法如下

dst=cv2.addWeighted(src1,alpha,src2,beat,gamma)

alpha 第一幅图像的权重

beta 第二幅图像的权重

gamma 在和结果上添加的标量,该值越大,结果图像越亮,相反则越暗

下面利用加权和的方式实现多次曝光效果

代码如下

import cv2
sun = cv2.imread("sunset.jpg")  # 日落原始图像
beach = cv2.imread("beach.jpg")  # 沙滩原始图像
rows, colmns, channel = sun.shape  # 日落图像的行数、列数和通道数
beach = cv2.resize(beach, (colmns, rows))  # 沙滩图像缩放成日落图像大小
img = cv2.addWeighted(sun, 0.6, beach, 0.6, 0)  # 计算两幅图像加权和
cv2.imshow("sun", sun)  # 展示日落图像
cv2.imshow("beach", beach)  # 展示沙滩图像
cv2.imshow("addWeighted", img)  # 展示加权和图像
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

二、覆盖

覆盖图像就是直接把前景图像显示在背景图像中,前景图像挡住背景图像,覆盖之后背景图像会丢失信息,不会出现加权和那样多次曝光的效果

Opencv没有提供覆盖操作的方法,开发者可以直接用修改图像像素值的方式实现图像的覆盖,拼接效果,从A图像中取像素值,直接赋值给B图像的像素

下面演示将小猫图像覆盖到沙滩图像上 可见效果类似于抠图软件

如果前景图是四通道图像,就不能使用上面的方法,下面通过实例演示四通道如何操作

我们拼接一个禁止吸烟图像,它是四通道图像,将禁止图像覆盖到吸烟图像上时要注意:不要把前景图像的透明像素覆盖到背景图像上,覆盖之前要遍历前景图像中的每一个像素,如果alpha值位0,表示该像素是透明像素,就要停止操作该像素。

代码如下

import cv2
# 拼接图像方法
def overlay_img(img, img_over, img_over_x, img_over_y):
    img_h, img_w, img_p = img.shape  # 背景图像宽、高、通道数
    img_over_h, img_over_w, img_over_c = img_over.shape  # 覆盖图像宽、高、通道数
    if img_over_c <= 3:  # 通道数小于等于3
        img_over = cv2.cvtColor(img_over, cv2.COLOR_BGR2BGRA)  # 转换成4通道图像
    for w in range(0, img_over_w):  # 遍历列
        for h in range(0, img_over_h):  # 遍历行
            if img_over[h, w, 3] != 0:  # 如果不是全透明的像素
                for c in range(0, 3):  # 遍历三个通道
                    x = img_over_x + w  # 覆盖像素的横坐标
                    y = img_over_y + h  # 覆盖像素的纵坐标
                    if x >= img_w or y >= img_h:  # 如果坐标超出最大宽高
                        break
                    img[y, x, c] = img_over[h, w, c]  # 覆盖像素
    return img
smoking = cv2.imread("smoking.png", cv2.IMREAD_UNCHANGED)  # 吸烟图像,保持原格式
no_img = cv2.imread("no.png", cv2.IMREAD_UNCHANGED)  # 禁止图像,保持原格式
cv2.imshow("no", no_img)  # 展示禁止图像
cv2.imshow("smoking", smoking)  # 展示禁止图像
img = overlay_img(smoking, no_img, 95, 90)  # 将禁止图像覆盖到吸烟图像之上
cv2.imshow("no smoking", img)  # 展示覆盖结果
cv2.waitKey()  # 按下任何键盘按键后
cv2.destroyAllWindows()  # 释放所有窗体

创作不易 觉得有帮助请点赞关注收藏~~~

相关文章
|
1月前
|
机器学习/深度学习 监控 算法
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
51 3
|
14天前
|
机器学习/深度学习 TensorFlow 算法框架/工具
利用Python和TensorFlow构建简单神经网络进行图像分类
利用Python和TensorFlow构建简单神经网络进行图像分类
39 3
|
1月前
|
缓存 并行计算 Ubuntu
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
本文是关于在Jetson AGX Xavier上编译FFmpeg(3.4.1)和OpenCV(3.4.0)的详细教程,包括编译需求、步骤、测试和可能遇到的问题及其解决方案。还提供了Jetson AGX Xavier编译CUDA版本的OpenCV 4.5.0的相关信息。
69 4
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
|
1月前
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
149 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
1月前
|
存储 JSON API
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
47 7
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)
|
28天前
|
Ubuntu 编译器 计算机视觉
Ubuntu系统编译OpenCV4.8源码
【10月更文挑战第17天】只要三步即可搞定,第一步是下载指定版本的源码包;第二步是安装OpenCV4.8编译需要的编译器与第三方库支持;第三步就是编译OpenCV源码包生成安装文件并安装。
|
1月前
|
JSON API 数据格式
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
52 0
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
|
1月前
|
自然语言处理 Java 编译器
为什么要看 Python 源码?它的结构长什么样子?
为什么要看 Python 源码?它的结构长什么样子?
26 2
|
1月前
|
Python
源码解密 Python 的 Event
源码解密 Python 的 Event
40 1
|
1月前
|
数据采集 前端开发 Python
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
Python pygame 实现游戏 彩色 五子棋 详细注释 附源码 单机版
72 0