python学opencv|读取图像(四十七)使用cv2.bitwise_not()函数实现图像按位取反运算

news2025/2/1 4:58:12

【0】基础定义

按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。

按位取反运算:一个二进制数,0变1,1变0。

【1】引言

前序已经学习了cv2.bitwise_and()函数进行图像按位与计算和按位或运算,相关文章链接为:

python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客

python学opencv|读取图像(四十四)原理探究:bitwise_and()函数实现图像按位与运算-CSDN博客

python学opencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客

python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算-CSDN博客

在此基础上,我们尝试对单个图像操作“按位取反”,此处使用的函数为cv2.bitwise_not()。

【2】官网教程

【2.1】cv2.bitwise_not()函数

点击下方链接,直达函数cv2.bitwise_not()的官网教程:

OpenCV: Operations on arrays

官网对函数的说明页面为:

图1  cv2.bitwise_not()的官网教程

在cv2.bitwise_not()的官网教程可以看到,函数的参数说明为:

void cv::bitwise_not     (     InputArray     src,      #输入图像
        OutputArray     dst,                                      #输出图像
        InputArray     mask = noArray() )                 #掩模

在函数cv2.bitwise_not()中,也可以调用掩模效果,而且掩模为8位单通道二维矩阵。

【2.2】np.bitwise_not()函数

点击下方链接,可以=直达numpy官网对bitwise_not()函数的官网页面:numpy.bitwise_invert — NumPy v2.2 Manual

代码先后使用cv2.bitwise_not()函数和np.bitwise_not()函数来展示图像按位取反操作的基本原理。

【3】代码测试

参考前述学习进程中调用的代码,按照输入图像-按位取反-输出图像的顺序规划代码。

首先引入相关模块和图像:

import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块

# 读取图片-直接转化灰度图
src = cv.imread('srcx.png') #读取图像
dst=src #输出图像
gray_src=cv.cvtColor(src,cv.COLOR_BGR2GRAY) #转化为灰度图
dstg=gray_src #输出图像
print('初始图像像素大小为',src.shape)
print('初始图像灰度图像素大小为',gray_src.shape)

然后定义一个掩模矩阵,掩模矩阵直接使用引入图像的尺寸来约束大小:

#定义掩模矩阵
mask = np.zeros((gray_src.shape), np.uint8)  # 定义一个竖直和水平像素与初始图像等大的全0矩阵
mask[280:350, :] = 155  # 水平区域
mask[:,150:350] = 200  # 竖直区域

然后进行按位取反运算:

#按位取反运算
img=cv.bitwise_not(src) #按位取反运算
img2=cv.bitwise_not(src,mask=mask) #按位取反运算

然后进行BGR值的二进制取反运算验证:

#显示BGR值
print("dst像素数为[300,180]位置处的BGR=", dst[300,180])  # 获取像素数为[100,100]位置处的BGR
print("mask像素数为[300,180]位置处的BGR=", mask[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img像素数为[300,180]位置处的BGR=", img[300,180])  # 获取像素数为[100,100]位置处的BGR
print("img2像素数为[300,180]位置处的BGR=", img2[300,180])  # 获取像素数为[100,100]位置处的BGR

a=np.zeros((1,3),np.uint8) #定义矩阵
a=dst[300,180] #将像素点BGR直接赋值给矩阵
b=np.zeros((1,3),np.uint8) #定义矩阵
b=img[300,180] #将像素点BGR直接赋值给矩阵
c=np.zeros((1,3),np.uint8) #定义矩阵
d=np.zeros((1,3),np.uint8) #定义矩阵
e=np.zeros((1,3),np.uint8) #定义矩阵
e=img2[300,180] #将像素点BGR直接赋值给矩阵

#二进制按位取反计算
for i in range(3): #计数
    print('a','[0,',i,']=',a[i],'的二进制转化值= ', bin(a[i])) #输出二进制转化值
    c[0,i]=np.bitwise_not(a[i]) #赋值按位与计算值
    print('c','[0,',i,']=',c[0,i],'的二进制转化值=', bin(c[0,i])) #输出二进制转化值
    print('c',[0,i],'是a','[0,',i,']转到二进制后按位取反从,再二进制转回十进制=',c[0,i]) #输出按位与计算值
    print('b','[0,',i,']=',b[i],'的二进制转化值=', bin(b[i])) #输出二进制转化值
    d[0,i]=np.bitwise_not(b[i]) #赋值按位与计算值
    print('d', '[0,', i, ']=', d[0, i], '的二进制转化值=', bin(d[0, i]))  # 输出二进制转化值
    print('d', [0, i], '是b', '[0,', i, ']转到二进制后按位取反从,再二进制转回十进制=', d[0, i])  # 输出按位与计算值
    print('e','[0,',i,']=',[i],'的二进制转化值=', bin(e[i])) #输出二进制转化值
#输出矩阵结果
print('a=',a) #输出矩阵
print('b=',b) #输出矩阵
print('c=',c) #输出矩阵
print('d=',d) #输出矩阵
print('e=',e) #输出矩阵

再把图像显示和输出即可:

#合并图像
himg=np.hstack((src,img))
himg2=np.hstack((src,img2))
himg3=np.hstack((img,img2))
# 显示和保存定义的图像
cv.imshow('dst', dst)  # 显示图像
cv.imshow('or-img', img)  # 显示图像
cv.imwrite('or-img.png', img)  # 保存图像
cv.imshow('or-img2', img2)  # 显示图像
cv.imwrite('or-img2.png', img2)  # 保存图像

cv.imshow('or-mask', mask)  # 显示图像
cv.imwrite('or-mask.png', mask)  # 保存图像
cv.imshow('or-himg', himg)  # 显示图像
cv.imwrite('or-himg.png', himg)  # 保存图像
cv.imshow('or-himg2', himg2)  # 显示图像
cv.imwrite('or-himg2.png', himg2)  # 保存图像
cv.imshow('or-himg3', himg3)  # 显示图像
cv.imwrite('or-himg3.png', himg3)  # 保存图像
cv.waitKey()  # 图像不关闭
cv.destroyAllWindows()  # 释放所有窗口

代码运行使用的图像有:

图2  初始图像srcx.png

图3  掩模矩阵对应图像or-mask.png

 图4  图像不带掩模按位取反效果or-img.png

 图5  初始图像对比不带掩模按位取反图像

由图2、图4和图5可见,初始图像进行按位取反以后,颜色发生了显著变化。

如果添加掩模效果,会有:

 图6  图像带掩模按位取反效果or-img2.png

 图7  初始图像对比带掩模按位取反图像 

由图6和图7可见,初始图像叠加掩模效果进行按位取反以后,颜色发生了显著变化,但只保留了掩模所在区域的图像。

在此基础上,读取特定像素点的BGR值进行二进制取反操作:

图8 BGR值取反验证

图8中,代码调用np.bitwise_not()函数对BGR值执行了取反-再取反的验证过程,实践表明:

使用cv2.bitwise_not()函数执行图像按位取反计算时,各个像素点的BGR值都是按照十进制转二进制、二进制按位取反计算,然后再转回十进制的顺序进行。

图9  cv2.bitwise_not()函数实现图像带掩模矩阵按位取反计算

【4】细节说明

由于掩模矩阵是单通道二维矩阵,所以掩模本身只会在黑白色之间变化。

【5】总结

掌握了python+opencv实现使用cv2.bitwise_not()函数实现图像带掩模矩阵按位取反计算的技巧。

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

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

相关文章

Ability Kit(程序框架服务)

Ability Kit(程序框架服务)提供了应用程序开发和运行的应用模型,是系统为开发者提供的应用程序所需能力的抽象提炼,它提供了应用程序必备的组件和运行机制。有了应用模型,开发者可以基于一套统一的模型进行应用开发&am…

拦截器快速入门及详解

拦截器Interceptor 快速入门 什么是拦截器? 是一种动态拦截方法调用的机制,类似于过滤器。 拦截器是Spring框架中提供的,用来动态拦截控制器方法的执行。 拦截器的作用:拦截请求,在指定方法调用前后,根…

python爬虫入门(一) - requests库与re库,一个简单的爬虫程序

目录 web请求与requests库 1. web请求 1.1 客户端渲染与服务端渲染 1.2 抓包 1.3 HTTP状态代码 2. requests库 2.1 requests模块的下载 2.2 发送请求头与请求参数 2.3 GET请求与POST请求 GET请求的例子: POST请求的例子: 3. 案例:…

智慧园区管理平台实现智能整合提升企业运营模式与管理效率

内容概要 在当今数字化的背景下,智慧园区管理平台正逐渐成为企业提升运营效率和管理模式的重要工具。这个平台汇聚了多种先进技术,旨在通过智能整合各类资源与信息,帮助企业实现全面的管理创新。 智慧园区管理平台不仅仅是一个数据处理工具…

傅里叶分析之掐死教程

https://zhuanlan.zhihu.com/p/19763358 要让读者在不看任何数学公式的情况下理解傅里叶分析。 傅里叶分析 不仅仅是一个数学工具,更是一种可以彻底颠覆一个人以前世界观的思维模式。但不幸的是,傅里叶分析的公式看起来太复杂了,所以很多…

PVE 虚拟机安装 Debian 无图形化界面服务器

Debian 安装 Debian 镜像下载 找一个Debian镜像服务器,根据需要的版本和自己硬件选择。 iso-cd/:较小,仅包含安装所需的基础组件,可能需要网络访问来完成安装。有镜像 debian-12.9.0-amd64-netinst.isoiso-dvd/:较…

乐理笔记——DAY02

三分钟音乐社视频地址: 调号总结篇https://www.bilibili.com/video/BV14p4y1e7TV?spm_id_from333.788.videopod.episodes&vd_source0a2d366696f87e241adc64419bf12cab&p25https://www.bilibili.com/video/BV14p4y1e7TV?spm_id_from333.788.videopod.epis…

企业知识管理在推动组织变革与适应性发展中的关键性作用分析

内容概要 企业知识管理是信息时代背景下的重要管理理念,旨在通过有效地获取、分享和再利用知识,提升组织在变革中的灵活性和创新能力。知识作为企业的重要资产,其有效管理不仅影响到日常运营,更是推动组织变革与适应性发展的核心…

动态规划DP 最长上升子序列模型 登山(题目分析+C++完整代码)

概览检索 动态规划DP 最长上升子序列模型 登山 原题链接 AcWing 1014. 登山 题目描述 五一到了,ACM队组织大家去登山观光,队员们发现山上一共有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个…

芯片AI深度实战:进阶篇之vim内verilog实时基于AST的自定义检视

本文基于Editor Integration | ast-grep,以及coc.nvim,并基于以下verilog parser(my-language.so,文末下载链接), 可以在vim中实时显示自定义的verilog 匹配。效果图如下: 需要的配置如下: 系列文章: 芯片…

AI 计算的未来:去中心化浪潮与全球竞争格局重塑

引言 人工智能(AI)正以前所未有的速度发展,尤其是大模型训练和推理效率的提升,使得 AI 计算成本迅速下降,呈现出向去中心化演进的趋势。 最新的 DeepSeek r1 模型,以仅 600 万美元 的训练成本,达到了 OpenAI o1 级别的性能,表明 AI 技术正迈向更具普惠性的阶段。这一趋…

JxBrowser 8.2.2 版本发布啦!

JxBrowser 8.2.2 版本发布啦! • 已更新 #Chromium 至更新版本 • 实施了多项质量改进 🔗 点击此处了解更多详情。 🆓 获取 30 天免费试用。

BWM 世界模型

DGX AGX Ominiverse With Cosmos 功能 1w 张 H100 训练了 3个月 使用 Ray 串流 数据 数据准备 处理 pipeline 数组组成 真实世界的物理数据 训练 1、使用 L1 损失,最小化 输入和重构视频之间的像素级差异 以及基于 VGG19 的一个特征感知损失 2、使用光流的损…

【已解决】windows7虚拟机安装VMtools频繁报错

为了在虚拟机VMware中安装win7,题主先在网上下载了windows7 professional版本的镜像,在vmware中安装vmtools时报错,信息如下 (安装程序无法继续,本程序需要您将此虚拟机上安装的操作系统更新到SP1) 然后就…

【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂

目录 1. 常见运算函数 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…

【浏览器 - Mac实时调试iOS手机浏览器页面】

最近开发个项目,需要在 Mac 电脑上调试 iOS 手机设备上的 Chrome 浏览器,并查看Chrome网页上的 console 信息,本来以为要安装一些插件,没想到直接使用Mac上的Safari 直接可以调试,再此记录下,分享给需要的伙…

PyQt5之QtDesigner的若干配置和使用

1.描述 QtDesigner是一个可视化工具,可以通过该工具设计页面 2.简单使用 1.下载PyQt5-tools pip install pyqt5-tools 2.打开designer.exe文件 我采用的是虚拟环境,该文件位于C:\Users\24715\anaconda3\envs\pyqt\Lib\site-packages\qt5_applicatio…

侯捷C++day01

一个类该准备什么样的数据、函数。才能满足使用这个类人的需求。 inline关键字是建议编译器做inline处理。 private只有本类可以看到。 C创建对象会自动调用构造函数。不可能在程序中显示调用构造函数。不带指针的类多半不用写析构函数。 以下两个重载构造函数会发生错误 不允许…

CTF-web: phar反序列化+数据库伪造 [DASCTF2024最后一战 strange_php]

step 1 如何触发反序列化? 漏洞入口在 welcome.php case delete: // 获取删除留言的路径,优先使用 POST 请求中的路径,否则使用会话中的路径 $message $_POST[message_path] ? $_POST[message_path] : $_SESSION[message_path]; $msg $userMes…

Win11下帝国时代2无法启动解决方法

鼠标右键点图标,选择属性 点开始,输入启用和关闭