运营企业网站,2023免费推广入口,共享互助医疗网站建设,播州区住房城乡建设路的网站【0】基础定义
按位与运算#xff1a;两个等长度二进制数上下对齐#xff0c;全1取1#xff0c;其余取0。
按位或运算#xff1a;两个等长度二进制数上下对齐#xff0c;有1取1#xff0c;其余取0。 按位异或运算#xff1a; 两个等长度二进制数上下对齐#xff0c;相…【0】基础定义
按位与运算两个等长度二进制数上下对齐全1取1其余取0。
按位或运算两个等长度二进制数上下对齐有1取1其余取0。 按位异或运算 两个等长度二进制数上下对齐相同取0其余取1。 按位取反运算一个二进制数0变11变0。
【2】引言
在前序学习进程中调用cv2.bitwise()系列函数实现了图像的按位与计算相关文章链接包括且不限于
python学opencv|读取图像四十三使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客
python学opencv|读取图像四十五增加掩模使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客
python学opencv|读取图像四十六使用cv2.bitwise_or()函数实现图像按位或运算-CSDN博客
python学opencv|读取图像四十七使用cv2.bitwise_not()函数实现图像按位取反运算-CSDN博客
python学opencv|读取图像四十八使用cv2.bitwise_xor()函数实现图像按位异或运算-CSDN博客
图像的按位与计算是通过对各个像素点上的BGR值进行操作先把十进制数转化为二进制数再进行按位计算然后再转回十进制数输出。
由于前序文章的重点是对比按位计算前后图像的色彩变化除按位与计算外没有详细深究二进制按位计算过程。因此本文以之前按位与计算为基础对此展开专题探索。
按位与计算的原理探索文章链接为
python学opencv|读取图像四十三使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客
【3】项目可行性分析
以输入的外部图像为基础调用cv2.bitwise()系列函数让图像进行按位计算后读取相关点的BGR值使用np.bitwise()系列函数对cv2.bitwise()系列函数按位计算进行原理呈现。
【4】代码测试
首先引入相关模块和图像 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) 除了按位取反操作之外其他按位操作均需要在引入一张图像 # 定义第二个图像
image np.zeros(src.shape, np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
print(第二个图像像素大小为,image.shape)
image[50:350, :, :] 180 # 行掩模
image[:,120:200,: ] 255 # 列掩模
image[:, :, 2] 120 # 第二个通道值 然后要引入一个8位单通道的二维矩阵定义掩模 #定义掩模矩阵
mask np.zeros((gray_src.shape), np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
mask[280:350, :] 155 # 水平区域
mask[:,150:350] 100 # 竖直区域 之后就调用cv2.bitwise()系列函数执行按位计算 #执行位运算
#按位与运算
img_andcv.bitwise_and(src,image) #按位与运算
img_and_maskcv.bitwise_and(src,image,maskmask) #按位与运算
#按位或运算
img_orcv.bitwise_or(src,image) #按位或运算
img_or_maskcv.bitwise_or(src,image,maskmask) #按位或运算
#按位异或运算
img_xorcv.bitwise_xor(src,image) #按位异或运算
img_xor_maskcv.bitwise_xor(src,image,maskmask) #按位异或计算
#按位取反运算
img_notcv.bitwise_not(src) #按位取反运算
img_not_maskcv.bitwise_not(src,maskmask) #按位异或计算 按位计算执行以后图像的BGR值发生变化这时候使用np.bitwise()系列函数图像的BGR值进行按位计算以对cv2.bitwise()系列函数按位计算进行原理呈现 #显示BGR值
print(初始图像dst像素数为[300,180]位置处的BGR, dst[300,180],a) # 获取像素数为[100,100]位置处的BGR
print(第二个图像image像素数为[300,180]位置处的BGR, image[300,180],b) # 获取像素数为[100,100]位置处的BGR
print(img_and像素数为[300,180]位置处的BGR, img_and[300,180],c) # 获取像素数为[100,100]位置处的BGR
print(img_and_mask像素数为[300,180]位置处的BGR, img_and_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print(img_or像素数为[300,180]位置处的BGR, img_or[300,180],d) # 获取像素数为[100,100]位置处的BGR
print(img_or_mask像素数为[300,180]位置处的BGR, img_or_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print(img_xor像素数为[300,180]位置处的BGR, img_xor[300,180],e) # 获取像素数为[100,100]位置处的BGR
print(img_xor_mask像素数为[300,180]位置处的BGR, img_xor_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print(img_not像素数为[300,180]位置处的BGR, img_not[300,180],f) # 获取像素数为[100,100]位置处的BGR
print(img_not_mask像素数为[300,180]位置处的BGR, img_not_mask[300,180]) # 获取像素数为[100,100]位置处的BGRanp.zeros((1,3),np.uint8) #定义矩阵
adst[300,180] #将像素点BGR直接赋值给矩阵-初始图像
bnp.zeros((1,3),np.uint8) #定义矩阵
bimage[300,180] #将像素点BGR直接赋值给矩阵-第二个图像
cnp.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_and
dnp.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_or
enp.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_xor
fnp.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_not# 二进制按位与计算
for i in range(3): # 计数print(a, [0,, i, ], a[i], 的二进制转化值,bin(a[i])) # 输出二进制转化值print(b, [0,, i, ], b[i], 的二进制转化值,bin(b[i])) # 输出二进制转化值c[0, i] np.bitwise_and(a[i], b[i]) # 赋值按位与计算值print(c, [0,, i, ], c[0,i], 的二进制转化值, bin(c[0,i])) # 输出二进制转化值d[0, i] np.bitwise_or(a[i], b[i]) # 赋值按位或计算值print(d, [0,, i, ], d[0,i], 的二进制转化值, bin(d[0,i])) # 输出二进制转化值e[0, i] np.bitwise_xor(a[i], b[i]) # 赋值按位或计算值print(e, [0,, i, ], e[0, i], 的二进制转化值, bin(e[0, i])) # 输出二进制转化值f[0, i] np.bitwise_not(a[i]) # 赋值按位或计算值print(f, [0,, i, ], e[0, i], 的二进制转化值, bin(f[0, i])) # 输出二进制转化值print(c, [0, i], 是a[0,, i, ]和b[0, i, ]按位与的值np.bitwise_and(a[0,,i, ],b[0,,i,]), c[0, i]) # 输出按位与计算值print(d, [0, i], 是a[0,, i, ]和b[0, i, ]按位或的值np.bitwise_or(a[0,,i, ],b[0,,i,]), d[0, i]) # 输出按位或计算值print(e, [0, i], 是a[0,, i, ]和b[0, i, ]按位异或的值np.bitwise_xor(a[0,,i, ],b[0,,i,]), e[0, i]) # 输出按位异或计算值print(f, [0, i], 是a[0,, i, ]按位取反的值np.bitwise_not(a[0,,i, ]), f[0, i]) # 输出按位取反计算值# 输出矩阵结果
print(a, a) # 输出矩阵
print(b, b) # 输出矩阵
print(c, c) # 输出矩阵
print(d, d) # 输出矩阵
print(e, e) # 输出矩阵
print(f, f) # 输出矩阵 由于主要关注数值变化因此未直接显示相关图像其余代码可作为辅助学习使用 #合并图像
himg_and_andmask np.hstack((img_and,img_and_mask))
himg_or_ormask np.hstack((img_or,img_or_mask))
himg_xor_xormask np.hstack((img_xor,img_xor_mask))
himg_not_notmask np.hstack((img_not,img_not_mask))# 显示和保存定义的图像
#cv.imshow(dst, dst) # 显示图像
#cv.imshow(image, image) # 显示图像
#cv.imshow(mask, mask) # 显示图像
#cv.imshow(himg_and_andmask, himg_and_andmask) # 显示图像
#cv.imshow(himg_or_ormask, himg_or_ormask) # 显示图像
#cv.imshow(himg_xor_xormask, himg_xor_xormask) # 显示图像
#cv.imshow(himg_not_notmask, himg_not_notmask) # 显示图像cv.waitKey() # 图像不关闭
cv.destroyAllWindows() # 释放所有窗口 代码运行使用的相关图像有
图1 初始图像srcx.png 图2 第二张图像image.png 图3 掩模mask.png
代码运行后获得的相关文字输出为
图4 图像基本属性
图5 特定像素点BGR值读取
读取到特定像素点[300,180]处的BGR之后首先需要关注
初始图像在此处的BGR值为[132 80 121]
第二张图像在此处的BGR值为[255 255 120]
其余位置的数据其实是通过cv2.bitwise()系列函数按位计算之后获得的。为追溯这个计算过程继续获得了输出文字 图6 特定像素点BGR值-按位计算第一个点
需要注意的是 e[0,0]和f[0,0]在0b后面只有7位数字这是因为0b01111011在0b之后的0确实没有用处只有占位的作用所以python就直接省略了。 图7 特定像素点BGR值-按位计算第二个点
a[0,1]和c[0,1]在0b后面只有7位数字也是因为在0b之后的0确实没有用处只有占位的作用所以python就直接省略了。 图8 特定像素点BGR值-按位计算第二个点
e[0,2]是异或计算的结果两个二进制数上下对齐相同取0其余取1只有最右侧的位置不同其余均相同所以最后的结果是1。
f[0,2]是按位取反的结果虽然a[0,2]只有7位但首位的0取反之后就是1所以f[0,2]有8位数字。
此时的完整代码为
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)# 定义第二个图像
image np.zeros(src.shape, np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
print(第二个图像像素大小为,image.shape)
image[50:350, :, :] 180 # 行掩模
image[:,120:200,: ] 255 # 列掩模
image[:, :, 2] 120 # 第二个通道值#定义掩模矩阵
mask np.zeros((gray_src.shape), np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
mask[280:350, :] 155 # 水平区域
mask[:,150:350] 100 # 竖直区域#执行位运算
#按位与运算
img_andcv.bitwise_and(src,image) #按位与运算
img_and_maskcv.bitwise_and(src,image,maskmask) #按位与运算
#按位或运算
img_orcv.bitwise_or(src,image) #按位或运算
img_or_maskcv.bitwise_or(src,image,maskmask) #按位或运算
#按位异或运算
img_xorcv.bitwise_xor(src,image) #按位异或运算
img_xor_maskcv.bitwise_xor(src,image,maskmask) #按位异或计算
#按位取反运算
img_notcv.bitwise_not(src) #按位取反运算
img_not_maskcv.bitwise_not(src,maskmask) #按位异或计算#显示BGR值
print(初始图像dst像素数为[300,180]位置处的BGR, dst[300,180],a) # 获取像素数为[100,100]位置处的BGR
print(第二个图像image像素数为[300,180]位置处的BGR, image[300,180],b) # 获取像素数为[100,100]位置处的BGR
print(img_and像素数为[300,180]位置处的BGR, img_and[300,180],c) # 获取像素数为[100,100]位置处的BGR
print(img_and_mask像素数为[300,180]位置处的BGR, img_and_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print(img_or像素数为[300,180]位置处的BGR, img_or[300,180],d) # 获取像素数为[100,100]位置处的BGR
print(img_or_mask像素数为[300,180]位置处的BGR, img_or_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print(img_xor像素数为[300,180]位置处的BGR, img_xor[300,180],e) # 获取像素数为[100,100]位置处的BGR
print(img_xor_mask像素数为[300,180]位置处的BGR, img_xor_mask[300,180]) # 获取像素数为[100,100]位置处的BGR
print(img_not像素数为[300,180]位置处的BGR, img_not[300,180],f) # 获取像素数为[100,100]位置处的BGR
print(img_not_mask像素数为[300,180]位置处的BGR, img_not_mask[300,180]) # 获取像素数为[100,100]位置处的BGRanp.zeros((1,3),np.uint8) #定义矩阵
adst[300,180] #将像素点BGR直接赋值给矩阵-初始图像
bnp.zeros((1,3),np.uint8) #定义矩阵
bimage[300,180] #将像素点BGR直接赋值给矩阵-第二个图像
cnp.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_and
dnp.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_or
enp.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_xor
fnp.zeros((1,3),np.uint8) #定义矩阵-np.bitwise_not# 二进制按位与计算
for i in range(3): # 计数print(a, [0,, i, ], a[i], 的二进制转化值,bin(a[i])) # 输出二进制转化值print(b, [0,, i, ], b[i], 的二进制转化值,bin(b[i])) # 输出二进制转化值c[0, i] np.bitwise_and(a[i], b[i]) # 赋值按位与计算值print(c, [0,, i, ], c[0,i], 的二进制转化值, bin(c[0,i])) # 输出二进制转化值d[0, i] np.bitwise_or(a[i], b[i]) # 赋值按位或计算值print(d, [0,, i, ], d[0,i], 的二进制转化值, bin(d[0,i])) # 输出二进制转化值e[0, i] np.bitwise_xor(a[i], b[i]) # 赋值按位或计算值print(e, [0,, i, ], e[0, i], 的二进制转化值, bin(e[0, i])) # 输出二进制转化值f[0, i] np.bitwise_not(a[i]) # 赋值按位或计算值print(f, [0,, i, ], e[0, i], 的二进制转化值, bin(f[0, i])) # 输出二进制转化值print(c, [0, i], 是a[0,, i, ]和b[0, i, ]按位与的值np.bitwise_and(a[0,,i, ],b[0,,i,]), c[0, i]) # 输出按位与计算值print(d, [0, i], 是a[0,, i, ]和b[0, i, ]按位或的值np.bitwise_or(a[0,,i, ],b[0,,i,]), d[0, i]) # 输出按位或计算值print(e, [0, i], 是a[0,, i, ]和b[0, i, ]按位异或的值np.bitwise_xor(a[0,,i, ],b[0,,i,]), e[0, i]) # 输出按位异或计算值print(f, [0, i], 是a[0,, i, ]按位取反的值np.bitwise_not(a[0,,i, ]), f[0, i]) # 输出按位取反计算值# 输出矩阵结果
print(a, a) # 输出矩阵
print(b, b) # 输出矩阵
print(c, c) # 输出矩阵
print(d, d) # 输出矩阵
print(e, e) # 输出矩阵
print(f, f) # 输出矩阵#合并图像
himg_and_andmask np.hstack((img_and,img_and_mask))
himg_or_ormask np.hstack((img_or,img_or_mask))
himg_xor_xormask np.hstack((img_xor,img_xor_mask))
himg_not_notmask np.hstack((img_not,img_not_mask))# 显示和保存定义的图像
#cv.imshow(dst, dst) # 显示图像
#cv.imshow(image, image) # 显示图像
#cv.imshow(mask, mask) # 显示图像
#cv.imshow(himg_and_andmask, himg_and_andmask) # 显示图像
#cv.imshow(himg_or_ormask, himg_or_ormask) # 显示图像
#cv.imshow(himg_xor_xormask, himg_xor_xormask) # 显示图像
#cv.imshow(himg_not_notmask, himg_not_notmask) # 显示图像cv.waitKey() # 图像不关闭
cv.destroyAllWindows() # 释放所有窗口
综上所述
a.图像的按位与计算是通过对各个像素点上的BGR值进行操作先把十进制数转化为二进制数再进行按位计算然后再转回十进制数输出。
b.使用np.bitwise()系列函数对cv2.bitwise()系列函数按位计算进行原理呈现中继续发现python在输出二进制的过程中会省略0b之后紧跟的0。
【5】总结
专题探索了cv2.bitwise()系列函数按位计算时的BGR值二进制转化和按位计算过程。