数学形态学(Mathematical morphology)
OpenCV中常用数学形态学分析处理离散图像,用预先定义的结构元素探测图像,从而实现图像的转换,结构元素与像素邻域的相交方式决定了运算的结果。
用形态学滤波器腐蚀和膨胀图像
结构元素即为像素的组合(常用正方形,圆形等),把某个像素设为结构元素的原点后,结构元素和图像重叠部分的像素集就是形态学运算的应用对象。
因为形态学滤波器通常作用于二值图像,所以我们通常用cv::threshold
函数先创建二值图,要说明的是,在形态学中,我们习惯用白色表示前景物体,黑色表示背景物体。
注:腐蚀和膨胀滤波器也能应用在灰度图像甚至彩色图像中,定义是相同的。
原图
腐蚀图像
腐蚀就是把当前像素替换成所定义像素集合中最小像素值。这里默认结构元素是3*3矩阵,原点为中心点。
腐蚀时,如果结构元素放到某个像素位置时碰到了背景(即交集中有一个像素是黑色的),那么这个像素就变为背景。
图像腐蚀后物体尺寸会缩小。在腐蚀图像中,有些面积较小的物体(背景中的噪声像素)会彻底消失。
//腐蚀图像
cv::Mat eroded;
cv::erode(binary, eroded, cv::Mat());
cv::imshow("eroded", eroded);
函数签名
CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
参数分别为:输入矩阵,输出矩阵,自定义内核(结构元素),原点坐标,迭代次数,后面默认即可。
膨胀图像
膨胀就是把当前像素替换成所定义像素集合中最大像素值。
这里默认结构元素是3x3矩阵,原点为中心点。
腐蚀时,如果结构元素放到某个像素位置时碰到了前景(即交集中有一个像素是白色的),那么这个像素就变为前景。
图像膨胀后物体尺寸会扩大。在膨胀图像中,物体中的一些“空隙”被填满。
//膨胀图像
cv::Mat dilated;
cv::dilate(binary, dilated, cv::Mat());
cv::imshow("dilated", dilated);
函数签名
CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
函数用法同上,参数分别为:输入矩阵,输出矩阵,自定义内核(结构元素),原点坐标,迭代次数,后面默认即可。
腐蚀和膨胀运算的基本性质
- 腐蚀图像相当于对其反色图像膨胀后再去反色。
- 膨胀图像相当于对其反色图像腐蚀后再去反色。
- 建议理解:腐蚀:黑多白少,消噪声;膨胀:黑少白多,填空隙。