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

【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】代码测试

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

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

python 复制代码
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)

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

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

然后进行按位取反运算:

python 复制代码
#按位取反运算
img=cv.bitwise_not(src) #按位取反运算
img2=cv.bitwise_not(src,mask=mask) #按位取反运算

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

python 复制代码
#显示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) #输出矩阵

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

python 复制代码
#合并图像
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()函数实现图像带掩模矩阵按位取反计算的技巧。

相关推荐
言乐620 分钟前
PythonLOLM自动生成复盘报告模型
开发语言·前端·数据库·人工智能·python
霸道流氓气质20 分钟前
HashiCorp Vault 与云 KMS 入门实战:动态密钥、SecretLeaseContainer 与 Java 集成完整指南
java·开发语言
水水不水啊25 分钟前
告别切换N个窗口调试:我用 Python + WebView 做了款现代化串口助手(含 TCP/UDP、波形、协议解析)
python·tcp/ip·udp
论文复现现场27 分钟前
DeepSeek V4.1 Flash 各平台价格怎么比?缓存、峰谷计费与 Python 成本计算
开发语言·python·缓存·大模型·成本优化·deepseek
xuxigifxfh28 分钟前
牛客:HJ21 简单密码
java·开发语言·算法
打工仔折腾 AI41 分钟前
鸿蒙平板远控电脑实测:ToDesk蓝牙键鼠、双模式鼠标与跨端剪贴板落地记录
人工智能·后端·python·性能优化·计算机外设·电脑·harmonyos
ESDWAN43 分钟前
海外股票网络环境优化与交易场景应用:从行情获取到交易系统稳定性设计
开发语言·网络·php
Metaphor69243 分钟前
Python 实用技巧:从零自主生成结构化 PDF 页面
python·pdf
西柚不烦恼1 小时前
jenkins版本和java版本的依赖
java·开发语言·jenkins
stellanke1 小时前
工业化C++:3. 继承、虚函数与运行时多态:从水果加工到日志策略设计
开发语言·c++