基于python的opencv的学习


前言

在了解基本的python语法后,我们终于可以开始进行一些项目的实践学习。这里 用opencv进行第一个python项目的上手。 这里我将会分享自己寒假对于opencv的学习


一、安装开发环境

推荐大家使用pycharm!!非常好用。如果之前学习python的话可以 直接在官网下载pycharm。

https://www.jetbrains.com/pycharm/。这个是pycharm官网,如果下载速度过慢,可以去找现有的安装包,记得配置好环境变量,下载时也不要分配给系统默认的文件中,通常来说这个系统分配文件修改都需要管理员权限。

在这里插入图片描述

记住 update   PATH variable 一定要打上钩,否则就要自己去配置环境变量。

这里我现在使用的 环境是anaconda。也比较推荐在python进阶阶段、项目阶段的同学们使用这个环境。因为anaconda可以做到 python解释器的版本切换 ,有些项目并不是说 python的解释器越高越好,打个比方有些 库 or 第三方文件只支持早期版本这时候你就得要 重新下载一个python 解释器,来重新配置一个环境 而在anaconda环境中 可以直接创建新的虚拟环境来切换,非常方便。而且anaconda安装的同时,已经配置了许多的第三方库,足够我们的使用。

 也推荐官网安装。如果网速过慢,也可以在博客上搜索共享的安装包。

建议两个都选上。

然后在pycharm上settings中 打开interrupt 配置anaconda的解释器就可,说白了就是找到python.exe文件即可

我安装opencv python的方法是从官网上下载whl 文件配置

因为pip 的方法只能配置 3.5一下的opencv —python

如果官网过慢的话

https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/opencv-python/
清华源官网 下载比较快 cp38 的意思是支持解释器 py3.8版本。

这里我们选择 win amd64位

根据操作系统是几位来选择 32 64

 在这里插入图片描述

 将文件下载到 C:\anaconda3\Lib\site-packages,其实就是找到自己安装环境那个文件夹中site—packages。

用Windows+R 打开cmd

输入 python,再import cv2,如果这里没有报错就证明已经再开发环境中安装好了opencv库。

二、简单介绍

OpenCV 是一个的跨平台计算机视觉库,可以运行在 Linux、Windows 和 Mac OS 操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时也提供了 Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。
这里我们主要学习由python来实现一下,一些基于opencv的简单项目

这里呢,我学习opencv-python 主要用的书是《OPENCV3计算机视觉 PYthon语言实现》,还有各位大佬GitHub以及博客上的各种分享。

首先,opencv作为一个九几年就开源的软件库以及开源社区,在经历了多年,拥有无私开源精神的程序员们的分享下,内置了许多图像处理以及计算机视觉方面的库。

Core该模块包含 OpenCV 库的基础结构以及基本操作。
Improc图像处理模块包含基本的图像转换,包括滤波以及类似的卷积操作。
Highgui在 OpenCV 3.0中,分割为 imcodecs、videoio 以及 highgui 三部分。

这个模块包含可以用来显示图像或者简单的输入的用户交互函数。这可以看作是一个非常轻量级的 Windows UI 工具包。
Video该模块包含读取和写视频流的函数。
Calib3d这个模块包括校准单个、双目以及多个相机的算法实现。
Feature2d这个模块包含用于检测、描述以及匹配特征点的算法。
Objdectect这个模块包含检测特定目标,比如人脸或者行人的算法。也可以训练检测器并用来检测其他物体。
Ml机器学习模块本身是一个非常完备的模块,包含大量的机器学习算法实现并且这些算法都能和 OpenCV 的数据类型自然交互。
FlannFlann 的意思是“快速最邻近库”。这个库包含一些你也许不会直接使用的方法,但是其他模块中的函数会调用它在数据集中进行最邻近搜索。
GPU在 OpenCV 中被分割为多个 cuda* 模块。

GPU 模块主要是函数在 CUDA GPU 上的优化实现,此外,还有一些仅用于 GPU 的功 能。其中一些函数能够返回很好的结果,但是需要足够好的计算资源,如果硬件没有GPU,则不会有什么提升。
Photo这是一个相当新的模块,包含计算摄影学的一些函数工具。
Stitching本模块是一个精巧的图像拼接流程实现。这是库中的新功能,但是,就像 Photo 模块一样,这个领域未来预计有很大的增长。
Nonfree在 OpenCV 3.0 中,被移到 opencv_contrib/xfeatures2d。

OpenCV 包含一些受到专利保护的或者受到使用限制的(比如 SIFT 算法)算法。这些算法被隔离到它们自己的模块中,以表明你需要做一些特殊的工作,才可以在商业产品中使用它们。
Contrib在 OpenCV 3.0 中,融合进了 opencv_contrib。

这个模块包含一些新的、还没有被集成进 OpenCV 库的东西。
Legacy在 OpenCV 3.0 中,被取消。

这个模块包含一些老的尚未被完全取消的东西。
ocl在OpenCV 3.0 中,被取消,取而代之的是 T-API。

这是一个较新的模块,可以认为它和 GPU 模块相似,它实现了开放并行编程的 Khronos OpenCL 标准。虽然现在模块的特性比 GPU 模块少很多,但 ocl 模块的目标是提供可以运行在任何 GPU 或者是其他可以搭载 Khronos 的并行设备。这与 GPU 模 块形成了鲜明的对比,后者使用 Nividia CUDA 工具包进行开发,因此只能在 Nividia GPU 设备上工作。

2.图像处理的简单原理

完整的图像处理程序通常可以分为以下三个步骤:

读取图像,图像的获取可以有多种不同的来源(相机、视频流、磁盘、在线资源),因此图像的读取可能涉及多个函数,以便可以从不同的来源读取图像;
图像处理,通过应用图像处理技术来处理图像,以实现所需的功能(例如,检测图像中的猫);
显示结果,将图像处理完成后的结果以人类可读的方式进行呈现(例如,在图像中绘制边界框,有时也可能需要将其保存到磁盘)。

此外,上述第2步图像处理可以进一步分为三个不同的处理级别:

低层处理(或者在不引起歧义的情况下可以称为预处理),通常将一个图像作为输入,然后输出另一个图像。可在此步骤中应用的步骤包括但不限于以下方法:噪声消除、图像锐化、光照归一化以及透视校正等;
中层处理:是将预处理后的图像提取其主要特征(例如采用 DNN 模型得到的图像特征),输出某种形式的图像表示,它提取了用于图像进一步处理的主要特征。
高层处理:接受中层处理得到的图像特征并输出最终结果。例如,处理的输出可以是检测到的人脸.

原文链接:https://blog.csdn.net/LOVEmy134611/article/details/119489496

这里的内容是引用 博客主 盼小辉的,想看可以用这个链接去看看原文。

这里我自己的理解就是,处理器从I/O接口中获取图片信息进行简单的加工,这是底层处理(预处理)。而中层处理则是将预处理后的图像提取关键数据。(在计算机视觉与图像处理中,很需要运用到线性代数的知识)然后对于高层,打个比方例如检查一只狗。在深度学习中,训练一个检测狗的模型,可能需要几百张图片的训练才能让其变准确。高层将中层所提取的数据放入模型中检查然后准确输出结果。

而像素、颜色、通道、图像和颜色空间
在表示图像时,有多种不同的颜色模型,但最常见的是红、绿、蓝 (RGB) 模型。
RGB 模型是一种加法颜色模型,其中原色 (在RGB模型中,原色是红色 R、绿色 G 和蓝色 B) 混合在一起就可以用来表示广泛的颜色范围。
每个原色 (R, G, B) 通常表示一个通道,其取值范围为[0, 255]内的整数值。因此,每个通道有共256个可能的离散值,其对应于用于表示颜色通道值的总比特数 (2 8 = 256 2^8=2562 
8
 =256)。此外,由于有三个不同的通道,使用 RGB 模型表示的图像称为24位色深图像:


通过调节这三个数值,可以变换出你想要的颜色

图像描述
图像可以描述为2D函数 f ( x , y ) f(x, y)f(x,y),其中 ( x , y ) (x, y)(x,y) 是空间坐标,而 f ( x , y ) f(x, y)f(x,y) 是图像在点 ( x , y ) (x, y)(x,y) 处的亮度或灰度或颜色值。另外,当f(x, y)和(x, y)值都是有限离散量时,该图像也被称为数字图像,此时:

x ∈ [ 0 , h − 1 ] x∈ [0, h-1]x∈[0,h−1],其中 h hh 是图像的高度
y ∈ [ 0 , w − 1 ] y∈ [0, w-1]y∈[0,w−1],其中 w ww 是图像的宽度
f ( x , y ) ∈ [ 0 , L − 1 ] f(x, y)∈ [0,L-1]f(x,y)∈[0,L−1],其中 L = 256 L=256L=256 (对于8位灰度图像)
彩色图像也可以用同样的方式表示,只是我们需要定义三个函数来分别表示红色、绿色和蓝色值。这三个单独的函数中的每一个都遵循与为灰度图像定义的 f ( x , y ) f(x, y)f(x,y) 函数相同的公式。我们将这三个函数的子索引 R、G 和 B 分别表示为 f R ( x , y ) f_R(x, y)f 
R

 (x,y)、f G ( x , y ) f_G(x, y)f 
G

 (x,y) 和 f B ( x , y ) f_B(x, y)f 
B

 (x,y)。
同样,黑白图像也可以表示为相同的形式,其仅需要一个函数来表示图像,且 f ( x , y ) f(x, y)f(x,y) 只能取两个值。通常,0 表示黑色、1 表示白色。
这里我也引用了博客主盼小辉 的文章内容,大家看看就行。

接下来开始对cv在python应用的学习


三、opencv的I/O读与写

  首先我们找到一张图片放置在你项目文件中,如果大家对 opencv的API并不熟悉,还是建议大家,使用图像的绝对路径,例如windows下的绝对路径为C:\user\(这里是你的此电脑用户名)\(图片)。如果不是很明白的话,有个简单粗暴的方法,将图片放在此项目的文件夹下,这叫做相对路径。 

 如上图的Taylor.jiff

然后呢 opencv中的读写函数是

cv2.imread()//读
cv2.imwrite()// 写

 例如

import cv2 as cv  #cv2的读写是BGR模式
img=cv.imread('Taylor.jpg')#这张图是存在于当前目录下
print(img) #打印结果是一个numpy结构的矩阵

 对于一个oepncv图像在python中其数据类型是.array类型的二维或者三维数组。

在后面我们也能知道,在分析图片我们一般会先将其转化成 灰度图。

 

四、阈值操作

看下面代码。cv2.threshold 这个函数 第一个参数是图片,最好是单通道的图片,第二个参数 127 是阈值,255 则是 最大值,最后一个参数二值化操作类型

像下面这段代码则是将小于 127 的像素值 取0,大于127的像素值 取255.

结果如图

import cv2 as cv
import numpy as np
img=cv.imread('Taylor.jpg')
a,ret=cv2.threshold(img,127,255,cv.THRESH_BINARY)#我们只需要这个阈值函数的第二个返回值
def cv_show(name,img):   #自定义的窗口显示函数
    cv.imshow(name,img)
    cv2.waitKey(0)

cv_show("im",ret) #阈值处理后

  值得我们注意的是 thresold 这个函数的第四个参数,type的类型决定了二值化操作,有以下五种类型

cv2.THRESH_TOZERO_INV

cv2.THRESH_BINARY 超过阈值的部分取最大值(255),其余部分 取0

cv2.THRESH_BINARY_INV 上面那个函数的反转,即未超过取0,其余部分取255

cv2.THRESH_TRUNC 大于阈值设置为阈值,否则不变

cv2.THRESH_TOZERO 大于阈值部分不改变,否则为0

cv2.THRESH_TOZERO_INV 上面那个函数的反转

 五、图像平滑处理

1、均值滤波

其原理是对图像进行一个卷积操作

看代码

import cv2 as cv
import numpy as np
img=cv.imread('Taylor.jpg')
img1=cv.blur(img,(3,3))# 这个cv函数就是对图像进行均值滤波处理(卷积操作),目的是使图像色泽更加均匀,第一个参数表示 数据,第二个是卷积内容
a,ret=cv2.threshold(img,127,255,cv.THRESH_BINARY)#我们只需要这个阈值函数的第二个返回值
def cv_show(name,img):   #自定义的窗口显示函数
    cv.imshow(name,img)
    cv2.waitKey(0)

cv_show("img1",ret) #阈值处理后

2.方框滤波

cv2.boxerFilter(img,-1,(3,3),nomralize=true) #方框滤波函数 使用方法和均值滤波函数差不多

值得一提 第四个参数是归一化, 使用参数true 和均值滤波是一样的

如果指定 nomralize 为 false ,越界值会直接取255

3.高斯滤波

cv.getGaussianblur(img,(3,3),1) #服从 高斯分布 中间值占比较大,值得注意的是前两个参数。

 六、形态学 腐蚀操作与膨胀操作

对于 这部分的理解 ,其实腐蚀和膨胀操作在图像处理很常见。

膨胀操作会扩大(粗化)图像中物体的轮廓,可以用来弥补(填充)物体间的孔洞,强化离散点,代价是导致物体的面积比原来的面积要大。

腐蚀操作会收缩(细化)图像中物体的轮廓,可以用来断开(分离)物体间的连接,消除离散点,代价是导致物体的面积比原来的面积要小。

  腐蚀,我们用到的是erode这个函数,它拥有三个参数,我们这里说一说他的第二个参数

第二个参数范围越大 腐蚀效果越强,而迭代次数越多腐蚀效果也越强

import cv2 as cv
import numpy as np
def cv_show(name,img):   #自定义的窗口显示函数
    cv.imshow(name,img)
    cv2.waitKey(0)
img=cv.imread('Taylor.jpg')
kernel=np.ones((5,5),np.uint8)# 
img1=cv.erode(img,kernel,iterations=1)#第三个参数代表迭代次数
cv_show("ww",img)# 自定义的显示函数

膨胀

import cv2 as cv
import numpy as np
def cv_show(name,img):   #自定义的窗口显示函数
    cv.imshow(name,img)
    cv2.waitKey(0)
img=cv.imread('Taylor.jpg')
kernel=np.ones((5,5),np.uint8)# 
img1=cv.dilate(img,kernel,iterations=1)#第三个参数代表迭代次数
cv_show("ww",img)# 自定义的显示函数

开运算与闭运算,所谓开运算 即,先进行腐蚀操作,在进行膨胀操作

而 闭运算 则相反

这个操作所用函数为

cv.morphologyex().

看代码

import cv2 as cv
import numpy as np
def cv_show(name,img):   #自定义的窗口显示函数
    cv.imshow(name,img)
    cv2.waitKey(0)
img=cv.imread('Taylor.jpg')
kernel=np.ones((5,5),np.uint8)# 
img1=cv2.morphologyEX(img,cv.MORPH_CLOSE,kernel)'''重点注意第二个参数 cv.MORPG_OPEN 表示开运算,代码中的则表示闭运算'''
cv_show("ww",img)# 自定义的显示函数

梯度运算

则是用膨胀的值减去腐蚀的值

我们只需要改变morphology中的二个参数,改为cv.MORPH.GRADIENT即可

概述:利用Sobel算子进行图像梯度计算
参数:

src:输入图像
ddepth: 输出图像的深度(可以理解为数据类型),-1表示与原图像相同的深度
dx,dy:当组合为dx=1,dy=0时求x方向的一阶导数,当组合为dx=0,dy=1时求y方向的一阶导数(如果同时为1,通常得不到想要的结果)
ksize:(可选参数)Sobel算子的大小,必须是1,3,5或者7,默认为3。
计算时记得 gx gy分开算

 使用cv2.convertScaleAbs()函数进行相加即可

五、项目开始,用opencv python 写出一个带有数字识别功能的程序

总结

  这是简易版本,后续有更复杂版本

from aip import AipOcr  # 百度的数字识别库
import cv2 as cv  # opencv python
import os

def cv_show(name, img):  # 自定义的窗口显示函数
    cv.imshow(name, img)
    cv.waitKey(0)


img = cv.imread('number.jpg')
a, img2 = cv.threshold(img, 127, 255, cv.THRESH_BINARY)  # 阈值转化
cv.imwrite('review.jpg',img2)
cv_show("BEFORE", img2)

""" 你的 APPID AK SK """  # 百度 api接口
APP_ID = '25565754'
API_KEY = 'dhIEGfuqPfkwebyMZ0Cw8TcX'
SECRET_KEY = 'dY4AC6f7BcIT0NGh011YbX9oTLzRhKAR'  # 百度控制台
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
""" 读取图片 """
def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()
list=os.listdir("C:\pythonfile\pythonProject3")
print(list)
a=input("输入处理文件:")
image = get_file_content(a)
result=client.basicGeneral(image);
print(result)

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 3
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值