opencv图像分析

 

图像分析

将图像转换成完全不同的表现方式(输出不是图像)数组或序列

离散傅里叶变换

连续(积分)– 离散(求和)

cv::dft()离散傅里叶变换

一维或二维

输出为CCS格式

cv::idft()用于离散傅里叶逆变换

cv::mulSpectrums()频谱乘法

使用傅里叶变换进行卷积

cv::dct()离散余弦变换

cv::idct()离散余弦逆变换

积分图

通过cv::integral()函数

积分图是一种允许子区域快速求和的数据结构

三种变体:求和,平方求和,倾斜求和

cv::integral()标准求和积分

cv::integral()平方求和积分

cv::integral()倾斜求和积分

Canny边缘检测

简单的Laplace滤波器可以曝光图像的边缘,经过改进后成为Canny算法

先再x和y方向上求一阶导,然后组合成四个方向上的导数,其中方向导数是局部最大值的点是组成边缘的候选项

创新点:将单个的边缘候选像素加入轮廓

*通过对像素应用滞后阙值形成轮廓(较大值和较小值):

大于较大值:接收;小于较小值:抛弃;介于之间:如果连接到一个高于阙值的像素才接受

cv::Canny()

输入图像必须是单通道图像,输出为灰度图(实际上是布尔图)

Hough变换

霍夫变换是一种检测线,圆或者图像中其他简单形状的方法

Hough线变换

基本理论:二进制图像中任何点都可能属于某些可能的线

最好的参数形式不是斜截式,而是极坐标(当直线接近竖直时,此时在a-b平面中是难以表示的)

图像平面中的一条直线可由θ-ρ平面中的一个点表示。因此图像平面中的一个点可以由穿过它的直线族在θ-ρ平面中对应的点组成的曲线来表示。

θ-ρ平面中两条曲线的交点即为图像平面中的两个点共线的一条直线

opencv支持三种Hough线变换:

标准Hough变换(SHT):在ρ-θ空间中对每个点的直线θ从0到2Π的图像进行累加,从局部极大值中取出结果;缺点:不能得到线的端点

多尺度Hough变换(MHT):给出精细分辨率参数细化结果

渐进概率Hough变换(PPHT):Edge图像中随机选择像素,将这些像素点按照SHT中的方法转换到累加平面(p-θ)。 当在累加平面中可以通过阈值筛选出一条直线时,沿该条直线搜索Edge图像,以查看是否存在一个或多个有限长度的线。然后在该直线的所有像素被从Edge图像中除去。通过这种方式,算法返回有限长度的直线。

SHT,MHT:cv::HoughLines()

PPHT:cv::HoughLinesP()—更快

Hough圆变换

累加三维的体积,三维坐标为圆心位置x,y和半径r,需要更大的内存和速度,用Hough梯度避免该问题

核心思想:对圆上的所有点,他们梯度方向所在直线的交点即为圆心

用cv::HoughCircles()进行Hough圆变换

距离变换

距离变换输出一个新图像,每个像素的值为输入图像中与最近的零像素的距离

cv::distanceTransform()无标记距离变换

cv::distanceTransform()有标记距离变换(连接组件?不懂)