• Python第三方cv2库介绍


    Python第三方cv2库介绍

    CV2指的是OpenCV2(Open Source Computer Vision Library),是一个开源的库平台计算机视觉库。有很强大的图片处理功能,可实现图像处理和计算机视觉方面的很多通用算法。

    OpenCV官网文档 https://docs.opencv.org/4.1.2/d6/d00/tutorial_py_root.html
    中文文档http://www.woshicver.com/
     

    特别提示:安装的时候用 opencv_python,但在导入使用的时候使用 cv2。

    在Windows环境中Python模块(库、包)安装命令格式,在cmd中:

    [py -X.Y -m] pip install [-i 镜像网址] 模块(库、包)名

    其中[]部分表示可选的

    若安装了多个python版本,X.Y代表Python版本,多余的部分舍弃如3.8.1取3.8,3.10.5取3.10,即只取第二个点前的部分。仅安装了一个python版本不需要。

    使用镜像网址可以加快安装速度,常用的镜像网址

    清华:https://pypi.tuna.tsinghua.edu.cn/simple

    阿里云:https://mirrors.aliyun.com/pypi/simple/

    中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

    【参见https://blog.csdn.net/cnds123/article/details/104393385

    我这里使用 (我安装了多个python版本 要为3.10.0版本安装cv2库——opencv_python,使用阿里云镜像。安装的时候是 opencv_python,但在导入的时候采用 import cv2。):

    py -3.10 –m pip install -i https://mirrors.aliyun.com/pypi/simple/ opencv_python

    参见下图:

     最后,检测安装情况

    注意:使用cv2库的时候,文件名和路径不能有中文,一旦有中文就会有各种莫名其妙的错误!

    读入图片并显示

    读入一张图片函数:cv2.imread(filepath,flags)  

    其中filepath表示图片的路径

    flags表示要读入的是什么图片:

    (1)cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道(或者直接写1)

    (2)cv2.IMREAD_GRAYSCALE:读入灰度图片(或者直接写0)

    显示一张图片函数:cv2.imshow(window_name, image)  

    其中,第一个参数是窗口的名字,第二个参数是要显示的图像

    键盘绑定函数cv2.waitKey(delay)

    其中delay 的单位为ms毫秒,当 delay 取大于0的值时,程序在给定的 delay 时间内等待用户按键触发关闭图形显示窗口,或等到时间到关闭图形显示窗口。若设置delay为0,则代表等待按任意键关闭图形显示窗口。

    没有它,窗口会在程序完成是立即关闭图形显示窗口。

    提示,脱离IDLE环境时才能看到此函数的效果,如双击py脚本文件运。

    下面给出读入图片并显示之源码

    1. import cv2
    2. image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
    3. cv2.imshow("image1",image1)
    4. cv2.waitKey(0)

    运行之:

    将图像保存

    函数 cv2.imwrite() 用于将图像保存到指定的文件。

    cv2.imwrite(filename, img [, paras])

    参数说明:

    filename:要保存的文件的路径和名称,包括文件扩展名

    img:要保存的 OpenCV 图像,nparray 多维数组

    paras:不同编码格式的参数,可选项

    将彩色图片转成灰度图片保存

    源码如下:

    1. import cv2
    2. image1=cv2.imread(r"D:/cv2Demo/lotus2.png",0)
    3. cv2.imwrite(r"D:/cv2Demo/lotus2As.png",image1)

    图像缩放

    图像缩放函数cv2.resize(image, image2,dsize)

    输入原始图像,输出新图像,图像的大小)

    cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])

    参数说明:

    scr:变换操作的输入图像

    dsize: 输出图像的大小,二元元组 (width, height)

    dst:变换操作的输出图像,可选项

    fx, fy:x 轴、y 轴上的缩放比例,实型,可选项

    interpolation:插值方法,整型,可选项

    cv2.INTER_LINEAR:双线性插值(默认方法)

    cv2.INTER_AREA:使用像素区域关系重采样,缩小图像时可以避免波纹出现

    cv2.INTER_NEAREST:最近邻插值

    cv2.INTER_CUBIC:4x4 像素邻域的双三次插值

    cv2.INTER_LANCZOS4:8x8 像素邻域的Lanczos插值

    图像缩为原来1/4

    源码如下:

    1. import cv2
    2. image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
    3. print(image1.shape) #
    4. height, width = image1.shape[:2] # 获取图片的高度和宽度
    5. image2=cv2.resize(image1,(int(0.5*width), int(0.5*height)))
    6. print(image2.shape) #
    7. cv2.imwrite(r"D:/cv2Demo/lotus2Quarter.png",image2)#保存

    图像翻转

    图像翻转函数cv2.flip(src, flipCode[, dst])

    参数说明:

    scr:变换操作的输入图像

    flipCode:控制参数,整型(int),flipCode>0 水平翻转,flipCode=0 垂直翻转,flipCode<0 水平和垂直翻转

    dst:变换操作的输出图像,可选项

    图像翻转源码:

    1. import cv2
    2. image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
    3. imgFlip1 = cv2.flip(image1, 1) # 0垂直翻转 ;1水平翻转 ;-1水平和垂直翻转
    4. cv2.imshow("image2",imgFlip1)
    5. cv2.waitKey(0)

    图像旋转

    实现图像的直角倍数旋转函数cv2.rotate(src, rotateCode[, dst])

    cv2.rotate()以90度的倍数旋转2D阵列(array),速度很快。

    参数说明:

    src:变换操作的输入图像

    rotateCode:枚举,指定旋转角度。

      cv2.ROTATE_90_CLOCKWISE:顺时针旋转 90 度

      cv2.ROTATE_180: 旋转 180 度

      cv2.ROTATE_90_COUNTERCLOCKWISE:逆时针旋转 90 度

    dst:它是与src图像大小和深度相同的输出图像。它是一个可选参数。

    图像顺时针旋转90度源码:

    1. import cv2
    2. image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
    3. image2 = cv2.rotate(image1,cv2.ROTATE_90_CLOCKWISE) #顺时针旋转90度
    4. cv2.imshow("image2",image2)
    5. cv2.waitKey(0)

    下面介绍图像旋转任意角度,先介绍用到两个函数

    获取旋转变换矩阵函数cv2.getRotationMatrix2D(center, angle, scale)

    参数说明:

    center:旋转中心坐标,二元元组 (x0, y0)

    angle:旋转角度,单位为角度,逆时针为正数,顺时针为负数

    scale: 缩放因子

    利用变换矩阵对图像进行变换函数cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])

    其中:

    src - 输入图像。

    M - 变换矩阵。

    dsize - 输出图像的大小。

    flags - 插值方法的组合(int 类型!)

    borderMode - 边界像素模式(int 类型!)

    borderValue - (重点!)边界填充值; 默认情况下,它为0。

    下面介绍图像旋转任意角度的三种实现方法

    法一、图像旋转任意角度源码(有剪裁)

    源码如下:

    1. #图像旋转任意角度源码(有剪裁)
    2. import cv2
    3. #第一个参数穿opencv读取的图像,第二个参数传入需要旋转的角度
    4. def rotate_bound(image, angle):
    5. height, width = image.shape[:2] # 取前两个值(H,W)
    6. # 第一个参数旋转中心,第二个参数旋转角度,第三个参数缩放比例
    7. center = ( width//2,height//2) # 以图像中心为旋转中心
    8. scale = 1 # 等比例旋转,即旋转后尺度不变
    9. # 获得旋转矩阵
    10. M = cv2.getRotationMatrix2D(center, -angle, scale)
    11. # 进行仿射变换,其中
    12. #“,borderValue=(255,255,255)”定义边界填充色彩白色,省略默认黑色,相当于borderValue=(0,0,0)
    13. return cv2.warpAffine(image, M, (width, height),borderValue=(255,255,255))
    14. image1 = cv2.imread(r"D:/cv2Demo/lotus2.png")
    15. image2 = rotate_bound(image1, 45)
    16. cv2.imshow('image', image2) #显示图片
    17. cv2.waitKey(0)

    法二、图像旋转任意角度源码(无剪裁)

    源码如下:

    1. #图像旋转任意角度源码(无剪裁)
    2. import numpy as np
    3. import cv2
    4. #第一个参数穿opencv读取的图像,第二个参数传入需要旋转的角度
    5. def rotate_bound(image, angle):
    6. # 获取图像的尺寸,并确定中心
    7. (h, w) = image.shape[:2]
    8. (cX, cY) = (w // 2, h // 2)
    9. # 获取旋转矩阵(应用角度的负数以顺时针旋转)
    10. # 获取正弦和余弦(即矩阵的旋转分量)
    11. M = cv2.getRotationMatrix2D((cX, cY), -angle, 1.0)
    12. cos = np.abs(M[0, 0])
    13. sin = np.abs(M[0, 1])
    14. #计算图像的新边界尺寸
    15. nW = int((h * sin) + (w * cos))
    16. nH = int((h * cos) + (w * sin))
    17. # 调整矩阵
    18. M[0, 2] += (nW / 2) - cX
    19. M[1, 2] += (nH / 2) - cY
    20. #进行仿射变换,其中
    21. #“,borderValue=(255,255,255)”定义边界填充色彩白色,省略默认黑色,相当于borderValue=(0,0,0)
    22. return cv2.warpAffine(image, M, (nW, nH),borderValue=(255,255,255))
    23. image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
    24. image2 = rotate_bound(image1, 45)
    25. cv2.imshow('image', image2) #显示图片
    26. cv2.waitKey(0)
    27. #cv2.imwrite(r"D:/cv2Demo/lotus2AsSave.png", image2) #保存

    法三、图像旋转任意角度源码(无剪裁之二)

    源码如下(请和法二对比):

    1. #图像旋转任意角度源码(无剪裁之二)
    2. import cv2
    3. import numpy as np
    4. def opencv_rotate(img, angle):
    5. h, w = img.shape[:2] # 图像的(行数,列数,色彩通道数)
    6. center = (w / 2, h / 2)
    7. scale = 1.0
    8. # 1 获取M矩阵
    9. # cv2.getRotationMatrix2D(获得仿射变化矩阵)
    10. M = cv2.getRotationMatrix2D(center, -angle, scale)
    11. # 2 扩大画布,新的宽高,radians(angle) 把角度转为弧度 sin(弧度)
    12. new_H = int(w * np.fabs(np.sin(np.radians(angle))) + h * np.fabs(np.cos(np.radians(angle))))
    13. new_W = int(h * np.fabs(np.sin(np.radians(angle))) + w * np.fabs(np.cos(np.radians(angle))))
    14. # 3 平移
    15. M[0, 2] += (new_W - w) / 2
    16. M[1, 2] += (new_H - h) / 2
    17. # cv2.warpAffine(进行仿射变化)
    18. rotate = cv2.warpAffine(img, M, (new_W, new_H), borderValue= (0, 0, 0))
    19. return rotate
    20. image1=cv2.imread(r"D:/cv2Demo/lotus2.png")
    21. image2 = opencv_rotate(image1, 45)
    22. cv2.imshow('image', image2) #显示图片
    23. cv2.waitKey(0)
    24. #cv2.imwrite(r"D:/cv2Demo/lotus2AsSave.png", image2) #保存

     OK!

  • 相关阅读:
    限制某一个月的选择
    Iceberg源码学习:flink读iceberg流程二
    Python + Django4 搭建个人博客(六): 数据库表和模型设计
    Redis中是如何实现分布式锁的?
    华为路由器MPLS VPN综合实验
    2024年,我又开始用Linux桌面作为主力系统了~
    基于ISO13209(OTX)实现引导诊断
    疫情之下的裁员浪潮,7点建议帮你斩获心仪offer
    上初三的小伙子做了个windows12网页版
    (已校对)Hive编程指南 ( etc.)电子版下载百度云
  • 原文地址:https://blog.csdn.net/cnds123/article/details/126547307