梯度、边缘和角点
数字图像的边缘检测是图像分割、目标区域识别和区域形状提取等图像分析领域十分重要的基础,是图像识别中提取图像特征的一个重要方法。
图像边缘提取的常用梯度算子有Robert算子、Sobel算子、Prewitt算子和Krisch算子等。
- Sobel
cvSobel(src,dst,int xorder,int yorder,int size=3);
//x方向差分阶数
//y方向差分阶数
//size核尺寸
- Laplace
0 | 1 | 0 |
---|---|---|
1 | -4 | 1 |
0 | 1 | 0 |
//拉普拉斯
cvLaplace(src,dst,size=3);
- Canny
核心包括以下几个步骤:
- [x] 用高斯滤波器平滑
- [x] 用一阶偏导的有限差分计算梯度的幅值和方向
- [x] 对梯度幅值进行非极大值抑制
- [x] 用双阈值算法检测连续边缘
- [x] 采用高斯平滑函数
cvCanny(image,edges,threshold1,threshold2,size=3);
//阈值1、2
//小阈值控制边缘连续
//大阈值用来控制强边缘的初始分割
- PreCornerDetect
//用于角点检测的特征图
cvPreCornerDetect(image,corners,size=3);
//corners保存候选角点的特征图
//size为Sobel算子的核大小
//=======================================
IplImage* corners = cvCloneImage(image);
IplImage* dilated_corners = cvCloneImage(image);
IplImage* corner_mask = cvCreateImage(cvGetSize(image),8,1);
cvPreCornerDetect(image,corners,3);
cvDilate(corners,dilated_corners,0,1);//膨胀一次
cvSubS(corners,dilated_corners,corners);
cvCmpS(corners,0,corners_mask,CV_CMP_GE);
cvReleaseImage(&corners);
cvReleaseImage(&dilated_corners);
- CornerEigenValsAndVecs
//计算图像块的特征值和特征向量,用于角点检测
cvCornerEigenValsAndVecs(image,eigenvv,block_size,size=3);
//eigenvv保存结果数组,必须比输入图像宽6倍
//block_size领域大小
最后计算的特征值、特征向量,按顺序存储λ1,λ2,x1,y1,x2,y2将这些值存储到输出图像中。其中,λ1和λ2为图像差分的相关矩阵M的特征值,
(x1,y1)为λ1的特征向量。
- CornerMinEigenVal
//计算梯度矩阵的最小特征值,用于角点检测
cvCornerMinEigenVal(image,eigenVal,block_size,size=3);
//eigenval保存最小特征值的图像,与输入图像大小一致
//block_size领域大小
- FindCornerSubPix
//寻找精确的角点位置
cvFindCornerSubPix(image,corners,count,size_win,size_zero,termcriteria);
//corners输入角点的初始坐标,也存储精确的输出坐标
//count角点数目
//size_win搜索窗口的一半尺寸,即win=5*5时,所以搜索窗口大小为11*11
//size_zero死区的一半尺寸,为不对搜索区*位置做求和运算的区域,用来避开自相关矩阵出现某些可能的奇异值。当值为(-1,-1)时表示没有死区。
//termcriteria求角点迭代过程的终止条件,即对角点位置的确定,或者迭代数大于某个设定值,或者精确度达到某个设定值。可以是最大迭代数,可以是设定的精确度,可以是他们的组合。
- GoodFeaturesToTrack
//在图像中寻找最大特征值的角点
cvGoodFeaturesToTrack(image,eig_image,temp_image,corners,corner_count,quality_level,min_distance,mask,block_size,use_harris,k);
//eig_image临时浮点32位图像
//temp_image另外一个临时图像
//corners输出参数,检测到的角点
//corner_count输出参数,检测到的角点数
//quality_level最大、最小特征值的乘法因子,定义可接受图像角点的最小质量因子
//min_distance限制因子,得到角点的最小距离,使用欧氏距离
采样、插值和几何变换
- SampleLine
//将光栅线读入缓冲区,读取线段的所有图像点,包括终点,存入缓存
cvSampleLine(image,p1,p2,buffer,connectivity=8);
//线段起点p1,线段终点p2
//buffer 存储线段点的缓冲区
//connectivity线段的联通方式,4或者8
- GetRectSubPix
//从图像中提取像素矩形,并使用子像素精度
cvRectSubPix(src,dst,point_center);
//point_center像素矩形的中心,浮点数坐标。中心必须位于输入图像的内部
- GetQuadrangleSubPix
//提取像素四边形,并使用子像素精度
cvGetQuadrangleSubPix(src,dst,map_matrix);
//map_matrix 2*3变换矩阵A|b
- Resize
//改变图像的大小
cvResize(src,dst,interpolation=CV_INTER_LINEAR);
//CV_INTER_NN最近邻差值
//CV_INTER_LINEAR双线性差值
//CV_INTER_AREA使用像素关系重采样,缩小图像时,避免波纹出现,放大图像时,类似于CV_INTER_NN
//CV_INTER_CUBIC立方插值
- WarpAffine
//仿射变换
cvWarpAffine(src,dst,map_matrix,flags,fillval);
//map_matrix 2*3变换矩阵
//flags插值组合
//fillval用于填充边界之外像素的值
- [x] 平移变换(x+tx,y+ty),变换矩阵为
1 | 0 | tx |
---|---|---|
0 | 1 | ty |
0 | 0 | 1 |
- [x] 缩放变换(sx×x,sy×y),变换矩阵为
sx | 0 | 0 |
---|---|---|
0 | sy | 0 |
0 | 0 | 1 |
- [x] 剪切变换
1 | shx | 0 |
---|---|---|
shy | 1 | 0 |
0 | 0 | 1 |
- [x] 旋转变换,围绕点(x,y)顺时针旋转a角度
cos(a) | -sin(a) | x-x*cos(a)+y*sin(a) |
---|---|---|
sin(a) | cos(a) | y-x*sin(a)-y*cos(a) |
0 | 0 | 1 |
- GetAffineTransform
//根据三个不共点计算放射变换
cvGetAffineTransform(src,dst,map_matrix);
//map_matrix用于存储2*3结果矩阵的指针
//(x1,y1)T=map_matrix*(x,y,1)T
- 2DRotationMatrix
//计算二维旋转的仿射变换矩阵
cv2DRotationMatrix(center,angle,scale,map_matrix);
//center旋转中心
//angle旋转角度
//scale各向同性的尺度因子
//map_matrix输出的2*3矩阵的指针
- WarpPerspective
//对图像进行透视变换
cvWarpPerspective(src,dst,map_matrix,flags,fillval);
//map_matrix为3*3变换矩阵
//flags插值方法和以下选项的组合
//CV_WARP_FILL_OUTLERS填充所有输出图像的像素,如果部分像素落在图像的边界外,那么他们的值设定为fillval
//CV_WARP_IVERSE_MAP指定map_matrix是输出图像的输入图像的反变换
//fillval用于填充边界之外像素的值
- GetPerspectiveTransform
//用于四边形的四个点计算透视变换矩阵
cvGetPerspectiveTransform(src,dst,map_matrix);
- Remap
//对图像进行普通几何变换
cvRemap(src,dst,mapx,mapy,flags,fillval);
//mapx为x坐标下的映射
- LogPolar
//将图像映射到极坐标
cvLogPolar(src,dst,center,M,flags);
//center变换中心
//M幅度尺度参数