Opencv-python
Opencv简介
图像处理简介
Opencv简介及安装方法
pip install opencv-python==3.4.1.15 # 无专利,比较推荐的版本 |
Opencv模块
- 基础模块:图像和视频读取模块,内核模块,图像和视频处理模块
- 高级模块:视频分析模块、2D特征读取模块、机器学习模块、图像拼接模块等等
- 扩展模块
Opencv基本操作
图像基础操作
图像的读取、显示、保存:
- imread
- imshow
- imwrite
注:opencv保存的图像其实都是以numpy为基础的,即一个二维数组,如果是BGR图像,则每个元素处都是一个有三个元素的一维数组,分别存储BGR三个值,如果是灰度图,则每个元素处都是一个有一个元素的一维数组,存储灰度值。
绘制几何图形:
- line
- circle
- rectangle
- putText
图像像素点的操作:
图像属性:
- 大小:行数、列数size
- 形状shape
- 通道数
- 数据类型dtype
- 像素数
图像通道的拆分和合并:
- split
- merge
色彩空间的转变:
常用的有
- BGR和GRAY
- BGR和HSV
cvtColor
色的直观HSV(Hue, Saturation, Value)是根据颜特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。
这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。
算数操作
图像加法:
opencv中的图像加法和numpy的图像加法有一点不一样,opencv的加法是饱和操作,而numpy的加法是模运算。
即同一个位置的同一个通道相加后如果超过了255,则opencv赋值为255,而numpy是取模。
img3 = cv.add(img1,img2)
img 4 = img1+img2
图像的混合:
这其实也是加法,但是不同的两幅图像的权重不同,这就会给人一种混合或者透明的感觉,图像混合的计算公式如下:g(x) = (1-a)f0(x)+af1(x)
通过修改a的值(0—>1)可以实现非常炫酷的混合
addWeighted
Opencv图像处理
几何变换
图像缩放:resize
图像平移:warpAffine
图像旋转:图像旋转本质就是在原有图像上乘一个旋转矩阵,这个旋转矩阵可以通过opencv的APIgetRotationMatrix2D获得,然后在使用和图像平移中一样的API即warpAffine来使图像旋转
仿射变换:仿射变换是对图像的缩放、旋转、翻转和平移等操作的组合
透射变换:透射变换是视角变换的结果,是指利用透视中心、像点、目标点三点共线的条件,按透视旋转定律使承影面绕迹线旋转某一角度,破坏原有的投影光线束,仍能保持承影面上投影几何图形不变的变换。
图像金字塔:上下采样 上采样就是使得图像分辨率变大 下采样就是使得图像分辨率变小
形态学操作
- 形态学操作其实就是改变物体的形状,比如腐蚀就是变瘦,膨胀就是变胖。
- 经验之谈:形态学操作一般用于二值化图,来连接相邻的元素或分离成独立的元素。
像素连通:像素值完全一样的两个像素,如果它们处于四连通的两个像素点位置上则称它们为四连通,如果它们处于八连通的两个像素点位置上则称它们为八连通
腐蚀和膨胀:这两个形态学操作其实就是将待处理的图像和一个卷积核进行卷积运算,卷积核需要手动创建。腐蚀就是将图像明亮的区域变小,而膨胀则相反是将图像明亮的区域变大。 erode dilate
开闭运算:
- 开运算:先进行腐蚀再进行膨胀。可以分离物体,消除小区域即白色小点。特点是消除噪点,去除小的干扰块,而不影响原来的图像。
- 闭运算:先膨胀再腐蚀。可以消除物体里的孔洞即黑色小点,特点是可以填充闭合区域。
- API:morphologyEx
礼帽和黑帽:
- 礼帽:原图像与开运算结果的差。结果是将原图像中比较亮的点以白色显示出来。
- 黑帽:闭运算结果与原图像的差。结果是将原图像中比较暗的点以白色显示出来。
- API:morphologyEx
- 发现该API与开闭运算的API一样,那么怎么区分它们呢,是在填入的参数中选择具体使用哪一种形态学操作
图像平滑
噪声分为两类:椒盐噪声和高斯噪声 椒盐噪声:随机出现的黑点或白点 高斯噪声:是指噪声的密度函数服从高斯分布,随机出现不同灰度值的点,点的灰度值服从高斯分布 图像平滑操作:均值滤波、高斯滤波、中值滤波
均值滤波:
- 优点:算法简单,计算速度较快
- 缺点:去噪的同时去除了很多细节部分,将图像变得模糊
- API:blur
高斯滤波:一般用于对具有高斯噪声的图像进行滤波 API:GaussianBlur
中值滤波:一般用于处理椒盐噪声 API:medianBlur
直方图
- 直方图是对数据进行统计的一种方法,并且将统计值组织到一系列定义好的bin当中,bin译为“直条”,其数值是从数据中计算出的特征统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征
- dims:需要统计的特征数目
- bins:每个特征空间子区段的数目
- range:要统计特征的取值范围
- API:calcHist
掩膜:
- 掩膜是用选定的图像、图形或物体,对要处理的图像进行遮挡,来控制图像处理的区域,在数字图像处理中,通常用二维矩阵数组进行掩膜,掩膜是由0和1组成的一个二进制图像
- 主要用途:获得感兴趣区域、屏蔽作用、结构特征提取、特殊形状图像制作
- 如果要查找图像中某个区域的直方图,只需要查找直方图的区域上创建一个白色的掩膜图像,否则创建黑色,然后将其作为掩码mask传递给calcHist即可
直方图均衡化:
- 扩大图像像素值的分布范围,提高图像的对比度
- 直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同
- API:equalizeHist
自适应直方图均衡化:
- 直方图均衡化是考虑的全图的对比度,但是会导致有些地方本来不应该进行均衡却也进行了均衡操作
- 改进方法是使用自适应直方图均衡化
- 整幅图像会被分成很多小块,称为tiles,opencv中默认8*8,然后对每个小块进行直方图均衡化,但是如果有噪声那么会被放大,因此如果直方图中的bin超过对比度的上限,就把其中的像素点均匀分散到其他bins中,然后进行直方图均衡化。最后,为了去除每一个小块之间的边界,再使用双线性差值,对每一小块进行拼接
- API:createCLAHE
边缘检测
- 边缘检测方法基本分为两类:基于搜索和基于零穿越。总之都是基于导数
- 基于搜索:通过寻找图像的一阶导数中的最大值来检测边界,然后利用计算结果估计边缘的局部方向,代表算法是Sobel和Scharr算子
- 基于零穿越:通过寻找图像二阶导数零点来寻找边界,代表算法是拉普拉斯算子
Sobel边缘检测算法:
- 算法简单,效率较高,比canny高,但是不如canny准确
- sobel是高斯平滑和微分操作的结合体,所以其抗噪声的能力强,用途多
- 当内核大小为3时,以上sobel内核可能产生比较明显的误差,为解决这个问题,我们使用scharr函数,但是该函数仅作用于大小为3的内核,该函数的运算与sobel函数一样快,但结果却更加准确
- API:Sobel
- sobel函数求导之后会有负值,还会有大于255的值,而原图像是uint8,因此要使用16位有符号的数据类型,即cv2.CV_16S。处理完图像后,再使用convertScaleAbs函数将其转回原来的uint8类型,否则图像无法显示
- sobel算子是在两个方向计算的,最后还需要用addWeighted函数将其组合起来
Laplacian算子:API:Laplacian
canny边缘检测算法:
- 目前最为常用,流行的边缘检测算法
- 第一步:噪声去除。使用5×5高斯滤波器去除噪声
- 第二步:计算图像梯度
- 第三步:非极大值抑制
- 第四步:滞后阈值
- API:Canny
模板匹配和霍夫变换
模板匹配:
- API:matchTemplate
- 完成匹配后,使用minMaxLoc获得最匹配的位置
- 模板匹配不适用于尺度变换,视角变换后的图像,这时我们就只能使用关键点匹配算法,比如SIFT和SURF等
霍夫变换:
- 霍夫变换常用来提取图像中的直线和圆等几何形状
- 霍夫空间:在笛卡尔坐标系中,一条直线是y=kx+b,然后以k和b分别为笛卡尔坐标系的X和Y轴绘制坐标系,那么原来的一条直线对应霍夫空间的一个点,反过来也是成立的,即霍夫空间内的一条直线对应笛卡尔坐标系内的一个点
霍夫线检测:API:HoughLines
霍夫圆检测:API:HoughCircles
图像特征提取与描述
角点特征
- 角点比如一幅图像中,有一个房子,那么这个房子的角是比较有特征的,而房子中间是没有什么特征的,因此称这个角为角点
- 再比如一张绿色的贺卡,这个贺卡的边缘或者中间都没什么特征,中间是全绿色,而边缘是一条线,一边为全绿色另一边为背景,而角点不同,特征非常明显,无论向哪个方向平移它的灰度值之和都比较明显
Harris和Shi-Tomas算法
- Harris算法API:cornerHarris
- Shi-Tomas算法是Harris的改进,API:goodFeaturesToTrack
SIFT/SURF算法
- API:
- 实例化sift:cv.xfeatures2d.SIFT_create
- 利用sift.detectAndCompute()检测关键点并计算
- cv.drawKeypoints将关键点结果绘制在图像上
Fast和ORB算法
- Fast算法原理:若一个像素周围有一定数量的像素与该点像素值不同,则认为其为角点
- ORB算法:FAST算法和BRIEF算法的结合
- API:
- 实例化ORB:cv.xfeatures2d.orb_create
- 利用orb.detectAndCompute检测关键点并计算
- drawKeypoints绘制关键点
视频操作
视频读写
视频追踪
meanshift:API:meanShift
camshift:在meanshift的改进 可以根据目标大小自动更改窗口大小 API:CamShift