网站查询空间商,外贸网站海外推广3个必去网站,一个专做里番的网站,重庆网站排名公司【0】基础定义
按位与运算#xff1a;两个等长度二进制数上下对齐#xff0c;全1取1#xff0c;其余取0。按位或运算#xff1a;两个等长度二进制数上下对齐#xff0c;有1取1#xff0c;其余取0。
按位取反运算#xff1a;一个二进制数#xff0c;0变1,1变0。
【1】…【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) #读取图像
dstsrc #输出图像
gray_srccv.cvtColor(src,cv.COLOR_BGR2GRAY) #转化为灰度图
dstggray_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 # 竖直区域
然后进行按位取反运算
#按位取反运算
imgcv.bitwise_not(src) #按位取反运算
img2cv.bitwise_not(src,maskmask) #按位取反运算
然后进行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]位置处的BGRanp.zeros((1,3),np.uint8) #定义矩阵
adst[300,180] #将像素点BGR直接赋值给矩阵
bnp.zeros((1,3),np.uint8) #定义矩阵
bimg[300,180] #将像素点BGR直接赋值给矩阵
cnp.zeros((1,3),np.uint8) #定义矩阵
dnp.zeros((1,3),np.uint8) #定义矩阵
enp.zeros((1,3),np.uint8) #定义矩阵
eimg2[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) #输出矩阵
再把图像显示和输出即可
#合并图像
himgnp.hstack((src,img))
himg2np.hstack((src,img2))
himg3np.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】总结
掌握了pythonopencv实现使用cv2.bitwise_not()函数实现图像带掩模矩阵按位取反计算的技巧。