【1】引言
前序学习进程中,已经掌握了两张图片按位与操作的基本技巧:
python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客
【2】cv2.bitwise_and()函数实现图像按位与运算原理
【2.1】图像运算
在前述学习过程中,我们只是使用了cv2.bitwise_and()函数,其实未曾深入探究其根本原理。
为实现原理探索,直接使用彩色图像为研究对象。因为彩色图像本身由三个通道,所以第二张图片的掩模设置可以相对复杂一些。
首先给出完整代码:
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块
# 读取图片-直接转化灰度图
src = cv.imread('srcp.png') #读取图像
dst=src#输出图像
# 定义图像
image = np.zeros(src.shape, np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
print('像素大小为',src.shape)
image[100:200, :, :] = 255 # 第一个通道值
image[:,100:350,: ] = 200 # 第二个通道值
image[:, :, 0] = 55 # 第三个通道值
img=cv.bitwise_and(src,image) #与运算
#显示BGR值
print("dst像素数为[150,150]位置处的BGR=", dst[150,150]) # 获取像素数为[100,100]位置处的BGR
print("image像素数为[150,150]位置处的BGR=", image[150,150]) # 获取像素数为[100,100]位置处的BGR
print("img像素数为[150,150]位置处的BGR=", img[150,150]) # 获取像素数为[100,100]位置处的BGR
#合并图像
himg=np.hstack((src,img))
# 显示和保存定义的图像
cv.imshow('display-and-src', dst) # 显示图像
cv.imshow('display-and', img) # 显示图像
cv.imwrite('display-and.png', img) # 保存图像
cv.imshow('display-and-image', image) # 显示图像
cv.imwrite('display-and-image.png', image) # 保存图像
cv.imshow('display-and-himg', himg) # 显示图像
cv.imwrite('display-and-himg.png', himg) # 保存图像
cv.waitKey() # 图像不关闭
cv.destroyAllWindows() # 释放所有窗口
定义图像使用的代码为:
# 定义图像
image = np.zeros(src.shape, np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
print('像素大小为',src.shape)
image[100:200, :, :] = 255 # 第一个通道值
image[:,100:350,: ] = 200 # 第二个通道值
image[:, :, 0] = 55 # 第三个通道值
这段代码表示,在第100行到200行的区域,BGR值取255,为纯白色;在第100列到350列,BGR值取200,为灰白色,这两个颜色条相叠加,是一个全新颜色的十字条状。
最后一行表示0通道的值为55。
如果不能理解这段代码的最后一行,可以通过下述链接回忆:
python学opencv|读取图像(十)用numpy创建彩色图像_python新建一张caise的图片-CSDN博客
代码运行以后,获得的自定义图像image为:
图1 自定义带掩模效果的图像
函数运行使用的原图为:
图2 原图
经过按位与运算后的图像为:
图3 按位与运算后图像
为探究cv2.bitwise_and()函数的基本原理,读取了特定点的BGR:
图4 特定点BGR
dst为原图,image为自定义的带掩模效果的第二张图,img为使用cv2.bitwise_and()函数进行按位与运算后图像。
【2.2】原理研究
像素点[150,150]刚好在image自定义的带掩模效果的区域中间,所以这个像素点具有代表意义。
为探究两个数组[152,197,236]和[55,200,200]按位与运算后获得[16,192,200]的进程,新编写代码为:
import numpy as np #引入numpy模块
a = [152, 197, 236] #矩阵
b = [255, 200, 200] #矩阵
for i in range(3): #计数
print('a','[',i,']=',a[i],'的二进制转化值=', bin(a[i]), ',b=','[',i,']=', b[i],'的二进制转化值=',bin(b[i])) #输出二进制转化值
print('a',[i],'&b',[i],'=',np.bitwise_and(a[i],b[i])) #输出按位与计算值
代码运行后的输出效果为:
图5 按位与运算
图5显示了按位与运算的过程,实际上bitwise_and()函数先将十进制数转化为二进制数,然后再对二进制数按位进行与运算,最后的输出是将二进制数又转化为十进制数。
【3】总结
bitwise_and()函数,先对各个像素点的BGR数值进行二进制转化,然后按位进行与运算,最后把与运算结果又转回为十进制数据,由此实现了图像的按位与运算叠加效果。