Python中图像算术运算的示例详解
作者:woshicver 发布时间:2023-01-01 19:56:43
介绍
还记得你在小学时学习如何加减数字吗?现在,你也可以对图像做同样的事情!
输入图像可以进行算术运算,例如加法、减法和按位运算(AND、OR、NOT、XOR)。这些操作可以帮助提高输入照片的质量。
在本文中,你将了解使用 OpenCV Python 包对图像执行算术和按位运算的步骤。让我们开始吧!
对图像进行算术运算是什么意思?
因此,假设我们希望合并两张单独的照片中的两个像素。我们怎样才能将它们合并?
让我们想象以下场景。第一个像素的颜色强度为 (200, 0, 0),而第二个像素的颜色强度为 (100, 0, 0)。如果我们只是将这些值相加,我们得到 (300, 0, 0)。这在处理 RGB 图像时是完全可能的。
那么,我们如何在 Python 中解决这个问题呢?
该解决方案附带实现了 cv2.add() 和 cv2.subtract() 函数的 OpenCV 库。
要执行这些操作,你必须在系统上安装 OpenCV Python 库。
算术运算:图像相加
使用 cv2.add() 函数,我们可以添加两个图像。cv2.add() 将两个图像中的图片像素相加。执行此操作时要记住的一件事是,两个图像应该具有相同的深度和类型,或者第二个图像可以只是一个标量值。
这个函数的语法是:cv2.add(img1, img2)
对于这个博客,我们将考虑以下两张图片来将两张图片相加。
在进行算术运算之前,你必须知道如何读取和显示加载的图像。
现在,按照下面的代码片段阅读,执行两个图像的添加,最后显示添加的图像。
import cv2
img1 = cv2.imread('image1_add.jpg', 1)
#or
#img1 = cv2.imread('C:\\Users\\Admin\\Downloads\\image1_add.jpg', 1)
cv2.imshow('Image 1', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
img2 = cv2.imread('image2_add.jpg', 1)
#or
#img2 = cv2.imread('C:\\Users\\Admin\\Downloads\\image2_add.jpg', 1)
cv2.imshow('Image 2', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
# Add the images
added_img = cv2.add(img1, img2)
cv2.imshow('Added Image', added_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
从上面的代码片段中添加的图像如下:
这只是简单的添加。我们可以使用另一个名为 cv2.addWeighted 的函数来混合图像。这类似于图像添加,但图像被赋予不同的权重以产生混合或透明的错觉。
这个函数的语法是:cv2.addWeighted(img1, wt1, img2, wt2, gammaValue)
按照下面的代码片段对两个图像执行加权加法。
import cv2
img1 = cv2.imread('image1_add.jpg', 1)
#or
#img1 = cv2.imread('C:\\Users\\Admin\\Downloads\\image1_add.jpg', 1)
cv2.imshow('Image 1', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
img2 = cv2.imread('image2_add.jpg', 1)
#or
#img2 = cv2.imread('C:\\Users\\Admin\\Downloads\\image2_add.jpg', 1)
cv2.imshow('Image 2', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
#Addition - weighted addition
added_wt_img = cv2.addWeighted(img1, 0.6, img2, 0.4, 0)
cv2.imshow('Added Weight Image', added_wt_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
加权加法的输出如下:
在这里,拍摄了两张图像将它们混合在一起。第一张图片的权重为 0.6,第二张图片的权重为 0.4。你可以根据需要更改图像的权重!
算术运算:图像减法
就像两个图像相加一样,你可以减去两个图像。这可以使用 cv2.subtract() 函数来完成。请注意,要减去的图像必须具有相同的大小和深度。
这个函数的语法是:cv2.subtract(src1, src2)
下面的代码片段显示了如何减去两个图像。已经减去了之前使用的图像(我们在加法中使用的图像)。
import cv2
img1 = cv2.imread('image1_add.jpg', 1)
#or
#img1 = cv2.imread('C:\\Users\\Admin\\Downloads\\image1_add.jpg', 1)
cv2.imshow('Image 1', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
img2 = cv2.imread('image2_add.jpg', 1)
#or
#img2 = cv2.imread('C:\\Users\\Admin\\Downloads\\image2_add.jpg', 1)
cv2.imshow('Image 2', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
sub_img = cv2.subtract(img1, img2)
cv2.imshow('Subtracted Image', sub_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
减去的图像如下:
还尝试减去两个更简单的图像以使其更易于理解。使用的两张图片是:
减去的输出是:
既然我们已经了解了如何对图像执行算术运算,我们将继续对图像进行按位运算。
位运算
当我们只需要提取图像所需的元素时,我们会使用按位运算。
这些按位技术用于各种计算机视觉应用,例如创建图像蒙版、将水印应用于图像以及创建新图像。与 OpenCV 中的其他变形方法相比,这些操作对图像中的单个像素起作用,以产生更准确的结果。
图像上的 And、Or 和 Not 操作
在开始之前,假设你熟悉三个基本的位运算符:AND、OR、NOT。
OpenCV 包括用于执行与、或和非操作的内置函数。它们是按位与、按位或和按位非。考虑下面的两张黑白图像。现在让我们将这三个操作应用于这两个图像,看看会发生什么。
import cv2
#read the images
img1 = cv2.imread('bitwise_image_1.jpg')
img2 = cv2.imread('bitwise_image_2.jpg')
bitwise_AND = cv2.bitwise_and(img1, img2)
bitwise_OR = cv2.bitwise_or(img1, img2)
bitwise_NOT = cv2.bitwise_not(img1)
cv2.imshow('img1', img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshow('img2', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshow('AND', bitwise_AND)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshow('OR', bitwise_OR)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imshow('NOT', bitwise_NOT)
cv2.waitKey(0)
cv2.destroyAllWindows()
上述代码段的输出将如下所示:
希望你已经学会了如何使用 OpenCV 对图像进行算术和按位运算。
来源:https://blog.csdn.net/woshicver/article/details/124564633


猜你喜欢
- 导入CSV文件导入数据的步骤 ①打开xxx.csv文件②首先读取文件头③然后读取剩余头④当发生错误时抛出异常读取完所有内容后,打印文件头和剩
- Python 中的字典是Python中一个键值映射的数据结构,下面介绍一下如何优雅的操作字典.1.1 创建字典Python有两种方法可以创建
- 如下所示:import numpy as npimport pandas as pdfrom pandas import Sereis, D
- Python 异常处理机制还提供了一个 finally 语句,通常用来为 try 块中的程序做扫尾清理工作。注意,和 else 语句不同,f
- 本文实例为大家分享了python(列表生成式/器)的具体代码,供大家参考,具体内容如下一、列表生成式#列表生成式是快速生成一个列表的一些公式
- use mysql; u
- 阅读上一篇:FrontPage2002简明教程七:HTML在FrontPage中的应用 FrontPage 2002比起以前版本的FronP
- 在本文中,将详细介绍Playwright的文本框操作, 包括如何获得文本框的值, 以及向文本框中添加单行和多行文本。田辛老师将用网上的一个测
- PDO::commitPDO::commit提交一个事务(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0)说
- 问题描述Python调整图片文件的占用空间大小,而不是分辨率1.jpg图片大小为 8KB 减小文件大小使用 PIL 模块pip i
- 比如,在使用DWR的时候,如果你想传递下拉框的参数到后台的话,此时就需要先获取到下拉框的值了。 其实想要获取到下拉框的值是很简单的。 最关键
- 是的,我们知道:我们可以为border设置它的width,这个border的宽度可以是5px,可是10px,可以是20px,可以是随意数值。
- 计算分页,嘿嘿一次搞定不用判断intNumPage = Abs(Int(-(intNumRecord/intPerPage)))  
- 声明定位元素:position属性值设置除默认值static以外的元素,包括relative,absolute,fixed。平台:win/I
- 要写一个类似tomcat的简易服务器,首先需弄清楚这几点:1. 客户端(Client)和服务端(Server)的角色及作用角色A向角色B请求
- 引言https://github.com/go-chassis/go-chassis是一个微服务开发框架,而微服务开发框架带来的其中一个课题
- from flask import requestFlask 是一个人气非常高的Python Web框架,笔者也拿它写过一些大大小小的项目,
- 本文实例讲述了mysql变量用法。分享给大家供大家参考,具体如下:本文内容:系统变量用户变量局部变量首发日期:2018-04-18系统变量:
- 为什么页面出现乱码?为什么数据库里出现乱码?为什么这些乱码的出现几率飘忽不定了?诸如此类的乱码问题困扰了很多WEB开发人员。假如不将这背后的
- 我想没多少人敢保证写JavaScript能不用调试,那选择用什么方式调试会比较好呢?告别了我最爱的alert("MM")