openCV入门学习基础教程第三篇 |
||||||||||||||||||||||
+ 目录前文复习:
一、Canny边缘检测该边缘检测法步骤如下:
高斯滤波 我们要进行边缘检测过程中肯定要进行梯度计算,计算梯度时那些噪音点也会影响梯度的变化,因此进行去噪。
梯度和方向 使用sobel算子,进行梯度大小和方向的计算。
非极大值抑制 NMS 算完梯度后,有些可能大点,有些可能小点,在一个核中,把一些小的梯度值抑制掉,只保留大的,即明显的。 如人脸识别,能够把脸框起来(有多个框框到脸了,只保留最好的。) 法1:
蓝线表示方向,dTmp1和dTmp2都是亚像素点,g1g2g3g4都是知道的,可求dTmp1和dTmp2。 在c比dTmp1和dTmp2都大的情况下,保留c,否则就被抑制掉了。 法2:
比如我们选择倾斜45°,就过了g1和g4了(上上图),就不用插值了。当前方向离哪个角度近就用选择哪个。 右图中如果A比BC都大,那么A就保存下来了。 双阈值 对一些所有可能边界进行过滤,只保留最真实的。
A点大于maxVal 就是边界 如果有小于minVale的,那就省略掉。 他俩之间的B C分别进行讨论,如果c和边界是连着的,就保留。B没连着,舍弃。 v1=cv2.Canny(img,80,150) 80 150为下上阈值,一定范围内,下阈值越小,上阈值越小越容易被当作边缘。
?
?
二、图像轮廓上面说的是边缘,随便一个线段也能被检测成边缘。而轮廓是一个整体,正常是封闭的连在一起的。
2.1 轮廓收集cv2.findContours(img,mode,method)
method:轮廓逼近方法
上图就是两种method,一个是整个框,一个是点,都能起到定位作用。 为了更高的准确率,我们选择使用二值图像:
?
这里用到了cv2.threshold 是上一篇文章学的。
?
其返回值有两个:
2.2 轮廓绘制res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2) 参数为:图像,轮廓,轮廓索引(-1默认所有),颜色模式(BGR),线条厚度(不宜太大)
?
仔细看它把10个(内外)轮廓都画出来了,这与我们传入的参数 -1 有关。 当然我们也可以选择其中某个:
?
?
?
2.3 轮廓特征这里就介绍个周长和面积吧,后面用到别的再说。
?
2.4 轮廓近似什么是轮廓近似呢,比如下图左侧图案很麻烦,我们可以把它近似看成右边的,就是轮廓近似。
这个的原理其实也很简单,我发挥我的绘画功能给你们展示一下:
把曲线AB近似成直线AB,至于要d<T(阈值)即可。 我们近似一下下图:
边缘绘制:
?
?
|