day6 - 使用图像运算进行图像美化

news2024/11/18 19:46:05

本期将了解图像的基础运算,包含算数运算和位运算等。我们所使用的图像处理技术其实都是靠一些简单的基础运算来完成的,例如加法运算、位运算等,这些简单运算是我们后续研究更复杂的图像处理的基础。

完成本期内容,你可以:

  • 了解算数运算、位运算的基本原理
  • 掌握算数运算、位运算的使用
  • 掌握位运算在图像处理中常见的使用场景

若要运行案例代码,你需要有:

  • 操作系统:Ubuntu 16 以上 或者 Windows10

  • 工具软件:VScode 或者其他源码编辑器

  • 硬件环境:无特殊要求

  • 核心库:python 3.6.13, opencv-contrib-python 3.4.11.39,opencv-python 3.4.2.16

点击下载源码


加法运算

加法运算

加运算就是两幅图像对应像素的灰度值或彩色分量进行相加。主要有两种用途,一种是消除图像的随机噪声,主要做是讲同一场景的图像进行相加后再取平均;另一种是用来做特效,把多幅图像叠加在一起,再进一步进行处理。

OpenCV中提供的加法运算的函数是cv2.add()。

函数原型: add_img = cv2.add(img1, img2);

add_img为运算后的图像。

参数描述如下:

参数描述
img1,img2需要进行运算的图片

加权和运算

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

OpenCV中提供的加权和运算的函数是cv2.addWeighted()。

函数原型: dst = cv2.addWeighted(src1, alpha, src2, beta, gamma, dst, dtype);

dst 为运算后的图像。

参数描述如下:

参数描述
src1表示进行加权操作的第一个图像对象,即输入图片1
alphadouble型,表示第一个图像的加权系数,即图片1的融合比例
src2表示进行加权操作的第二个图像对象,即输入图片2
betadouble型,表示第二个图像的加权系数,即图片2的融合比例。很多情况下,有关系 alpha+beta=1.0
gamma可选参数,double型,表示一个作用到加权和后的图像上的标量,可以理解为加权和后的图像的偏移量,融合后添加的数值,调节亮度
dst可选参数,表示两个图像加权和后的图像,尺寸和图像类型与src1和src2相同,即输出图像
dtype可选参数,默认值-1。当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()

位运算

与运算

图像的与运算就是将两幅二值图像的对应像素进行逻辑与操作,如果处理的图像不是二值图像,那么要先进行二值化处理。可以用来求得两幅尺寸相同的图像的相交区域。

OpenCV中提供的用于与运算的函数是cv2.bitwise_and()。

函数原型: and_img = cv2.bitwise_and(img1, img2);

and_img为运算后的图像

参数描述如下:

参数描述
img1,img2需要进行运算的图片
  • 如果某个像素与纯白色像素做与运算,结果仍然是原像素的原值。

    00101011 & 11111111=00101011

  • 如果某个像素与纯黑色像素做与运算,结果为纯黑像素。

    00101011 & 00000000=00000000

  • 结论:如果原图像与掩模进行与运算, 原图像仅会保留掩模中白色区域所覆盖的内容,其他区域全部变成黑色。

或运算

或运算和与运算操作方法类似,只是将两幅图像的对应像素该位进行或运算即可,同样的,如果处理的图像不是二值图像,则应该首先对图像进行二值化。

OpenCV中提供的用于或运算的函数是cv2.bitwise_or()。

函数原型: or_img = cv2.bitwise_or(img1, img2)

or_img为运算后的图像

参数描述如下:

参数描述
img1,img2需要进行运算的图片
  • 如果某个像素与纯白色像素做或运算,结果仍然是纯白元素。

    00101011 | 11111111=11111111

  • 如果某个像素与纯黑色像素做或运算,结果仍然是某元素的原值。

    00101011 & 00000000=00101011

  • 结论:如果原图像与掩模进行或运算, 原图像仅会保留掩模中黑色区域所覆盖的内容,其他区域全部变成白色。

取反运算

取反运算是按照二进制位进行判断的,如果同一位的数字是0,则运算结果的相同位数字取1,如果同一位的数字是1,则运算结果的相同位数字取0。

OpenCV中提供的用于取反运算的函数是cv2.bitwise_not()。

函数原型: not_img = cv2.bitwise_not(img, mask)

not_img为运算后的图像

参数描述如下:

参数描述
img1需要进行运算的图片
mask可选参数,掩膜

异或运算

异或运算是按照二进制位进行判断的,如果两个运算数同一位上的数字相同,则运算结果字取0,否则取1。

OpenCV中提供的用于异或运算的函数是cv2.bitwise_xor()。

函数原型: xor_img = cv2.bitwise_xor(img1, img2)

xor_img为运算后的图像

参数描述如下:

参数描述
img1,img2需要进行运算的图片
  • 如果某个像素与纯白色像素做异或运算,结果为原像素的取反结果。

    00101011 | 11111111=11010100

  • 如果某个像素与纯黑色像素做异或运算,结果仍然是某元素的原值。

    00101011 & 00000000=00101011

  • 结论:如果原图像与掩模进行异或运算, 掩膜白色区域所覆盖的内容呈现取反效果,黑色区域覆盖的内容保持不变。


具体步骤

1. 创建项目结构

创建项目名为使用图像运算进行图片美化,项目根目录下新建code文件夹储存代码,新建dataset文件夹储存数据,项目结构如下:

使用图像运算进行图片美化                   # 项目名称
├── code                               # 储存代码文件
├── dataset                            # 储存数据文件

注:如项目结构已存在,无需再创建。

2. 使用图像运算给小女孩染发

  1. code文件夹下创建dyw_hair.py文件;
  2. 读取dataset文件夹下的一张小女孩图片,名称为girl.png,并进行展示 ;
  3. 创建一个尺寸和小女孩图片相同的纯棕色图像,棕色的BGR为(42,42,128)
  4. 将小姑娘的头发染成棕色;
  5. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

import cv2
import numpy as np

# 读取图片
img1 = cv2.imread('../dataset/girl.png')
cv2.imshow('img1', img1)

# 获得原图尺寸,创建棕色图片
img2 = np.zeros(img1.shape, np.uint8)
img2[:] = (42, 42, 128)

cv2.imshow('img2', img2)


# 将小姑娘的头发染成棕色
add_img = cv2.add(img1, img2)

cv2.imshow('add', add_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

请添加图片描述

实验效果

3. 为小女孩的图片加上背景

  1. code文件夹下创建add_background.py文件;
  2. 读取dataset文件夹下的一张小女孩图片,名称为girl.png,并进行展示 ;
  3. 读取dataset文件夹下的back.png图片作为背景图片,并进行展示 ;
  4. 给小女孩的图片加上背景;
  5. 无限等待用户输入按键,按下按键后销毁所有窗口。

代码实现

import cv2

# 读取图像
img1 = cv2.imread('../dataset/girl.png')
cv2.imshow('img1', img1)

# 读取背景图
back = cv2.imread('../dataset/back.png')
# 给小女孩的图片加上背景
and_img = cv2.bitwise_and(img1,back)

cv2.imshow('and', and_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

请添加图片描述

实验效果

图像的运算虽然简单,但我们所使用的图像数量技术其实都是靠一些简单的基础运算来完成的,这些简单运算是我们后续研究更复杂的图像处理的基础,因此我们需要重点学习练习一下图像的基础运算的知识。

点击下载源码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563128.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HiveSQL基础练习题

HiveSQL基础练习题 1.环境准备1.1建表语句1.2数据准备1.3插入数据 2.查询2.1 查询姓名中带“华”的学生名单2.2 查询姓“王”老师的个数2.3 检索课程编号为“04”且分数小于60的学生学号&#xff0c;结果按分数降序排列2.4 查询语文成绩 < 90分的学生和其对应的成绩&#xf…

day16 Servlet交互作用域ELJSTL

转发和重定向 **作用:**为了让jsp和servlet做到责任分离,用于web组件的跳转 **web组件:**jspservlet 转发的方法 request.getRequestDispatcher("跳转的地址").forward(request,response)**跳转的位置:**在服务端进行跳转 重定向的方法 response.sendRedirect(…

2.9 playwright之python实现

1、目录结构如下 2、main.py import os import shutilfrom playwright.sync_api import sync_playwright from config.setting import config from utils.template import Template from utils.md5 import Md5 from utils.delete import del_files import pytest from utils.d…

面试被问麻了...

前几天组了一个软件测试面试的群&#xff0c;没想到效果直接拉满&#xff0c;看来大家对面试这块的需求还是挺迫切的。昨天我就看到群友们发的一些面经&#xff0c;感觉非常有参考价值&#xff0c;于是我就问他还有没有。 结果他给我整理了一份非常硬核的面筋&#xff0c;打开…

全网最全性能测试总结,分析性能测试问题+性能调优方案...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能分析和优化一…

【录用案例】2区毕业快刊仅34天录用,新增8篇录用、9篇见刊、13篇检索

2023年5月13日-2023年5月19日&#xff0c;经核实&#xff0c;由我处Unionpub学术推荐的8篇论文已被期刊部录用、9篇见刊、13篇检索&#xff1a; 2区系统类SSCI 【期刊简介】IF:2.5-3.0&#xff0c;JCR2区&#xff0c;中科院4区 【检索情况】SSCI 在检&#xff0c;正刊 【征稿…

本地项目上传到Git(Gitee)仓库

一、步骤解答&#xff08;详细图解步骤见第二大点&#xff09; 1、打开我们的项目所在文件夹&#xff0c;我们发现是不存在.git文件 2、在你的项目文件夹外层【鼠标右击】弹出菜单&#xff0c;在【鼠标右击】弹出的菜单中&#xff0c;点击【Git Bash Here】&#xff0c;弹出运…

循环队列+OJ题之设计循环队列

生命不是要等待风暴过去&#xff0c;而是要学会在风暴中跳舞。 ——卡莉尔吉布朗目录 &#x1f33a;前言&#xff1a; &#x1f341;一.循环队列是什么&#xff1f; &#x1f34f;二.循环队列有什么作用&#xff1f; &#x1f340;三.OJ题之设计循环队列 1…

实战演练 | Navicat 数据生成功能

数据生成的目的是依据某个数据模型&#xff0c;从原始数据通过计算得到目标系统所需要的符合该模型的数据。数据生成与数据模型是分不开的&#xff0c;数据生成的结果应该符合某个数据模型对于数据的具体要求。所以&#xff0c;随着数据模型的发展&#xff0c;数据生成的方法相…

window 利用Qt-windeployqt打包exe程序 一个简单的实例

用一个简单的实例展示下window 如何使用QT-windeployqt打包exe程序使得其可以在别的电脑上运行 一、release模式获得exe可执行文件 新建一个QT项目 构建选择使用CMake base class选择QMainWindow Kit Selection一定要注意&#xff0c;我选的是MinGW 32-bit UI设计 mainwindow.…

手机充电宝电子充气泵方案

该充气泵产品方案的运行原理是通过电动机将电能转化为机械能&#xff0c;带动电机做往复运动&#xff0c;从而产生大量压缩空气&#xff0c;达到快速充气的效果。该充气泵可用于气垫床、汽车轮胎、自行车轮胎、足球、游泳圈等各类充气物品。产品设计以人性化为主&#xff0c;简…

VMware重新安装后没有VMnet1和VMnet8网络

问题&#xff1a; VMware重新安装后&#xff0c;没有自动生成VMnet1和VMnet8网络, 并且使用VMware自带的虚拟网络编辑器也无法生成。 导致主机无法ping通虚拟机。 如下图&#xff1a;点击该选项&#xff0c;然后应用&#xff0c;转一会圈也没有产生对应的网络适配器。 问题原…

物联网技术助力物流智能化:从货物追踪到配送优化

目录 前言 物流领域的IoT设备 物流领域的应用 二、仓库管理 三、物流配送 IoT组合应用 区块链在物流领域应用 展望 前言 随着全球贸易和物流业的快速发展&#xff0c;物流领域的智能化和自动化已成为不可避免的趋势。而物联网技术作为一种重要的数字技术&#xff0c;已经在物流…

VIsual Studio内引用Lua解释器,编译Lua源码,执行Lua脚本

前言 本篇在讲什么 在Visual Studio中引入lua的解释器 使用C调用Lua文件 本篇适合什么 适合初学Lua的小白 适合需要C/C和lua结合开发的人 本篇需要什么 对Lua语法有简单认知 对C/C语法有简单认知 依赖Lua5.1的环境 依赖VS 2017编辑器 本篇的特色 具有全流程的图文…

Shellcode分离加载实现免杀的两种方式(VT免杀率:1/68)

简介 本文详细介绍了如何通过文件加载和远程URL加载方式实现Shellcode分离加载&#xff0c;以规避安全软件的检测。文章首先描述了通过Metasploit Framework生成的shellcode文件加载的过程&#xff0c;并提供了相关的C代码。 为了避免被杀毒软件检测&#xff0c;利用动态API调…

自动化测试-DevOps如何实施?看看10年测试大佬的总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Selenium4自动化测…

2023最新!软件测试高频面试题基础知识点分享

近期也算是抽取出大部分休息的时间&#xff0c;为大家准备了一份通往大厂面试的小捷径&#xff0c;准备了一整套软件测试复习面试的刷题以及答案&#xff0c;我知道很多同学不知道怎么复习&#xff0c;不知道学习过程中哪些才是重点&#xff0c;其实&#xff0c;你们经历过的事…

内网渗透(八十二)之 CVE-2019-1040 NTLM MIC 绕过漏洞

CVE-2019-1040 NTLM MIC 绕过漏洞 漏洞背景 2019年6月11日,微软发布6月份安全补丁更新。在该安全补丁更新中,对 CVE-2019-1040 漏洞进行了修复。该漏洞存在于Windwos 大部分版本中,当中间人攻击者能够成功绕过NTLM 消息完整性校验(MIC)时,Windows 存在可能可篡改的漏洞…

R语言实践——rWCVP生成可发表级别的物种发现记录矩阵

rWCVP生成可发表级别的物种发现记录矩阵 介绍1. 查询一组示例数据2. 生成和格式化出现矩阵3. 额外地对国家进行处理 介绍 世界维管植物名录&#xff08;WCVP&#xff09;提供了已知的>340&#xff0c;000种维管植物物种的分布数据。该分布数据可用于构建植物物种名录的发现…

解密报错-java.security.InvalidKeyException: Illegal key size(本机解密正常,服务器解密报错)

记录在对接微信接口时需要的问题&#xff0c;对微信消息进行解密时报错&#xff0c;在本地进行解密是正常的&#xff0c;但部署到服务器进行解密就会报错 报错信息 java.security.InvalidKeyException: Illegal key sizeat javax.crypto.Cipher.checkCryptoPerm(Cipher.java:…