图像分析
边缘检测
Canny边缘检测的历史比较久远,最早是在1986年的时候提出的,通常称为Canny边缘检测算法,Canny边缘检测算法是一种对噪声比较敏感的边缘检测方法。
- 高斯模糊:完成噪声抑制。、
- 灰度转换:在灰度图像上计算梯度值。
- 计算梯度:使用Sobel/Scharr。
- 非最大信号抑制:在梯度图像上寻找局部最大值。
- 高低阈值连接:把边缘像素连接为线段,形成完整边缘轮廓。
Canny推荐的高低阈值比在2:1到3:1之间,首先使用低阈值,把低于低阈值边缘的像素点都去掉,然后保留所有高于高阈值的像素点,对于处于高阈值与低阈值之间的像素点,如果从高阈值像素点出发,经过的所有像素点都高于低阈值,则保留这些像素,否则丢弃。
Canny(Mat image, Mat edges, double threshold1, double threshold2, int apertureSize, boolean L2gradient)
直线与圆检测
HoughLines(Mat image, Mat lines, double rho, double theta, int threshold);
HoughLinesP(Mat image, Mat lines, double rho, double theta, int threshold, double minLineLength, double maxLineGap);
HoughCircles(Mat image, Mat circles, int method, double dp, double minDist, double param1, double param2, int minRadius, int maxRadius);
轮廓发现与绘制
有时候,我们希望Canny边缘提取出来的结果是图像的完整轮廓,但是有时候Canny提供给我们的却是一些边缘像素信息,并没有向我们提供完整的轮廓上每个点的位置信息,而OpenCV中还有一组函数可以帮助我们发现每个轮廓、绘制轮廓或者它的外接矩形。
findContours(Mat image, List<MatOfPoint> contours, Mat hierarchy, int mode, int method, Point offset);
drawContours(Mat image, List<MatOfPoint> contours, int contourIdx, Scalar color, int thickness);
轮廓分析
我们通过将Canny边缘提取或者二值化结果作为输入图像来实现轮廓发现与绘制,可是这些并不是我们想要的最终结果,我们一般会根据获取到的轮廓求出它们的外接矩形或者最小外接矩形,并计算外接矩形的横纵比例、轮廓面积、周长等数据,然后使用这些数据实现特定几何形状轮廓的查找与过滤,为后续的处理与分析剔除不正确的区域而保留候选对象。
boundingRect(MatOfPoint points)
RotatedRect minAreaRect(MatOfPoint2f points)
contourArea(Mat contour, boolean oriented)
arcLength(MatOfPoint2f curve, boolean closed)
模板匹配
模板匹配是最简单的模式识别算法之一,其在图像处理中经常用于从一副未知图像中根据预先定义好的模板图像来寻找与模板图像相同或者高度相似的子图像区域。所以模板匹配需要两个输入,一个是模板图像,另一个是待检测的目标图像。模板匹配使用的是基于图像像素相似度的计算方法,很容易受到光照强度、对象几何畸变的影响而降低准确性,只有在亮度和分辨率恒定以及无几何畸变的情况下才会得到比较高的准确率。
matchTemplate(Mat image, Mat templ, Mat result, int method)