Python+OpenCV系列:图像的运算

server/2024/12/17 23:48:35/

文章目录

      • Python+OpenCV系列:图像的加权和、覆盖
        • 1. 图像加权和(加权融合)
        • 2. 图像覆盖(区域叠加)
        • 3. 应用场景
        • 4. 总结

Python+OpenCV系列:图像的加权和、覆盖

在图像处理中,图像的加权和与覆盖是两种非常常见的操作,广泛应用于图像融合、图像叠加、目标检测、特效制作等场景。Python 和 OpenCV 提供了简单而高效的工具来进行这些操作。在本文中,我们将介绍如何通过加权和操作将两幅图像融合,并通过图像覆盖技术将一幅图像叠加到另一幅图像的特定区域。


1. 图像加权和(加权融合)

图像加权和是将两幅图像按给定的权重进行融合的一种方式。OpenCV 提供了 cv2.addWeighted() 函数来实现这一操作。该函数的基本用法是将两幅图像的像素值按指定比例进行加权组合。

函数原型:

python">cv2.addWeighted(src1, alpha, src2, beta, gamma)
  • src1src2:输入图像。
  • alphabeta:分别为两幅图像的权重。
  • gamma:常数值,用于调整亮度。

通过调整 alphabeta,可以控制两幅图像的混合程度,而 gamma 则用于调整整体的亮度。

示例代码:

python">import cv2# 读取两张图像
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')# 调整大小,使两张图像大小一致
img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))# 图像加权和
alpha = 0.7
beta = 0.3
gamma = 0
result = cv2.addWeighted(img1, alpha, img2, beta, gamma)# 显示结果
cv2.imshow('Weighted Sum', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这段代码中,我们通过 cv2.addWeighted() 将两张图像按照指定的比例(alpha=0.7beta=0.3)进行加权融合。融合后的结果显示了两张图像的组合。


2. 图像覆盖(区域叠加)

图像覆盖是指将一幅图像嵌入到另一幅图像的特定区域,通常用于图像合成、标志叠加等。使用 OpenCV,通常通过按位运算和区域裁剪来实现这一功能。

思路:

  1. 将目标图像(如一个 logo)裁剪成适当的尺寸。
  2. 在源图像中选择一个区域,将裁剪后的图像覆盖在该区域。
  3. 使用按位运算(如 cv2.bitwise_and())来实现图像的结合。

示例代码:

python">import cv2
import numpy as np# 读取源图像和覆盖图像
background = cv2.imread('background.jpg')
logo = cv2.imread('logo.png')# 获取 logo 的大小
rows, cols, _ = logo.shape# 在背景图像中选择区域
roi = background[0:rows, 0:cols]# 创建 logo 图像的掩模
logo_gray = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)
_, mask = cv2.threshold(logo_gray, 1, 255, cv2.THRESH_BINARY)# 按位与操作,提取背景区域
background_region = cv2.bitwise_and(roi, roi, mask=cv2.bitwise_not(mask))# 按位与操作,提取 logo 区域
logo_region = cv2.bitwise_and(logo, logo, mask=mask)# 将 logo 区域与背景区域合成
result = cv2.add(background_region, logo_region)# 将合成结果覆盖到背景图
background[0:rows, 0:cols] = result# 显示结果
cv2.imshow('Image with Logo', background)
cv2.waitKey(0)
cv2.destroyAllWindows()

在此示例中,我们通过按位运算提取背景图和 logo 图像的相应区域,并将 logo 覆盖到背景图上。使用 cv2.bitwise_and() 对两幅图像的特定区域进行合成,确保 logo 区域不被背景遮挡。


3. 应用场景
  • 图像加权和

    • 图像融合:将多张图像按权重融合,用于全景图拼接、图像增强等。
    • 视频合成:将多种视频元素按一定权重叠加,生成特效。
  • 图像覆盖

    • 标志叠加:将透明的 logo 或水印叠加到图像上。
    • 图像合成:将多个图像合成成一幅新图像,例如在场景中叠加物体。

4. 总结

图像的加权和与覆盖操作是图像处理中常见的基本方法,广泛应用于图像融合、合成和特效制作中。通过 OpenCV 提供的 cv2.addWeighted() 函数和按位运算,用户可以方便地进行图像加权合成和图像区域覆盖。掌握这些方法,可以有效提升图像处理的灵活性和创意性,应用于各类项目中。


http://www.ppmy.cn/server/151029.html

相关文章

Lumos学习王佩丰Excel第二十一讲:经典Excel动态图表实现原理

一、动态图表实现原理 1、理解图表中的数据系列 在Excel图表中,系列指的是图表中的数据集合,它通常代表着一个数据源。每个系列都可以包含多个数据点,这些数据点在图表中以特定的形式展现,如柱状图中的柱子,折线图中…

《网络安全编程基础》之Socket编程

我的代码 server.c // server.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include <Winsock2.h> #pragma comment(lib,"ws2_32.lib") //添加静态链接库文件 void main(int argc,char* argv[]) {WSADATA …

Scala特色功能点

这里写目录标题 引言1. 函数作为一等公民2. 不需要分号3. 模式匹配4. 不可变性5. 伴生对象和伴生类6. 隐式参数和隐式转换7. 高阶函数8. Case 类9. for-comprehensions10. 类型推断11. 结构化并发12. 选项类型13. 伴生对象和伴生类14. 结构类型15. 隐式转换16. 组合模式17. 反模…

Nginx WebDAV扩展模块安装与配置完全指南

Nginx WebDAV扩展模块安装与配置完全指南 nginx-dav-ext-module nginx WebDAV PROPFIND,OPTIONS,LOCK,UNLOCK support [这里是图片001] 项目地址: https://gitcode.com/gh_mirrors/ng/nginx-dav-ext-module 项目基础介绍 Nginx WebDAV扩展模块(nginx-dav-ext-module)是由a…

【开发日记】记一次使用uniapp实现音视频通话打包的问题

问题描述 在开发过程中使用真机调试&#xff0c;音视频通话都是没有问题的。 问题出在打包成apk后却无法获取音视频流数据了&#xff0c;提示的是摄像头获取错误。 问题排查 之前在调试的时候用的都是uniapp官方的标准基座&#xff0c;所以此时manifest.json文件中的模块配…

Unity中Pico实现透视

1.参照Pico官方【透视 | PICO 开发者平台】文档设置。 2.额外的需要将主相机的post processing禁用。

Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 预览

文章目录 一、简介二、下载 QtPdfium三、加载 QtPdfium 动态库四、Demo 使用 关于QT Widget 其它文章请点击这里: QT Widget 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF&#xff08;二&#xff09;使用 QtPdfium库实现…

【从零开始入门unity游戏开发之——C#篇04】栈(Stack)和堆(Heap),值类型和引用类型,以及特殊的引用类型string

文章目录 知识回顾一、栈&#xff08;Stack&#xff09;和堆&#xff08;Heap&#xff09;1、什么是栈和堆2、为什么要分栈和堆3、栈和堆的区别栈堆 4、总结 二、值类型和引用类型1、那么值类型和引用类型到底有什么区别呢&#xff1f;值类型引用类型 2、总结 三、特殊的引用类…