面向python,Opencv学习笔记(一)---1

本文通过Numpy_Attributes.py和Numpy_Operations.py展示了Numpy中ndarray对象的属性使用及数组操作,并在Compare_opencv_numpy.py中对比了OpenCV与Numpy在通道分离和颜色转换上的效率。实验结果显示,Numpy的部分函数在处理速度上优于OpenCV。同时,文章提供了图像的像素访问、裁剪和随机数生成等实用示例。
摘要由CSDN通过智能技术生成

前言

要求opencv版本4.1.2.30(4.x >=版本),我的版本4.5.3
Numpy并非opencv重点,这里仅介绍相关函数的简单使用方法

1.1 Numpy_Attributes.py中ndarray对象常用属性的使用示例

ndarrary.shape
ndarray.dtype
ndarray.ndim
ndarray.size

1.2 Numpy_Attributes.py

代码如下:

import cv2 as cv
import sys

if __name__ =='__main__':
    img  = cv.imread('./chapter_2/flower.jpg')
    if img is None:
        print('Failed to read flower.jpg')
        sys.exit()
    else:
        print('图像形状:{}\n 元素数据类型:{}\n 图像通道数:{}\n 像素总数:{}'.format(img.shape,img.dtype,img.ndim,img.size))
        

1.3 结果

在这里插入图片描述

2.1 Numpy_Operations.py中Numpy相关函数的操作示例

np.arrary() 创建数据
np.zeros() 创建全0矩阵
np.ones() 创建全1矩阵
img[x1:x2,y1:y2] 图片裁剪操作左上角坐标(x1,y1)右下角坐标(x2,y2)
np.random.randint() 给定范围内的随机整数
np.random.randn() 服从均值为0,标准差为1的正态分布数据

有关操作见下代码

2.2 Numpy_Operations.py

代码如下:

import cv2 as cv
import numpy as np
import datetime
import sys

if __name__ == '__main__':
    #创建ndarray对象
    #使用np.array()创建一个5*5,数据类型为float32的对象(矩阵)
    a = np.array([[1,2,3,4,5],
    [6,7,8,9,10],
    [11,12,13,14,15],
    [16,17,18,19,20],
    [21,22,23,24,25]],dtype='float32')
    #使用np.ones()创建一个5*5,数据类型为uint8的全1对象
    b = np.ones((5,5),dtype='uint8')
    #使用np.zeros()创建一个5*5,数据类型为float32的全0对象
    c = np.zeros((5,5),dtype='float32')
    print(f'a:\n{a}')
    print(f'b:\n{b}')
    print(f'c:\n{c}')

    #ndarray对象切片和索引
    image = cv.imread('./chapter_2/flower.jpg')
    if image is None:
        print('Failed to read flower.jpg')
        sys.exit()
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    #读取图像位于(45,45)的像素值
    print('位于(45,45)的像素值为{}'.format(gray[45,45]))
    #裁剪部分图像(灰度图像和rgb图像)
    res_gray = gray[40:280,60:340]
    res_color1=image[40:280,60:360,:]
    res_color2=image[100:220,80:220,:]

    #通道分离

    b = image[:,:,0]
    g = image[:,:,1]
    r = image[:,:,2]

    #展示裁剪和分离结果
    cv.imshow('Result crop gray',res_gray)
    cv.imshow('Result crop color1',res_color1)
    cv.imshow('Result crop color2',res_color2)
    cv.imshow('Ressult split b',b)
    cv.imshow('Result split g',g)
    cv.imshow('Result split r',r)

    #生成随机数
    #生成一个5*5,取值范围为0~100的数组
    values1 = np.random.randint(0,100,(5,5),dtype='uint8')
    #生成一个2*3,元素服从均值为0,标准差为1,的正态分布的数组
    values2 = np.random.randn(2,3)
    print(f'生成随机数(np.random.randint):\n{values1}')
    print(f'生成随机数(np.random.randn):\n{values2}')

    cv.waitKey(0)
    cv.destroyAllWindows()

2.3 结果

在这里插入图片描述

在这里插入图片描述

3.1 numpy的部分函数快于Opencv(使用numpy函数原因吧。)

3.2 Compare_opencv_numpy.py中的Opencv/Numpy对比示例

import cv2 as cv
import numpy as np
import datetime
import sys

from numpy.lib.type_check import _imag_dispatcher

if __name__ =='__main__':
    image = cv.imread('./chapter_2/flower.jpg')
    if image is None:
        print('Failed to read flower.jpg')
        sys.exit()

    #对比通道的分离
    #使用Opencv中的cv.split()函数
    begin1=datetime.datetime.now()
    for i in range(100000):
        b1,g1,r1= cv.split(image)
    end1 = datetime.datetime.now()
    print('通道分离(Opencv):{}s'.format((end1-begin1).total_seconds()))

    #使用numpy中的切片和索引
    begin2 = datetime.datetime.now()
    for i in range(100000):
        b2 = image[:,:,0]
        g2 = image[:,:,1]
        r2 = image[:,:,2]
    end2 = datetime.datetime.now()
    print('通道分离(Numpy):{}s'.format((end2-begin2).total_seconds()))

    #将BGR图像转化为RGB图像
    #使用Opencv中的cv.cvtColor()函数
    begin3 = datetime.datetime.now()
    for i in range(100000):
        image_rgb = cv.cvtColor(image,cv.COLOR_BGR2RGB)
    end3 = datetime.datetime.now()
    print('BGR转RGB(Opencv):{}s'.format((end3-begin3).total_seconds()))
    #使用Numpy中的切片和索引

    begin4 = datetime.datetime.now()
    for i in range(100000):
        image = rgb = image[:,:,::-1]
    end4 = datetime.datetime.now()
    print('BGR转RGB(Numpy):{}s'.format((end4-begin4).total_seconds()))



3.3 结果对比:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值