题记:发现之前写的代码很多都不知道放在哪里了,时间长了看过的东西,写的代码也就忘了。有一种忙了好一阵子却没什么收获的感觉,因此从今天开始把学习到的东西都整理下来,先CSDN,有成熟的项目代码后在放到Github上。
一、微分、梯度
数学函数的微分可以有不同术语的定义,但任何定义都必须保证以下几点:
一阶微分:
1、在平坦段(灰度不变的区域),微分值为0
2、在灰度阶梯或斜坡的起始点处微分值非0
3、沿着斜坡面微分值非0
图像是离散的数字量,其值有限,故最大的灰度阶的变化也是有限的,变化发生的最短距离是相邻像素之间。
因此一阶微分可如下定义:
二阶微分可如下定义:
在图像处理中,一阶微分是通过梯度法来实现的。对于函数 在(x,y)上的梯度是通过一个二维列向量来定义的:
向量模值:
一般,我们把梯度向量的模值简称为梯度。同时在实际操作中,常用绝对值代替平方与开放的运算求解近似梯度的模值。
二、Sobel
用来表达微分最常用的操作是Sobel 微分算子,Sobel算子包含任意阶的微分及融合偏导。
该算子包含两组3x3的矩阵,分别为横向及纵向,将之与图像作平面卷积,即可分别得出横向及纵向的亮度差分近似值。分别代表经横向及纵向边缘检测的图像,其公式如下:
使用权重2的思想是,通过突出中心点的作用而达到平滑的目的。
来自 <http://zh.wikipedia.org/wiki/%E7%B4%A2%E8%B2%9D%E7%88%BE%E7%AE%97%E5%AD%90>
在OpenCV中其Sobel函数定义如下:
C++:
void Sobel(InputArraysrc, OutputArray dst, int ddepth, // 输入输出图像,图像深度应按下图对应
int dx, //x方向导数
int dy, //y方向导数
int ksize=3, double scale=1,
double delta=0, intborderType=BORDER_DEFAULT )
Sobel(img, sobel
Img, -1, 1, 0); //对横向(X)求导数,保留纵向边缘
Sobel(img, sobelImg, -1,0,1); // 对纵向(Y)求导,保留横向边缘
三、角点
图像上如果一个点在两个正交方向上都有明显的倒数,则我们认为此点更倾向于是独一无二的,所以,许多可追踪的特征点都成为角点。
最普遍使用的角点定义是有Harris提出的。定义的基础是图像灰度强度的二阶导数()矩阵。
OpenCV 角点检测函数如下: