声明:虽然肯定没人看,但是我要说明,里面的内容都是我从官方文档上抄的,仅作为个人复习之用,并非原创。
腐蚀(Erosion)和膨胀 (Dilation)两个基本操作以后,有五个形态学操作。分别为开运算,闭运算,形态梯度,顶帽和黑帽。
开运算: 开运算是通过先对图像腐蚀再膨胀实现的。
作用:能够排除小团块物体(假设物体较背景明亮)
请看下面,左图是原图像,右图是采用开运算转换之后的结果图。 观察发现字母拐弯处的白色空间消失。
闭运算:先膨胀再腐蚀。
作用 排除小型黑洞。(黑色区域)
梯度运算:膨胀与腐蚀之差 保存物体的边缘轮廓
顶帽: 原图与开源算之差
黑帽:闭运算与原图之差
形态操作函数原型。src即原图,dst即操作后存储位置。int op 即为操作类型,其值从2到6,分别对应了开运算、闭运算、梯度运算、顶帽和黑帽五个操作。其后为内核形状,大小。
CV_EXPORTS_W Mat imread( const string& filename, int flags=1 );
读入图片 filename指明路径和文件名 flags表示读取类型,如0为灰度图,1为RGB类型
CV_EXPORTS_W void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE);
建立一个窗口 winname为窗口名称 flags为相应属性。如果为WINDOW_AUTOSIZE 则窗口的大小不可改变。如果为WINDOW_NORMAL 则大小可变。
CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,
int* value, int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
创建一个滑动条 可以便于修改参数
trackbarname即滑动条名称
winname是滑动条载体窗口的名称
int *value是初始阈值
int count是滑动条刻度范围
onChange是一个回调函数 一般就声明成 int fun(int ,void*)然而并不懂为什么这么干,回调函数在滑动条的内容改变的时候调用。在我所见到的函数实例中,因为初始阈值是一个指针传参,将其设置为全局变量,然后在回调函数的调用过程中根据全局变量的值来进行处理。然而全局变量是不安全的,也不懂为什么这么用,还是说回调函数的参数也是可用的,根据传参进行调用?不是很懂。
CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1));
这个应该是关于内核的生成,shape就是内核形状,有正方形,椭圆形,交叉形,Size表示的是内核大小,只能为奇数*奇数 anchor是锚点 应该是核心的意思吧。
-
请看下面,左图是原图像,右图是采用开运算转换之后的结果图。 观察发现字母拐弯处的白色空间消失。