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/

 

posted @ 2024-02-05 13:37  txwtech  阅读(89)  评论(0编辑  收藏  举报