在对图像边缘检测之后,再对检测后的图像进行一些操作后可以令待检测图像的特征更加突出,以白底黑字为例,腐蚀操作会腐蚀白色亮区,令黑字更加明显,膨胀操作则会膨胀白色亮区,令黑字细小,从上篇文章最终显示的边缘处理后的图像可知,检测出的边缘以白边描绘,因此,为了增加车牌特征,可以使用膨胀函数,而图像的二值化可以使处理后的图像只存在黑白两种颜色,便于计算机检测识别,提高识别效率。下面将会对腐蚀与膨胀以及自适应二值化进行较为详细的讲解。
腐蚀与膨胀的运用广泛,主要有:
· 消除噪声
· 分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
· 寻找图像中的明显的极大值区域或极小值区域。
腐蚀进行操作的函数是erode。
/** @function Erosion */ void Erosion( int, void* ) { int erosion_type; if( erosion_elem == 0 ){ erosion_type = MORPH_RECT; } else if( erosion_elem == 1 ){ erosion_type = MORPH_CROSS; } else if( erosion_elem == 2) { erosion_type = MORPH_ELLIPSE; } Mat element = getStructuringElement( erosion_type, Size( 2*erosion_size + 1, 2*erosion_size+1 ), Point( erosion_size, erosion_size ) ); /// 腐蚀操作 erode( src, erosion_dst, element ); imshow( "Erosion Demo", erosion_dst ); }
它接受了三个参数:
src: 原图像
erosion_dst: 输出图像
-
element: 腐蚀操作的内核。 如果不指定,默认为一个简单的
矩阵。否则,我们就要明确指定它的形状,可以使用函数getStructuringElement:
Mat element = getStructuringElement( erosion_type,
Size( 2*erosion_size + 1, 2*erosion_size+1 ),
Point( erosion_size, erosion_size ) );
我们可以为我们的内核选择三种形状之一:
- 矩形: MORPH_RECT
- 交叉形: MORPH_CROSS
- 椭圆形: MORPH_ELLIPSE
然后,我们还需要指定内核大小,以及锚点位置。不指定锚点位置,则默认锚点在内核中心位置。
膨胀操作与erosion函数相似,此处不再多加赘述。
对图像进行二值化操作主要涉及到阈值操作,一些常见的基本阈值操作有:
二进制阈值化
该阈值化类型如下式所示:
反二进制阈值化
截断阈值化:
我在这里使用的是比较省事的自适应阈值二值化:
threshold(g_tmpImage, roi_threadhold_image, 50,255, CV_THRESH_BINARY); //自适应阈值二值化
参数CV_THRESH_BINARY就表示自适应算法,上述函数第一个参数为输入图像,第二个为输出图像。
边缘检测二值化再膨胀后的效果图为: