Python的图像算术与逻辑运算详解
一.图像加法运算
图像加法运算主要有两种方法。第一种是调用Numpy库实现,目标图像像素为两张图像的像素之和;第二种是通过OpenCV调用add()函数实现。第二种方法的函数原型如下:
- dst = add(src1, src2[, dst[, mask[, dtype]]])
– src1表示第一张图像的像素矩阵
– src2表示第二张图像的像素矩阵
– dst表示输出的图像,必须和输入图像具有相同的大小和通道数
– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。
– dtype表示输出数组的可选深度
注意,当两幅图像的像素值相加结果小于等于255时,则输出图像直接赋值该结果,如120+48赋值为168;如果相加值大于255,则输出图像的像素结果设置为255,如(255+64) 赋值为255。下面的代码实现了图像加法运算。
#coding:utf-8
# By:Eastmount
import cv2
import numpy as np #读取图片
img = cv2.imread("luo.png")#图像各像素加100
m = np.ones(img.shape, dtype="uint8")*100#OpenCV加法运算
result = cv2.add(img, m)#显示图像
cv2.imshow("original", img)
cv2.imshow("result", result)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出如图4-1所示,左边为“小珞珞”的原始图像,右边为像素值增加100像素后的图像,输出图像显示更偏白。

二.图像减法运算
图像减法运算主要调用subtract()函数实现,其原型如下所示:
- dst = subtract(src1, src2[, dst[, mask[, dtype]]])
– src1表示第一张图像的像素矩阵
– src2表示第二张图像的像素矩阵
– dst表示输出的图像,必须和输入图像具有相同的大小和通道数
– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。
– dtype表示输出数组的可选深度
具体实现代码如下所示:
#coding:utf-8
# By:Eastmount
import cv2
import numpy as np #读取图片
img = cv2.imread("luo.png")#图像各像素减50
m = np.ones(img.shape, dtype="uint8")*50#OpenCV减法运算
result = cv2.subtract(img, m)#显示图像
cv2.imshow("original", img)
cv2.imshow("result", result)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出如图4-2所示,左边为原始图像,右边为像素值减少50像素后的图像,输出图像显示更偏暗。

三.图像与运算
与运算是计算机中一种基本的逻辑运算方式,符号表示为“&”,其运算规则为:
- 0&0=0
- 0&1=0
- 1&0=0
- 1&1=1
图像的与运算是指两张图像(灰度图像或彩色图像均可)的每个像素值进行二进制“与”操作,实现图像裁剪。
- dst = bitwise_and(src1, src2[, dst[, mask]])
– src1表示第一张图像的像素矩阵
– src2表示第二张图像的像素矩阵
– dst表示输出的图像,必须和输入图像具有相同的大小和通道数
– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。
下面代码是通过图像与运算实现图像剪裁的功能。
#coding:utf-8
# By:Eastmount
import cv2
import numpy as np #读取图片
img = cv2.imread("luo.png", cv2.IMREAD_GRAYSCALE)#获取图像宽和高
rows, cols = img.shape[:2]
print(rows, cols)#画圆形
circle = np.zeros((rows, cols), dtype="uint8")
cv2.circle(circle, (int(rows/2),int(cols/2)), 100, 255, -1)
print(circle.shape)
print(img.size, circle.size)#OpenCV图像与运算
result = cv2.bitwise_and(img, circle)#显示图像
cv2.imshow("original", img)
cv2.imshow("circle", circle)
cv2.imshow("result", result)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出如图4-3所示,原始图像与圆形进行与运算之后,提取了其中心轮廓。同时输出图像的形状为377×326。注意,两张图像的大小和类型必须一致。

四.图像或运算
逻辑或运算是指如果一个操作数或多个操作数为 true,则逻辑或运算符返回布尔值 true;只有全部操作数为false,结果才是 false。图像的或运算是指两张图像(灰度图像或彩色图像均可)的每个像素值进行二进制“或”操作,实现图像裁剪。其函数原型如下所示:
- dst = bitwise_or(src1, src2[, dst[, mask]])
– src1表示第一张图像的像素矩阵
– src2表示第二张图像的像素矩阵
– dst表示输出的图像,必须和输入图像具有相同的大小和通道数
– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。
下面代码是通过图像或运算实现图像剪裁的功能。
#coding:utf-8
# By:Eastmount
import cv2
import numpy as np #读取图片
img = cv2.imread("luo.png", cv2.IMREAD_GRAYSCALE)#获取图像宽和高
rows, cols = img.shape[:2]#画圆形
circle = np.zeros((rows, cols), dtype="uint8")
cv2.circle(circle, (int(rows/2),int(cols/2)), 100, 255, -1)#OpenCV图像或运算
result = cv2.bitwise_or(img, circle)#显示图像
cv2.imshow("original", img)
cv2.imshow("circle", circle)
cv2.imshow("result", result)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出如图4-4所示,原始图像与圆形进行或运算之后,提取了图像除中心原形之外的像素值。

五.图像非运算
图像非运算就是图像的像素反色处理,它将原始图像的黑色像素点转换为白色像素点,白色像素点则转换为黑色像素点,其函数原型如下:
- dst = bitwise_not(src1, src2[, dst[, mask]])
– src1表示第一张图像的像素矩阵
– src2表示第二张图像的像素矩阵
– dst表示输出的图像,必须和输入图像具有相同的大小和通道数
– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。
图像非运算的实现代码如下所示。
#coding:utf-8
import cv2
import numpy as np #读取图片
img = cv2.imread("Lena.png", cv2.IMREAD_GRAYSCALE)#OpenCV图像非运算
result = cv2.bitwise_not(img)#显示图像
cv2.imshow("original", img)
cv2.imshow("result", result)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
原始图像非运算之后输出如图4-5所示。

六.图像异或运算
逻辑异或运算(xor)是一个数学运算符,数学符号为“⊕”,计算机符号为“xor”,其运算法则为:如果a、b两个值不相同,则异或结果为1;如果a、b两个值相同,异或结果为0。
图像的异或运算是指两张图像(灰度图像或彩色图像均可)的每个像素值进行二进制“异或”操作,实现图像裁剪。其函数原型如下所示:
- dst = bitwise_xor(src1, src2[, dst[, mask]])
– src1表示第一张图像的像素矩阵
– src2表示第二张图像的像素矩阵
– dst表示输出的图像,必须和输入图像具有相同的大小和通道数
– mask表示可选操作掩码(8位单通道数组),用于指定要更改的输出数组的元素。
图像异或运算的实现代码如下所示。
#coding:utf-8
# By:Eastmount
import cv2
import numpy as np #读取图片
img = cv2.imread("luo.png", cv2.IMREAD_GRAYSCALE)#获取图像宽和高
rows, cols = img.shape[:2]#画圆形
circle = np.zeros((rows, cols), dtype="uint8")
cv2.circle(circle, (int(rows/2),int(cols/2)), 100, 255, -1)#OpenCV图像异或运算
result = cv2.bitwise_xor(img, circle)#显示图像
cv2.imshow("original", img)
cv2.imshow("circle", circle)
cv2.imshow("result", result)#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
原始图像与圆形进行异或运算之后输出如图4-6所示。

相关文章:
Python的图像算术与逻辑运算详解
一.图像加法运算 图像加法运算主要有两种方法。第一种是调用Numpy库实现,目标图像像素为两张图像的像素之和;第二种是通过OpenCV调用add()函数实现。第二种方法的函数原型如下: dst add(src1, src2[, dst[, mask[, dtype]]]) – src1表示第…...
WSL 下的 CentOS 装 Docker
WSL 下的 CentOS 装 Docker 卸载旧版本安装前的准备工作1. 安装 yum-utils2. 添加阿里云的 yum 镜像仓库3. 快速生成 Yum 缓存 安装Docker启动docker运行 hello-world卸载 Docker 引擎参考资料 卸载旧版本 sudo yum remove docker \ docker-client \ docker-client-latest \ d…...
v0.dev快速开发
探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之…...
python之字符串
创建字符串 s "Hello, World!"常用字符串操作 获取字符串长度 length len(s) print(length) # 输出: 13字符串拼接 s1 "Hello" s2 "World" s3 s1 ", " s2 "!" print(s3) # 输出: Hello, World!重复字符串 s …...
算法打卡 Day28(回溯算法)-组合总数 + 组合总数 Ⅱ+ 电话号码的字母组合
文章目录 Leetcode 17-电话号码的字母组合题目描述解题思路 Leetcode 39-组合总数题目描述解题思路 Leetcode 216-组合总数 Ⅲ题目描述解题思路 Leetcode 17-电话号码的字母组合 题目描述 https://leetcode.cn/problems/letter-combinations-of-a-phone-number/description/ …...
【Hadoop|MapReduce篇】MapReduce概述
1. MapReduce定义 MapReduce是一个分布式运算程序的编程框架,是用户开发“基于Hadoop的数据分析应用”的核心框架。 MapReduce核心功能是将用户编写的业务逻辑代码和自带默认组件整合成一个完整的分布式运算程序,并发运行在一个Hadoop集群上。 2. Map…...
设置Virtualbox虚拟机共享文件夹
由于工作环境的原因,选择Virtualbox的方式安装虚拟操作系统,常用的操作系统为ubuntu,不知道道友是否也曾遇到这样的问题,就是虚拟机和主机进行文件拖拽的时候,会因为手抖造成拖拽失败,虚拟机界面显示大个的…...
从零开始的机器学习之旅
尊敬的读者们,在这个快速发展的数字时代,机器学习无疑已经成为了科技领域的一颗璀璨明星。它如同一把打开未来之门的钥匙,让我们能够窥探到数据背后的无限可能。今天,我将带领大家开启一段从零开始的机器学习之旅,让我…...
开源还是封闭?人工智能的两难选择
这篇文章于 2024 年 7 月 29 日首次出现在 The New Stack 上。人工智能正处于软件行业的完美风暴中,现在马克扎克伯格 (Mark Zuckerberg) 正在呼吁开源 AI。 关于如何控制 AI 的三个强大观点正在发生碰撞: 1 . 所有 AI 都应该是开…...
Prometheus 服务监控
官网:https://prometheus.io Prometheus 是什么 Prometheus 是一个开源的系统监控和报警工具,专注于记录和存储时间序列数据(time-series data)。它最初由 SoundCloud 开发,并已成为 CNCF(云原生计算基金会…...
建模杂谈系列252 规则的串行改并行
说明 提到规则,还是需要看一眼RETE算法: Rete算法是一种用于高效处理基于规则的系统中的模式匹配问题的算法,广泛应用于专家系统、推理引擎和生产系统。它的设计目的是在大量规则和数据的组合中快速找到满足特定规则条件的模式。 Rete算法…...
0.ffmpeg面向对象oopc
因为查rtsp相关问题,接触了下ffmpeg源码,发现它和linux内核一样,虽然都是c写的,但是都是面向对象的思想,c的面向对象称之为oopc。 这让我想起来一件好玩的事,有些搞linux内核驱动的只会c的开发人员不知道l…...
KDD2024参会笔记-Day1
知乎想法:链接 听的第一场汇报:RAG Meeting LLMs 综述论文:https://arxiv.org/pdf/2405.06211 PPT:https://advanced-recommender-systems.github.io/RAG-Meets-LLMs/2024-KDD-RAG-Meets-LLM-tutorial-Part1.pdf 检索࿱…...
Java操作Elasticsearch的实用指南
Java操作Elasticsearch的实用指南 一、创建索引二、增删改查 一、创建索引 在ElasticSearch中索引相当于mysql中的表,mapping相当于表结构,所以第一步我们要先创建索引。 假设我们有一张文章表的数据需要同步到ElasticSearch,首先需要根据数据库表创建…...
数据库系统 第42节 数据库索引简介
数据库索引是数据库表中一个或多个列的数据结构,用于加快数据检索速度。除了基础的B-Tree索引,其他类型的索引针对特定的数据类型和查询模式提供了优化。以下是几种不同类型的索引及其使用场景的详细说明和示例代码。 1. 位图索引 (Bitmap Index) 位图…...
C++11 --- 智能指针
序言 在使用 C / C 进行编程时,许多场景都需要我们在堆上申请空间,堆内存的申请和释放都需要我们自己进行手动管理。这就存在容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题…...
C#顺序万年历自写的求余函数与周位移算法
static int 返回月的天数(int 年, int 月){return (月 2 ?(((年 % 4 0 && 年 % 100 > 0) || 年 % 400 0) ? 29 : 28) :(((月 < 7 && 月 % 2 > 0) || (月 > 7 && 月 % 2 0)) ? 31 : 30));}static int 返回年总天数(int 年, int 标 …...
【Java并发编程一】八千字详解多线程
目录 多线程基础 1.线程和进程 线程是什么? 为啥要有线程? 进程和线程的区别? Java 的线程 和 操作系统线程 的关系 使用jconsole观察线程 2.创建线程的多种方式 3.Thread类及其常见方法 Thread类的常见构造方法 Thread类的常见属性…...
CentOS 8FTP服务器
FTP(文件传输协议)是一种客户端-服务器网络协议,允许用户在远程计算机之间传输文件。这里有很多可用于Linux的开源FTP服务软件,最流行最常用的FTP服务软件有 PureFTPd, ProFTPD, 和 vsftpd。在本教程中,我们将在CentOS…...
C++ | Leetcode C++题解之第385题迷你语法分析器
题目: 题解: class Solution { public:NestedInteger deserialize(string s) {if (s[0] ! [) {return NestedInteger(stoi(s));}stack<NestedInteger> st;int num 0;bool negative false;for (int i 0; i < s.size(); i) {char c s[i];if …...
Win11Debloat开源工具:焕新Windows系统体验的极简优化指南
Win11Debloat开源工具:焕新Windows系统体验的极简优化指南 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter an…...
IQR四分位数法是什么?
一、核心概念:四分位数与IQR1. 四分位数(Quartiles)将一组有序数据(从小到大排列)划分为4个相等部分的三个关键分割点,分别记为:Q1(第一四分位数,25%分位数)&…...
源代码之下的硅基启示录——Claude Code“核泄漏”事件的深度剖析与时代回响
引言 公元2026年3月30日,一个看似平常的春日,硅基世界却迎来了一场史无前例的地震。 一家以“安全”为最高信条的AI公司,以一种最荒诞的方式,亲手打开了潘多拉的魔盒。Anthropic,这家估值高达3800亿美元的AI新贵&#…...
Go Routine 调度可视化分析
Go Routine调度可视化分析:揭开并发调度的神秘面纱 在Go语言中,Goroutine以其轻量级和高并发的特性成为开发者处理多任务的首选工具。Goroutine的调度机制对许多开发者来说仍然是一个“黑箱”,尤其是在高并发场景下,如何高效管理…...
Gitee:数字化转型浪潮中企业项目管理的战略级解决方案
在数字经济成为全球经济增长新引擎的背景下,企业数字化转型已从"选择题"变为"必答题"。项目管理工具作为数字化转型的基础设施,其重要性日益凸显。根据IDC最新预测,到2025年,中国数字经济规模将突破80万亿元&…...
Phi-4-mini-reasoning开发者调试手册:Chainlit后端日志定位、错误堆栈分析
Phi-4-mini-reasoning开发者调试手册:Chainlit后端日志定位、错误堆栈分析 1. 模型简介与部署验证 Phi-4-mini-reasoning 是一个基于合成数据构建的轻量级开源模型,专注于高质量、密集推理的数据,并进一步微调以提高更高级的数学推理能力。…...
药物研发新思路:共价对接工具AutoDock4实战指南(附避坑技巧)
药物研发新思路:共价对接工具AutoDock4实战指南(附避坑技巧) 在当今药物研发领域,共价抑制剂因其独特的作用机制和显著的治疗优势正受到前所未有的关注。与传统非共价药物相比,这类分子能与靶蛋白形成稳定的共价键&…...
别再用Delay了!用GD32的TIMER5实现精准1ms定时,让你的嵌入式程序更高效
告别阻塞式延时:用GD32 TIMER5构建高效嵌入式系统心跳 在嵌入式开发中,时间管理如同系统的心跳,决定了整个应用的响应速度和执行效率。许多开发者习惯使用delay_ms()这类阻塞式延时函数,却不知这会让CPU陷入无意义的等待状态&…...
WPF进阶:Canvas动态图形绘制与交互实现
1. Canvas动态图形绘制基础 WPF中的Canvas就像一块无限延伸的画布,我们可以在这块画布上自由地绘制各种图形元素。与静态绘制不同,动态绘制的魅力在于图形能够根据用户操作实时变化。我刚开始接触Canvas时,最让我兴奋的就是看到鼠标移动时能实…...
OpenTiny NEXT 前端智能化系列直播征文开启,带你系统学习 AI 前端与 WebAgent
🔥个人主页:杨利杰YJlio❄️个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》 《Python》 《Kali Linux》《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更…...
