opencv学习笔记--形态学操作

声明:虽然肯定没人看,但是我要说明,里面的内容都是我从官方文档上抄的,仅作为个人复习之用,并非原创。

腐蚀(Erosion)和膨胀 (Dilation)两个基本操作以后,有五个形态学操作。分别为开运算,闭运算,形态梯度,顶帽和黑帽。


开运算: 开运算是通过先对图像腐蚀再膨胀实现的。


作用:能够排除小团块物体(假设物体较背景明亮)

请看下面,左图是原图像,右图是采用开运算转换之后的结果图。 观察发现字母拐弯处的白色空间消失。



闭运算:先膨胀再腐蚀。

作用 排除小型黑洞。(黑色区域)


梯度运算:膨胀与腐蚀之差 保存物体的边缘轮廓


顶帽: 原图与开源算之差


黑帽:闭运算与原图之差

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() );

形态操作函数原型。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是锚点 应该是核心的意思吧。

  • 请看下面,左图是原图像,右图是采用开运算转换之后的结果图。 观察发现字母拐弯处的白色空间消失。

你可能感兴趣的:(opencv)