边缘检测
- Sobel算子
应用于图像特征的提取,边缘检测,变化率最大的地方就是边缘过度的地方。边缘是什么 – 是像素值发生跃迁的地方,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。如何捕捉/提取边缘 – 对图像求它的一阶导数delta = f(x) – f(x-1), delta越大,说明像素在X方向变化越大,边缘信号越强。
Soble算子是离散微分算子(discrete differentiation operator),用来计算图像灰度的近似梯度Soble算子功能集合高斯平滑和微分求导,又被称为一阶微分算子,求导算子,在水平和垂直两个方向上求导,得到图像X方法与Y方向梯度图像。I为两个方向的不同权值。
图一为原图,图二为X方向的梯度,图二为Y方向的梯度,图三为X+Y的最终图像梯度。
Scharr算子原理和Soble算子原理相同:处理效果更加清晰,文理比较明显。
- Laplance算子
\[{\rm{L}}\left( f \right) = \frac{{{\partial ^2}f}}{{\partial {x^2}}} + \frac{{{\partial ^2}f}}{{\partial {y^2}}}\]
在二阶导数的时候,最大变化处的值为零即边缘是零值。通过二阶导数计算,依据此理论我们可以计算图像二阶导数,提取边缘。下图为Laplance算子提取的边缘特征。
- Canny算法边缘检测
边缘检测要转化为灰度图像,非最大信号抑制,即用于处理边缘的效果,在一个方向上,纵向切向或指定方向等,如果不是最大值就把它去掉,这样就使轮廓看起来比较细,更加的清晰,贴合边界。
抑制完成后,有的边界是连在一起的,通过高低阈值(即小于最低阈值的舍去,高于最高阈值的保留,在最低和最高之间的进行阈值连接)。例如T1低阈值, T2为高阈值,凡是高于T2的都保留,凡是小于T1都丢弃,从高于T2的像素出发,凡是大于T1而且相互连接的,都保留。最终得到一个输出二值图像。推荐的高低阈值比值为 T2: T1 = 3:1/2:1,下图为通过Canny算子得到的边界,非常清晰。
相关代码解释如下:
1 边缘处理函数:copyMakeBorder(in1,out1,top,bottom,left,right,BORDER_CONSTANT, color); 2 //上下左右分别用像素值预先填充边缘,赋一个初值像素,默认的处理方法是: 3 //BORDER_DEFAULT,BORDER_CONSTANT 填充边缘用指定像素值,即最后一个color来指定, 4 //BORDER_REPLICATE 填充边缘像素用已知的边缘像素值,即用给定的初值上下左右。 5 //BORDER_WRAP 用另外一边的像素来补偿填充。 6 7 convertScaleAbs(A, B), 计算图像A的像素绝对值,输出到图像B; 8 9 Sobel 算子Sobel(huidu_image, Sobel_image, -1, 0, 1, 3); 10 //输入的图像要是灰度图像,-1为输出图像位图深度,0为X方向的求导阶数,1为Y方向的求导阶数 11 //Scharr算子原理和Soble算子原理相同:处理效果更加清晰,纹理比较明显。 12 13 拉普拉斯算子Laplacian(huidu,out1,-1,3); 14 //参数意义同上。 15 16 Canny边缘检测Canny(huidu, out1,50,100,3,false ); 17 //50,100,为低阈值和高阈值,3为Soble算子的size,通常3x3,取值3,选择 true表示是L2来归一化,否则用L1归一化。