二、图像形态学
图像形态学最基本的操作是膨胀与腐蚀,特别说明:膨胀和腐蚀是对白色高亮部分进行操作的。它们能实现多种功能:
1.消除噪声。
2.分割出独立的图像元素,在图像中连接相邻的元素。
3.寻找图像中明显的极大值区域或极小值区域。
4.求出图像的梯度。
1.膨胀(dilate)
膨胀就是求局部最大值的操作,核B与图像卷积,即计算核B覆盖区域的像素点的最大值,然后把最大值给参考点指定的像素。这样就使得图像高亮的区域逐渐增长。
其数学表达式为:
void dilate(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);
参数1:输入图像。
参数2:输出图像。
参数3:核。若为NULL,则表示使用参考点位于中心的3*3的核。一般使用函数getStructuringElement配合,它会返回指定的形状和尺寸结构元素。该函数有三个参数,第一个参数表示内核形状,其中形状有三个分别是:矩形(MORPH_RECT)、交叉形(MORPH_CROSS)、椭圆形(MORPH_ELLIPSE)。第二个函数表示内核尺寸。第三个函数代表锚点位置。
int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT,
Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),
Point( g_nStructElementSize, g_nStructElementSize ));
参数4:锚点位置,默认值为(-1,-1),表示位于中心。
参数5:表示迭代使用函数的次数,默认值为1。
参数6:边界类型。
参数7:边界值。
//载入原图
Mat image = imread("1.jpg");
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat out;
//进行膨胀操作
dilate(image, out, element);
2.腐蚀(erode)
相反的,腐蚀就是求局部最小值的操作。void erode(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);
参数1:输入图像。
参数2:输出图像。
参数3:核。
参数4:锚点。
参数5:迭代次数。
参数6:边界类型。
参数7:边界值 。
//载入原图
Mat image = imread("1.jpg");
//获取自定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
Mat out;
//进行腐蚀操作
erode(image,out, element);
3.开运算、闭运算、形态学梯度、顶帽、黑帽
开运算就是先腐蚀后膨胀。用来消除小物体,在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。
闭运算就是先膨胀后腐蚀。能够排除小型黑洞(黑色区域)。
形态学梯度就是膨胀图与腐蚀图的差。对二值图像进行操作可以将团块的边缘突出出来,用来保留物体的边缘轮廓。
顶帽运算就是原图像与开运算的差。开运算是消除小物体,而同原图减去之后就会得到这些小物体。用来分离比邻近点亮一些的斑块。当一副图像具有大幅背景的时候,而微小物品比较有规律,可以进行北京提取。
黑帽运算就是闭运算与原图像的差。突出了比原图轮廓周围区域更暗的区域。用来分离比邻近点暗一些的斑块。
void morphologyEx(
InputArray src,
OutputArray dst,
int op,
InputArraykernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar& borderValue=morphologyDefaultBorderValue() );
参数1:输入图像。
参数2:输出图像。
参数3:表示形态学运算的类型。开运算(MORPH_OPEN)、闭运算(MORPH_CLOSE)、形态学梯度(MORPH_GRADIENT)、顶帽(MORPH_TOPHAT)、黑帽(MORPH_BLACKHAT)。
参数4:核。
参数4:核。
参数5:锚点。
参数6:迭代次数。
参数7:边界类型。
参数8:边界值。
#include <opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main( )
{
//载入原始图
Mat image = imread("1.jpg"); //工程目录下应该有一张名为1.jpg的素材图
//创建窗口
namedWindow("【原始图】开运算");
namedWindow("【效果图】开运算");
//显示原始图
imshow("【原始图】开运算", image);
//定义核
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
//进行形态学操作
morphologyEx(image,image, MORPH_OPEN, element);
//显示效果图
imshow("【效果图】开运算", image);
waitKey(0);
return 0;
}
特别说明:本文为本人学习opencv所做笔记。具体参照:http://blog.csdn.net/column/details/opencv-tutorial.html