图像上的 OpenCV 算术运算

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达5815760e34ca9eb4a367d9056a800955.jpeg

来源 | 深度学习与计算机视觉

编辑 | 磐怼怼

OpenCV 简介

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

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

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

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

65e92cae914e360714129806eb5d3c8f.png

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

添加图像

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

运算符的一个常见变体只是允许向每个像素添加一个指定的常数。使用函数 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:光测量。

d3e0884605aaeea368e21bca03267f8d.png

加法代码

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()

输出图像将是:

fd4880ffd587caf7519b1b2f3d328784.jpeg

图像减法

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

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

Syntax:  cv2.subtract(image1, image2)

参数:

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

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

输入图像

f1d122d5e7e19301033de8665704143f.png

代码 :

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)

输出减去的图像将是

89b0e911cac8fecdfeee04361f5b44bc.jpeg

位运算

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

  1. AND

  2. OR

  3. NOT

  4. XR

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

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

图像的 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)

图像的 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)


图像的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)


图像的 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)


OpenCV的结论

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

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

关键要点:

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

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇

 
 

06d1d71125b8701f9f668a8a20b77613.jpeg

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值