欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

open cv2学习(二):Numpy模块介绍以及图像的创建

程序员文章站 2022-05-30 10:15:58
...

一、Numpy(Numerical Python)

是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。使用前需导入numpy模块

二、相关方法

(1)创建矩阵

    import numpy as np      # 导入模块          
    a1 = np.array([1, 3, 2])   # 创建一维array对象          
    # 创建一个2 x 3 矩阵 , 输入参数实际为列表或元组,列表或元组内部元素又是列表或元组数值          
    a2 = np.array([1, 3, 2], [4, 3, 6])   # 创建二维array对象       

   
  

(2)矩阵元素获取

    A、获取矩阵的行数和列数             
       size = a1.shape()          # 返回元组(1, 0)        
    B、获取一维矩阵的第三个元素             
       b1 = a1[2]               
    C、获取二维矩阵的第二行             
       b2 = a2[1]   或 b2 = a2[1, ]  或 b2 = a2[1, :]            
    D、获取二维矩阵的第二列            
       b3 = a2[:, 1]               # 注:返回值为行向量形式       
    E、获取二维矩阵的第1,2行的第3,4两列            
       b4 = a2[0:2, 2:4]        
    F、获取二维矩阵的第二行第三个元素          
       b3 = a2[1, 2]        

(3)按条件截取 ------按条件截取其实是在[](方括号)中传入自身的布尔语句

   import numpy as np          
   a3 = np.array([[1, 3, 2], [4, 3, 6], [7,5,3]])           
   c1 = a3 > 2           
   print(c1)          
   # 返回布尔值矩阵         
   [[False  True False]          
   [ True  True  True]          
   [ True  True  True]]          
   c2 = a3[a3 > 2]          
   print(c2)
   # 返回满足条件的一维列表          
   [3 4 3 6 7 5 3]         

(4)矩阵的合并

     按行合并-----np.hstack([矩阵1, 矩阵2]) 或   np.hstack((矩阵1, 矩阵2))         
     按列合并-----np.vstack([矩阵1, 矩阵2]) 或   np.vstack((矩阵1, 矩阵2))        
     
     矩阵合并也可用concatenate方法            
     np.concatenate( (矩阵1, 矩阵2), axis=0 ) 等价于 np.vstack( (矩阵1, 矩阵2) )           
     np.concatenate( (矩阵1, 矩阵2), axis=1 ) 等价于 np.hstack( (矩阵1, 矩阵2) )             
   import numpy as np         
   a1 = np.array([[7, 5, 2], [4, 2, 5]])         
   a2 = np.array([[1, 3, 2], [4, 3, 6]])         
   h = np.hstack([a1, a2])  或 h = np.hstack((a1, a2))# 按行合并            
   print(h)             
   #返回         
   [[7 5 2 1 3 2]          
    [4 2 5 4 3 6]]         
   v = np.vstack([a1, a2])  或 h = np.vstack((a1, a2))# 按列合并               
   print(v)             
   #返回         
   [[7 5 2]          
    [4 2 5]          
    [1 3 2]          
    [4 3 6]]

(5)通过函数常见矩阵

    A、通过linspace(a,b,c)方法创建等差数列,首位为a,末位为b,包含c个元素的等差数列             
       a1 = np.linspace(2, 10, 5)          # 返回[  2.   4.   6.   8.  10.]        
    B、通过logspace(a,b,c)方法创建等比数列,首位为a^2, 末位为b^5, 包含c个元素的等比数列            
       a2 = np.logspace(2, 5, 4)         # 返回[    100.    1000.   10000.  100000.]               
    C、通过ones方法创建全1矩阵             
       a3 = np.ones(3,4)                   # 创建3*4的全 1 矩阵         
    D、通过zeros方法创建全0矩阵             
       zeros(shape, dtype=float, order='C')                        
         shape:为 H * W *3,即 高度 * 宽度 * 3通道 或者 行数 * 列数 *3通道                       
         返回:返回来一个给定形状和类型的用0填充的数组;             
       a3 = np.zeros(3,4)                # 创建3*4的全 0 矩阵                    
    E、通过eye方法创建单位矩阵             
       a3 = np.eye(3,4)                  # 创建3*4的单位矩阵       
    F、通过fromstring方法将字符串转换成array对象,可以将字符批量转换成ASCII码             
       a = "abcdef"                    
       b = np.fromstring(a,dtype=np.int8)       # 因为一个字符为8为,所以指定dtype为np.int8             
       print(b)                   # 返回 [ 97  98  99 100 101 102]        
    G、通过fromfunction方法根据行号和列号生成矩阵             
       def f1(i,j):                    
       return i+j             
       a = np.fromfunction(func,(5,6))             # 第一个参数为指定函数,第二个参数为列表list或元组tuple,说明矩阵的大小             
       print(a)                   
       # 返回             
       [[ 0.  1.  2.  3.  4.  5.]             
        [ 1.  2.  3.  4.  5.  6.]             
        [ 2.  3.  4.  5.  6.  7.]             
        [ 3.  4.  5.  6.  7.  8.]            
        [ 4.  5.  6.  7.  8.  9.]]

三、矩阵运算 (对每个元素的运算)

  1. np.sin(a)-----对矩阵a中的每个元素取正弦, sin(x)

  2. np.cos(a)-----对矩阵a中的每个元素取余弦, cos(x)

  3. np.tan(a)-----对矩阵a中的每个元素取正切, tan(x)

  4. np.arcsin(a)----对矩阵a中的每个元素取反正弦, arsin(x)

  5. np.arccos(a)-----对矩阵a中的每个元素取反余弦, arcos(x)

  6. np.arctan(a)-----对矩阵a中的每个元素取反正切, artan(x)

  7. np.sqrt(a)-------对矩阵a中的每个元素开方, sqrt(x)

四、矩阵元素的填充与矩阵转换

1.fill(n):对矩阵中的每个元素都填写为n

   import numpy as np
   m1 = np.ones([3,3],np.uint8)
   m1.fill(122.388)print(m1)
   '''输出结果
   [[ 122.38800049  122.38800049  122.38800049] 
    [ 122.38800049  122.38800049  122.38800049] 
    [ 122.38800049  122.38800049  122.38800049]] 
   若np.float32 改成 np.uint8,则输出结果为 
   [[122 122 122] [122 122 122] [122 122 122]]
   '''

2.reshape([n,m]):将原矩阵变成 n 行 m列的矩阵

   import numpy as np
   m1 = np.ones([3,3],np.uint8)
   m1.fill(122.388)
   m2 = m1.reshape([1,9]) #将矩阵变成1行9列的新矩阵
   print(m2)
   #输出结果为:
   [[122 122 122 122 122 122 122 122 122]]

五、利用zeros()方法以及ones()方法创建图像

  np.zeros([H,W,N],dtype) :创建一个 H*W 的N通道全0矩阵,dtype为数据类型       
  np.ones([H,W]):创建一个 H*W 的全1矩阵      

1.创建一个单通道图像

   import cv2
   import numpy as np
   def create_image():    
   '''方法一:利用zero()及ones()函数    
   img = np.zeros([400,400,1],np.uint8)    
   img[:,:,0] = np.ones([400,400]) * 127    
   '''    
   #方法二:直接利用ones()函数    
   img = np.ones([400,400,1],np.uint8)    
   img = img * 127         #乘127得到灰色图像,*0得到黑色图像,*255得到白色图像    
   cv2.imshow("New image",img)    
   print(img)create_image()
   cv2.waitKey(0)
   cv2.destroyAllWindows()

运行结果:
open cv2学习(二):Numpy模块介绍以及图像的创建

2.创建一个三通道图像

   import cv2
   import numpy as np
   def create_image():    
   img = np.zeros([400,400,3],np.uint8)    
   img[:,:,0] = np.ones([400,400])*255  #0修改第一个通道值使第一个通道值全为255,出现一个蓝色的图片    
   #img[:,:,1] = np.ones([400,400])*255 #1修改第二个通道值,出现一个绿色的图片    
   #img[:,:,2] = np.ones([400,400])*255 #2修改第三个通道值,出现一个红色的图片    
   cv2.imshow("New image",img)    
   print(img)create_image()
   cv2.waitKey(0)
   cv2.destroyAllWindows()

运行结果:
open cv2学习(二):Numpy模块介绍以及图像的创建

相关标签: open cv