python opencv读取图像矩阵加减乘除操作
python opencv读取图像矩阵加减乘除操作
# This is a sample Python script. # Press Shift+F10 to execute it or replace it with your code. # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. def print_hi(name): # Use a breakpoint in the code line below to debug your script. print(f'Hi, {name}') # Press Ctrl+F8 to toggle the breakpoint. # Press the green button in the gutter to run the script. if __name__ == '__main__': print_hi('nice day') import cv2 print(cv2.__version__) # image = cv2.imread("D:\\deep_learning\\qiqiu\\qiqiu.jpg") image = cv2.imread(r"D:\deep_learning\qiqiu\qiqiu.jpg") # cv2.imshow("img", image) # cv2.waitKey(0) from numpy import * import numpy as np z = np.zeros((2, 4), np.uint8) print(type(z)) print(z) o=np.ones((2,4),np.int32) print(o) m= np.array([[3,5,3,1], [11,22,55,66]],np.float32) #初始化浮点矩阵 print('-------三维矩阵------------') #三维矩阵 m3 = np.array( [ [[1,2,3,5], [2,4,5,8]], [[11,22,33,55], [33,22,77,65]] ],np.float32) print(m3) #获取行列 print('获取行列',m.shape) print(m3.shape) print(m.dtype) print('m的0行1列:',m[0,1]) #获取某行所有值 print('获取某行所有值',m[1,:]) print('获取某列所有值', m[:, 1]) print(m) print('获取矩形区域所有值\n', m[0:2, 1:3]) #注意:区间范围是左闭右开的,假如行区间是0∶2,其实是指第0行和第1行,不包 #括第2行;而1∶3其实是指第1列和第2列,不包括第3列。 print('获取三维矩阵的值,第0列(获取到的是二维数组):\n',m3[:,:,0]) print('获取三维矩阵的值,第1个二维数组:\n', m3[1, :, :]) #构造2行3列的矩阵 #m = cv2.Mat(2,3,cv2.CV_32FC(1)) #m2 = cv2.Mat(cv2.Size(3,2),cv2.CV_32FC(1)) #使用create实现mat对象构造 #m_create = cv2.Create(2,3,cv2.CV_32FC1) #其中类型CV_32FC(1)和CV_32FC1的写法都可以。 #o1= cv2.ones(2,3,cv2.CV_32FC1) a1 = np.array([1,2,3]) m = mat(a1) print('m:\n',m) o2 = ones((2,4),int32) #默认是浮点型的数据,如果需要int类型,则可以使用dtype=int print('o2',o2) data1 = mat(zeros((3,3))) print('data1:\n',data1) o3 = ones((2,3),int) print(o3) data2 = mat(random.rand(2, 3)) print('随机生成2行3列浮点数:\n', data2) data2a = mat(random.randint(10, size=(3, 3))) print('生成1个3x3的0-10之间的随机整数矩阵\n', data2a) data2c = mat(random.randint(1,5, size=(3, 5))) print('生成1个3x3的1-5之间的随机整数矩阵\n', data2c) print('numpy行数:',data2c.shape[0]) print('numpy列数:', data2c.shape[1]) #ndarry加法 src1 = np.array([[1,2,3],[4,5,6]],np.uint8) src2 = np.array([[1,1,1],[1,1,3]],np.uint8) dst = src1+src2 print('整数加法:\n', dst) # ndarry加法 src1a = np.array([[1, 1, 3], [4, 5, 6]], np.float32) src2a = np.array([[1, 1, 1], [1, 1, 3]], np.float32) dsta = src1a + src2a print('整数加法:\n', dsta) add_func = cv2.add(src1a,src2a,dtype= cv2.CV_32F) print('add函数:\n',add_func) #对于OpenCV中的函数的C++API,如果输入参数是Mat,则该函数的Py thon API输 #入参数就是对应的ndarray,所以对于矩阵的运算可以使用Numpy提供的函数,也可以使 #用OpenCV的Python API。 minus_2 = src1a-src2a print('减法:\n', minus_2) mul_func = np.multiply(src1a,src2a)#或者 dst = src1*src2 print('乘法:\n', mul_func) divide2 = src2a/src1a print('除法:\n',divide2) print('指定行列的值:',divide2[1,0])#ndarray,是数组 src1ac = np.array([[1, 2, 3], [4, 5, 6]], np.uint8) src2ac = np.array([[1, 1, 1], [1, 1, 3]], np.uint8) divide2c = src2ac/src1ac print('uint8除法\n',divide2c) divi_func = np.divide(src2ac,src1ac) print('uint8除法2\n', divi_func) #inf表示 除法的分母是0导致的异常 ndarray1 = np.array([[1, 2, 3], [4,5,6]], np.uint8) ndarray2 = np.array([[6,5],[4,3],[2,1]],np.uint8) #点乘 #矩阵乘法 np.dot mat_multi = np.dot(ndarray1, ndarray2) print("矩阵乘法dot函数:\n", mat_multi) log2_data = np.log(ndarray1) print('数据类型:\n', log2_data.dtype) print('对数结果:', log2_data) power_2 = np.array([[25,40],[10,100]],np.uint8) rst_power = np.power(power_2, 2) print('uchar类型输出的是错误结果:因为src是uchar类型的,经过幂指数运算的dst的数据类型仍然是uchar,' '所以将大于255的数值截断为255了\n', rst_power) rst_power2 = np.power(power_2, 2.0) print('改成2.0后float输出的正确结果:\n', rst_power2) '''段注释:幂指数是2和2.0时,返回的结果有很大不同,所以幂指数的数 据类型对于power返回的ndarray的数据类型影响很大,为了不损失精度,将幂指数设为 浮点型即可 ''' """ 段注释:幂指数是2和2.0时,返回的结果有很大不同,所以幂指数的数 据类型对于power返回的ndarray的数据类型影响很大,为了不损失精度,将幂指数设为 浮点型即可 """ # See PyCharm help at https://www.jetbrains.com/help/pycharm/
欢迎讨论,相互学习。
cdtxw@foxmail.com