在opencv中,调用numpy库,可以将图像以二维或三维数组表示,数组中的每一个值就是图像的像素值,所以可以通过numpy对数组的操作,实现对图像的处理。
所以第一步,导入库
import cv2
import numpy as np
先设置一个窗口名
cv2.namedWindow('HS') #'HS'背景框
在这个窗口创建黑色的数组
HS = np.zeros((600,480),np.uint8) #uint8是0-255的整数,是一种数据类型
在python中,黑色背景用numpy中的zeros函数表示,白色背景用numpy中的ones函数表示。
BS = np.ones((880,660),np.uint8)*255
因为用numpy库,所以加上np.
既然是数组,那么输出就需要用到print()
最后加上imshow和waitkey()
黑色背景:
cv2.namedWindow("BJ")
BJ = np.zeros((600,480),np.uint8)
print(BJ.shape)
cv2.imshow('BJ',BJ)
cv2.waitKey()
cv2.namedWindow('BS')
BS = np.ones((880,660),np.uint8)*255
print(BS.shape)
cv2.imshow('BS',BS)
cv2.waitKey()
框图大小由数组来改变。
cv2.namedWindow('BGR')
BGR = np.zeros((480,640,3),np.uint8)
cv2.imshow('BGR',BGR)
B = BGR.copy()
B[:,:,0] = 255
cv2.imshow('B',B)
G = BGR.copy()
G[:,:,1] = 255
cv2.imshow('G',G)
R = BGR.copy()
R[:,:,2] = 255
cv2.imshow('R',R)
cv2.waitKey()
前三行就是创建一个黑色背景框,有阿尔法通道
B = BGR.copy()
B[:,:,0] = 255
cv2.imshow('B',B)
将创建的窗口复制给B,前两个引号代表,将所有列和行全部选中,第三个0代表索引,这里有一个重点(三原色输出是按照RGB输出,但是输入需要反着来写,也就是BGR),此时0就是代表用第一个索引,也就是蓝。后两个同理
# cv2.namedWindow(('HB'))
# HB = np.zeros((480,640),np.uint8)
# for i in range(0,640,40):
# HB[:,i:i+20] = 255
# cv2.imshow('HB',HB)
# cv2.waitKey()
第三行,将整体分割,40个单位为一组,然后在内部进行分割,第一个冒号代表所有列都为黑色,第二个冒号代表将每组的行分割成以20个为一个白色
cv2.namedWindow('SJ')
SJ = np.random.randint(256,size = (480,640,3),dtype = uint8)
#256,因为用的是uint8类型,所以最大为2**8
#3代表三通道的颜色来填充,但不是全部
CS = np.random.randint(256,size = (480,640,3),dtype = np.uint8)
SJ = np.random.randint(256,size = (450,640),dtype = np.uint8)
cv2.imshow('CS',CS)
cv2.imshow('SJ',SJ)
cv2.waitKey()
包括加,减,乘,除,加权,对图像进行这些操作时,必须将图片大小统一,不然无法实现
cv2.divide(A,B)
图像加权/溶合 cv2.addWeighted(src1, alpha, src2, beta, gamma)
src1:图像1,背景图;
alpha:图像1加权;
src2:图像2;
beta:图像2加权;
gamma:附加常数
img = cv2.imread(r'E:\LianXi\3.jpg')
print(img.shape)
img2 = cv2.resize(img,(1080,1080))
print(img2.shape)
img1 = cv2.imread(r'E:\LianXi\5.jpg')
print(img1.shape)
J = cv2.add(img2,img1) #图片相加
j = cv2.subtract(img2,img1) #图像减法
c = cv2.multiply(img2,img1) #图像乘
C = cv2.divide(img2,img1) #图像除
q = cv2.addWeighted(img1,1,img2,1,10) #加权
cv2.imshow('q',q)
cv2.imshow('img2',img2)
cv2.imshow('img1',img1)
cv2.imshow('J',J)
cv2.imshow('j',j)
cv2.imshow('c',c)
cv2.imshow('C',C)
不算难,就不介绍了
还有一个小问题
两个图片相加再减去其中一张图片还能得到另外一张图片吗?
答案是不能的!
# x = cv2.subtract(J,img1) #相加再减
# cv2.imshow('x',x)
别忘记加上waitkey().....
与:cv2.bitwise_not(img1,mask=mask),相当于交集
a = np.zeros((200,200),np.uint8)
b = np.zeros((200,200),np.uint8)
a[20:100,20:100] = 255
b[45:120,45:120] = 255
b1 = cv2.bitwise_and(a,b)
cv2.imshow('a',a)
cv2.imshow('b',b)
cv2.imshow('b1',b1)
或:cv2.bitwise_and(img1,img2,mask=mask),相当于并集
a = np.zeros((200,200),np.uint8)
b = np.zeros((200,200),np.uint8)
a[20:100,20:100] = 255
b[45:120,45:120] = 255
cv2.imshow('a',a)
cv2.imshow('b',b)
c = cv2.bitwise_or(a,b)
cv2.imshow('c',c)
非:cv2.bitwise_or(img1,img2,mask=mask),就是取反
a = np.zeros((200,200),np.uint8)
b = np.zeros((200,200),np.uint8)
a[20:100,20:100] = 255
b[45:120,45:120] = 255
a1 = cv2.bitwise_not(a)
b1 = cv2.bitwise_not(b)
cv2.imshow('a',a)
cv2.imshow('b',b)
cv2.imshow('b1',b1)
cv2.imshow('a1',a1)
异或:cv2.bitwise_xor(img1,img2,mask=mask),相同为0(也就是黑),不同为1(也就是白),下图就是重合的地方为0,未重合就是1
a = np.zeros((200,200),np.uint8)
b = np.zeros((200,200),np.uint8)
a[20:100,20:100] = 255
b[45:120,45:120] = 255
cv2.imshow('a',a)
cv2.imshow('b',b)
d = cv2.bitwise_xor(a,b)
cv2.imshow('d',d)