opencv-numpy操作

在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()

opencv-numpy操作_第1张图片

cv2.namedWindow('BS')
BS = np.ones((880,660),np.uint8)*255
print(BS.shape)
cv2.imshow('BS',BS)
cv2.waitKey()

opencv-numpy操作_第2张图片

框图大小由数组来改变。

阿尔法通道:阿尔法有三原色,R,G,B(红,绿,蓝)

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就是代表用第一个索引,也就是蓝。后两个同理

opencv-numpy操作_第3张图片

黑白相间的条框:

# 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个为一个白色

opencv-numpy操作_第4张图片

 随机背景:

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.add(img1,img2)  使得图像更亮
图像的相减        cv2.subtract(A,B)       含义是 A B   使得图像更亮
图像的乘除        cv2.multiply (A,B)       

                                    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)

opencv-numpy操作_第5张图片

或: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)

 opencv-numpy操作_第6张图片

非: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)

 opencv-numpy操作_第7张图片

异或: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)

opencv-numpy操作_第8张图片

你可能感兴趣的:(numpy,opencv,python)