小白学视觉 | 图像上的 OpenCV 算术运算

news2024/11/15 14:08:47

本文来源公众号“小白学视觉”,仅用于学术分享,侵权删,干货满满。

原文链接:图像上的 OpenCV 算术运算

1 OpenCV 简介

图像可以进行算术运算,例如加法、减法和按位运算(AND、OR、NOT、XOR)。这些操作可以帮助改善输入图像的属性。

图像算法对于分析输入图像的属性是必要的,可以将操作后的图像用作增强的输入图像,并且可以对图像应用更多操作,以进行阈值化、膨胀等。

图像算术是将一幅或多幅图像应用于标准算术运算或逻辑运算符之一。运算符是逐个像素应用的,因此输出图像中像素的值仅由输入图像中相应像素的值决定。

因此,图像通常必须具有相同的大小。当向图像添加恒定偏移量时,输入图像之一可能是恒定值。

虽然图像算法是图像处理的最基本形式,但它有很多应用。算术运算符的一个显着优势是该过程简单明了,因此速度很快。

2 添加图像

在其最基本的形式中,该运算符将两个相同大小的图像作为输入,并输出与前两个相同大小的第三个图像,每个像素值是两个输入图像中每个图像中对应像素值的总和. 更高级的版本允许在一次操作中组合多个图像。

运算符的一个常见变体只是允许向每个像素添加一个指定的常数。使用函数 cv2.add(),我们可以添加两个图像。这直接将两个图像中的图像像素相加。

Syntax: cv2.add(image1, image2)

但是,添加像素并不是一个理想的情况。因此,我们使用 cv2.addweighted()。请记住,两个输入图像的形状和颜色通道必须相同。

Syntax: cv2.add Weighted(image1, weight1, Image2, weight2, gammaValue)

参数:

  1. image1:第一个图像数组输入

  2. weight 1:输入图像中第一个用于最终图像的图像元素的权重。

  3. image2:第二个图像数组输入

  4. weight 2:将第二输入图像元素的权值应用于最终图像的伽马值。

  5. gammaValue:光测量。

加法代码

import cv2
import numpy as np
image1 = cv2.imread('input1.jpg')
image2 = cv2.imread('input2.jpg')
weightedSumadd = cv2.addWeighted(image1, 0.6, image2, 0.4, 0)
cv2.imshow('Weighted Image', weightedSumadd)
cv2.waitKey(0)
cv2.destroyAllWindows()

输出图像将是:

3 图像减法

像素减法算子将两幅图像作为输入并输出第三幅图像,其像素值是第一幅图像的像素值减去第二幅图像的相应像素值。

使用单个图像作为输入是常见的,从所有像素中减去一个常数值也是常见的。一些版本的运算符将简单地输出像素值之间的绝对差,而不是直接的有符号输出。

Syntax:  cv2.subtract(image1, image2)

参数:

  1. 图 1:第一个图像数组输入(单通道、8 位或浮点)

  2. 图 2:第二个图像阵列输入(单通道、8 位或浮点)

输入图像

代码 :

import cv2
import numpy as np
image1 = cv2.imread('input1.jpg')
image2 = cv2.imread('input2.jpg')
sub = cv2.subtract(image1, image2)
cv2.imshow('Subtracted Image', sub)
cv2.waitKey(0)

输出减去的图像将是:

4 位运算

位运算用于图像处理以提取重要部分。本文中使用了以下按位运算:

  1. AND

  2. OR

  3. NOT

  4. XR

位运算对于图像遮罩也很有用。这些操作可用于启用图像创建。这些操作可以帮助改善输入图像的属性。

注意:按位运算只能在相同尺寸的输入图像上执行。

4.1 图像的 AND 位运算

AND 运算符(以及类似方式的 NAND 运算符)通常将两个二进制或整数灰度级图像作为输入,并生成第三个图像,其像素值只是第一个图像的像素值与来自第二个图像的相应像素相乘。

可以修改此运算符以通过获取单个输入图像,并将每个像素与预定的常数值进行与运算来产生输出。

Syntax: cv2.bitwise_and(Image1, Image2, destination, mask)

参数:

  1. Image1:第一个输入图像 numpy 数组

  2. Image1:第二个输入图像numpy数组

  3. destination:输出数组

  4. mask:操作掩码图像

代码 :

import cv2
import numpy as np
img1 = cv2.imread('input1.png') 
img2 = cv2.imread('input2.png')
dest_and = cv2.bitwise_and(img2, img1, mask = None)
cv2.imshow('Bitwise And', dest_and)
cv2.waitKey(0)

4.2 图像的 OR 位运算

OR 运算符通常将两个二进制或灰度图像作为输入,并输出第三个图像,其像素值是第一个图像的像素值与来自第二个图像的相应像素进行或运算。

该运算符的一个变体采用单个输入图像并将每个像素与一个常数值进行 OR 运算以生成输出。

Syntax: cv2.bitwise_or(source1, source2, destination, mask)

参数:

  1. source1 第一个输入 numpy 图像数组

  2. source2 第二个输入 numpy 图像数组

  3. 目的地输出数组图像

  4. mask 操作掩码,输入/输出 8 位单通道掩码。

代码 :

import cv2
import numpy as np
img1 = cv2.imread('input1.png') 
img2 = cv2.imread('input2.png')
dest_or = cv2.bitwise_or(img1, img2, mask = None)
cv2.imshow('Bitwise OR', dest_or)
cv2.waitKey(0)

4.3 图像的NOT位运算

逻辑非,也称为反转,是一种将二值或灰度图像作为输入并生成其照相底片的运算符。

Syntax: cv2.bitwise_not(Image1,Destination, mask)

参数:

  1. Image1:输入图像数组

  2. Destination:输出数组图像

  3. mask: 操作掩码

代码 :

import cv2
import numpy as np
img1 = cv2.imread('input1.png') 
dest_not = cv2.bitwise_not(img1, mask = None)
cv2.imshow('Bitwise Not', dest_not)
cv2.waitKey(0)

4.4 图像的 XR 位运算

至关重要的是,正在处理的所有输入像素值都具有相同的位数,否则可能会出现意外结果。当输入图像中的像素值不是简单的 1 位数字时,XOR 操作通常(但不总是)对像素值中的每个对应位按位执行。

Syntax: cv2.bitwise_xor(source1, source2, destination, mask)

参数:

  1. source1 第一个输入图像数组(单通道、8 位或浮点)

  2. source2 第二个输入图像数组(单通道、8 位或浮点)

  3. 目的地输出图像数组

  4. mask 操作掩码,输入/输出8位单通道掩码。

代码 :

import cv2
import numpy as np
img1 = cv2.imread('input1.png') 
img2 = cv2.imread('input2.png')
dest_or = cv2.bitwise_xor(img1, img2, mask = None)
cv2.imshow('Bitwise XOR', dest_xor)
cv2.waitKey(0)

5 OpenCV的结论

许多应用程序使用从同一场景的不同点获取的经过处理的图像,例如通过添加相同场景的连续图像来降低噪声或通过减去两个连续图像来进行运动检测。逻辑运算符经常用于组合两个(主要是二进制)图像。

在整数图像的情况下,逻辑运算符通常按位使用。然后,例如,我们可以使用二进制掩码来选择图像的特定区域。

关键要点:

在本文中,我们学习了如何对图像执行各种算术运算,OpenCV 方法是如何工作的,以及这些图像算术运算在哪里使用。

THE END!

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

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

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

相关文章

模拟器App抓包 - 证书双向验证绕过手段

希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢! 个人博客链接:CH4SER的个人BLOG – Welcome To Ch4sers Blog 0x00 Frida 环境配置 1. 本地安装 Frida pip install frida pip install frida-tools2. 模拟器安装 Fr…

【详细讲解yarn的安装和使用】

🌈个人主页:程序员不想敲代码啊🌈 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家🏆 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提…

leetcode 15.三数之和 JAVA 双指针法

题目 思路 双指针法 去重 为啥要去重呢?因为题目中说了要返回不重复的三元组。拿示例1来看,(-1,0,1)和(0,1,-1)虽然都等于0,但其实它们里面的数…

Unix环境高级编程-学习-08-自旋锁与屏障

目录 一、多线程相关文章链接 二、自由抒发 1、自旋锁 2、屏障 三、函数介绍 1、pthread_spin_init (1)声明 (2)作用 (3)参数 (4)返回值 (5)注意点 …

c语言文件操作(下)

目录 1.文件的随机读写1.1 fseek1.2 ftell1.3 rewind 2. 文件结束的判定2.1 文本文件读取结束的判断2.2 二进制文件读取结束的判断 3. 文件缓冲区 1.文件的随机读写 1.1 fseek 根据⽂件指针的位置和偏移量来定位⽂件指针。 函数原型: int fseek (FILE * stream,…

Python篇之网络编程,实现简单的服务端和客户端的内容传输

本小节内容:实现简单的信息交流 文章目录 一、 Socket介绍二、客户端与服务端三、在python中实现网络通信1. 服务端2. 客户端3. 连接测试 一、 Socket介绍 socket (简称 套接字) 模块是其内置的标准库之一,它实现了BSD sockets API,允许开发…

(分享)一个图片添加水印的小demo的页面,可自定义样式

有时候想给某张图片添加一个自己的水印,但是又懒的下载相应软件,用js canvas制作一个静态页面,对于单张图片添加自定义文字水印,大小 间距,角度可调。 页面如下: 选择图片,设置相应参数&#x…

深度学习模型部署(十二)CUDA编程-绪

CUDA 运行时 API 与 CUDA 驱动 API 速度没有差别,实际中使用运行时 API 较多,运行时 API 是在驱动 API 上的一层封装。​ CUDA 是什么?​ CUDA(Compute Unified Device Architecture) 是 nvidia 推出的一个通用并行技术架构,用它…

【LLM】大模型推理加速 KV-Cache

目录 模型推理过程KV Cache原理KV Cache的存储 模型推理过程 在了解KVCache之前,我们需要知道Transformer类大模型的推理过程。 对于LLM进行一次前向传播也就是生成一个token的过程可以被分解成以下步骤: 文本 T i n p u t T_{input} Tinput​经过Toke…

数据结构与算法分析引论1

1.解决问题的算法有很多,但是在输入不同的情况下,不同算法之间的差异也很大,我们总是追求一个更快、更有效的方法。比如说普通的依次查找和二分查找,两者的差异就很大。我们使用大O表示法来表示算法的速度。依次查找就是O(n)&…

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48)

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48) 一、算法介绍二、算法步骤三、算法实现1.代码2.效果一、算法介绍 通过这里的平面生成方法,可以生成模拟平面的点云数据,并可以人为设置平面方向,平面大小,并添加噪声来探索不同类型的平面数据。这种方法可以用于…

UDS诊断中的NRC

我总结了一张表格:详细解释了NRC的分布情况和NRC的触发条件 1:基本概念 NRC 全称Negative Response Code(否定响应代码),是指示uds诊断中的,指示否定响应的原因 例如:0x22 服务 request 报文 0x618 03 22 F1 34 0…

电脑物理磁盘空间不足?试试这5种清理和优化方法!

随着我们使用电脑的时间越来越长,物理磁盘空间可能会逐渐变得捉襟见肘。当你的电脑提示磁盘空间不足时,不要慌张,这里有五种方法可以帮助你清理和优化电脑,释放宝贵的存储空间。 1. 卸载不常用的程序和游戏 许多用户在安装软件和…

机器学习基础——模型评估与选择(部分)

目录 一、前言:误差与拟合 (一)经验误差 (二)过拟合、欠拟合 二、评估方法 (一)评估总体的思路 (二)如何划分训练集和测试集 1.留出法 2.k折交叉验证 3.自助法 …

程序员35岁真的就是危机吗?

前言 35岁被认为是程序员职业生涯的分水岭,许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长,技术更新换代的速度会使得资深程序员难以跟上;而另一些人则认为,丰富的经验和深厚的技术积累是年轻程…

knife4j/swagger救援第一现场

1、前方来报,测试环境springboot项目无法启动,现场如下: Error starting ApplicationContext. To display the auto-configuration report re-run your application with debug enabled. [ERROR] 2024-03-20 12:54:42,718 --main-- [org.spr…

一键跳过开屏广告,这下舒服了

现在的app开屏广告越来越过分了,不小心摇一摇翻转就点开广告了。 今天分享个强大的自动跳过广告https://github.com/gkd-kit/gkd,李跳跳替代品,下载地址在公众号后台对话框回复 广告 玩转互联网达人 苏生不惑备用号,分享各种黑科…

【Godot4自学手册】第二十九节使用Shader来实现敌人受伤的闪白效果

在Godot 4中,Shader是用来为材质提供自定义渲染效果的程序。材质可以应用于MeshInstance、CanvasItem和ParticleEmitter等节点。Shader可以影响顶点的变换、片段(像素)的颜色,以及光照与物体的交互。 在Godot中,Shader…

HTML基础:8个常见表单元素的详解

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端程序媛。 后台回复“前端工具”可免费获取开发工具,持续更新。 今天来说说 HTML 表单。它是用于收集用户输入信息的元素集合。例如文本框、单选按钮、复选框、下拉列表等。 用户经常填写的表…

海外媒体软文发稿:谷歌关键词优化细分人群成功案例,突破海外市场!

海外媒体软文发稿:谷歌关键词优化细分人群成功案例,突破海外市场! 引言 在全球化的时代,海外市场对于企业的发展至关重要。而在海外市场中,互联网媒体的作用不可忽视。本篇教程将介绍如何通过谷歌关键词优化细分人群…