图像特征类型可以被分为三种:
边缘
角点(感兴趣关键点)
斑点(Blobs)(感兴趣区域)
角点的具体描述:
1、一阶导数(即灰度的梯度)的局部最大所对应的像素点;
2、两条及两条以上边缘的交点;
3、图像中梯度值和梯度方向的变化速率都很高的点;
4、角点处的一阶导数最大,二阶导数为零,它指示了物体边缘变化不连续的方向。
角点检测算法可归纳为三类:
基于灰度图像的角点检测(分为基于梯度、基于模板、基于模板梯度)
基于模板:主要考虑像素领域点的灰度变化,即图像亮度的变化,将与邻点
亮度对比足够大的点定义为角点。
基于二值图像的角点检测
基于轮廓曲线的角点检测
Harris角点检测是一种直接基于灰度图像的角点提取算法,稳定性高,尤其对L型角点检测精度高。但由于采用了高斯滤波,运算速度相对较慢,角点信息有丢失和位置偏移的现象,而且角点提取有聚簇现象。
实现Harris角点检测: cornerHarris()函数
cornerHarris函数对于每一个像素(x,y)在 blockSize X blockSize邻域内,计算2 X 2梯度的协方差矩阵 M(x.y),计算如下式子:
可以找出输出图中的局部最大值,即找出了角点。
void cornerHarris(InputArray src, OutputArray dst, int blockSize, int kSize, double k, int borderType = BORDER_DEFAULT)参数1,InputArray类型的src,输入图像,填Mat类的对象,为单通道8位或者浮点型图像。
参数2,OutputArray类型的 dst,Harris角点检测的输出结果,和源图片有一样的类型。
参数3,int类型的blockSize,表示邻域的大小。
参数4,int类型的ksize,表示 Sobel()算子的孔径大小。
参数5,double类型的k,Harris参数。
参数6, int类型的 borderType,图像像素的边界模式,默认值 BORDER DEFAULT。
Mat srcImage = imread("E:\\img\\logo6.png", 0); imshow("原始图", srcImage); //进行Harris角点检测找出角点 Mat cornerStrength; cornerHarris(srcImage, cornerStrength, 2, 3, 0.01); //对灰度图进行阈值操作,得到二值图并显示 Mat harrisCorner; threshold(cornerStrength, harrisCorner, 0.00001, 255, THRESH_BINARY); imshow("角点检测后的二值效果图", harrisCorner);