形态学滤波:对二值图像进行开运算与闭运算。
morphologyEx()函数可以实现形态学处理的很多运算,慢慢来~
API函数:
CV_EXPORTS_W void morphologyEx(InputArray src,//输入图像
OutputArray dst,//输出图像
int op, //标识符,表示形态学运算的类型
InputArray kernel,//结构元素,即用于卷积的内核
Point anchor = Point(-1, -1),//默认值,锚点位于中心
int iterations = 1,//默认值,迭代次数
int borderType = BORDER_CONSTANT,//默认值
const Scalar& borderValue = morphologyDefaultBorderValue());//默认值
一、c++示例代码
//包含头文件
#include <opencv2/opencv.hpp>
//命名空间
using namespace cv;
using namespace std;
//全局函数声明部分
//主函数
int main()
{
//【1】载入图像,灰度化
Mat image = imread("F:\\opencvtest\\testImage\\faceBinary.png", 0);//灰度原图
//【2】检查是否载入成功
if (image.empty())
{
printf("读取图片错误,请确认目录下是否有imread函数指定图片存在! \n ");
return 0;
}
//【3】获取结构元素
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
//【4】闭运算
Mat closedImage;
morphologyEx(image, closedImage, MORPH_CLOSE, element);
//【5】开运算
Mat openedImage;
morphologyEx(image, openedImage, MORPH_OPEN, element);
//【6】显示图像
imshow("13-二值图像", image);
imshow("13-闭运算", closedImage);
imshow("13-开运算", openedImage);
//【7】保持窗口显示
waitKey(0);
return 0;
}
二、运行截图
1.二值图像原图
2.闭运算
3.开运算
三、数字图像处理知识
1.对二值图像开运算
定义:先腐蚀再膨胀,相当于先用结构元素B对A腐蚀,再对腐蚀结果用同样的结构元进行膨胀操作。
等幂性:对同样的A,做多次开运算的结果与做一次是一样的。
结果:开运算的边界是由这样一些点组成的,就是当B沿A的内部边界滚动时,B中所能达到的A的内部边界的最远的点。
2.对二值图像闭运算
定义:先膨胀再腐蚀,相当于先用结构元B对A进行膨胀,再对膨胀结果用同样的结构元进行腐蚀操作,过程与开运算正好相反。
等幂性:对同样的A,做多次闭运算的结果与做一次是一样的。
就像腐蚀和膨胀的关系一样,开和闭也是关于集合补和反转的对偶。
3.对二值图像开、闭运算的基本作用
从开、闭运算的基本定义和运行过程可以看出,这两种集合操作的所能导致的大致效果如下:
开运算通常对图像轮廓进行平滑,使狭窄的“地峡”形状断开,去掉细的突起。
闭运算也是趋向于平滑图像的轮廓,但于开运算相反,它一般使窄的断开部位和细长的沟熔合,填补轮廓上的间隙。
可以这样想,对一副二值图像进行开运算,结果是对图像白色部分去掉细的突起,相当于对图像黑色部分填补轮廓上的间隙。对一副二值图像进行闭运算,结果是对图像白色部分填补轮廓上的间隙,相当于对图像黑色部分去掉细的突起。二值图像,非黑即白,你把黑白转换一下,更容易明白开闭运算!