opencv复习
B站视频
基础
一些基础操作
0黑
255白
图像为【B,G,R】
- 图像读取
- ROI截取
- 边界填充
- 像素运算
- 图像阈值化
- 缩放
- 仿射变换
- 旋转
- 平移
- 透视
平滑处理
- 离散卷积
- 高斯平滑
- 均值平滑
- 中值平滑
- 双边滤波,联合双边滤波
- 导向滤波
形态学处理
形态学处理
腐蚀是白色区域变小,膨胀是白色区域变大
open去除亮色区域,close去除暗色区域
形态学梯度可以提取轮廓
- 腐蚀
- 膨胀
- 形态学梯度(膨胀运算结果减去腐蚀运算结果)
- open(先腐蚀再膨胀)
- close(先膨胀再腐蚀)
- tophat(原图像减去open结果)
- blackhat(原图像减去close结果)
边缘检测
- Roberts算子
- Prewitt算子
- sobel算子
- Scharr算子
- Laplacian算子
- 高斯拉普拉斯(LoG)边缘检测
- 高斯差分(Difference of Gaussian, DoG)边缘检测
canny边缘检测算法
- 用高斯平滑滤波,滤除噪声
- 用sobel算子计算每个像素的梯度强度和方向
- 用非极大值(Non-Maximum Suppression)抑制,消除边缘检测带来的杂散相应
- 双阈值检测(Double-Threshold)以确定真实和潜在的边缘
图像金字塔
图像金字塔
层级越高,图像越小,分辨率越低。
- 高斯金字塔
- 拉普拉斯金字塔
高斯金字塔用来向下降采样图像,沿着金字塔往尖尖走,pyrDown函数,即缩小图像。
拉普拉斯金字塔则用来从金字塔底层图像中向上采样重建一个图像,pyrUp函数,即放大图像。
轮廓检测
轮廓检测
边缘是零散的,轮廓是连贯的
需要对数据先进行一些处理,比如二值灰度图,之后再进行检测
绘制轮廓的时候要记得用copy.()
- findContours() 寻找图片中的轮廓
- drawContours() 绘制检测到的轮廓
- arcLength() 计算点集所围区域的周长
- contourArea() 计算点集所围区域的面积
- pointPolygonTest() 计算坐标点和一个轮廓的位置关系
- approxPolyDP() 轮廓近似
- minAreaRect() 最小外接矩形
- minEnclosingCircle() 外接圆
模板匹配
模板匹配Template Match
和卷积类似,从左上角进行滑动匹配,计算差异程度,用max或min选最匹配的
- CV_TM_SQDIFF() 平方差匹配法,值越小,越相关
- CV_TM_CCORR() 相关性匹配法,值越大,越相关
- CV_TM_CCOEFF() 系数匹配法,值越大,越相关
- CV_TM_SQDIFF_NORMED() 归一化平方差,值越接近0,越相关
- CV_TM_CCORR_NORMED() 归一化相关性,值越接近1,越相关
- CV_TMCCOEFF_NORMED() 归一化相关系数,值越接近1,越相关
匹配多个对象:
设定阈值,画出所有满足阈值的location
直方图
从0到255,统计每个像素点出现的个数
- calcHist() 函数
- equalizeHist() 直方图均衡化
- createCLAHE() 自适应均衡化
傅里叶变换
傅里叶变换
低通滤波器:只保留低频,让图像变模糊
高通滤波器:只保留高频,让图像细节强
- 傅里叶变换
- 快速傅里叶变换
- 傅里叶幅度谱和相位谱
harris角点检测
特征匹配
角点是图像灰度图,任意方向都变化迅速的点,是特征值都大,自相关函数在各自方向都大
边界是特征值一大一小,自相关函数在一个方向大,其他方向小
平面是特征值都小,自相关函数在各自方向都小
两幅视角不同的照片,通过寻找角点进行匹配
最后加非极大值抑制,进行过滤
SIFT
Scale-invariant feature transform
图像尺度空间用高斯模糊识别
高斯滤波后会有边界响应
每个特征点得到三个信息:位置,尺度,方向
一个特征点能产生多个位置,尺度相同,方向不同的特征点
用尺度和方向,生成特征描述,计算关键点梯度后用直方图统计相邻范围内像素的梯度个方向。
把特征转换成向量时,为了满足矢量的旋转不变性,以特征点为中心,在临近区域将坐标轴旋转。
Ransac
随机选择数据点进行拟合,不断迭代拟合,挑选出范围内点最多的线
在某些层面上比最小二乘法要好用