(一) getStructuringElement函数
它会返回指定形状和尺寸的结构元素。
Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
1、第一个参数表示内核的形状,有三种形状可以选择。
\矩形:MORPH_RECT;
\交叉形:MORPH_CROSS;
\椭圆形:MORPH_ELLIPSE;
2、第2个参数是内核的尺寸以及
3、第3个参数锚点的位置。
一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。
(二) morphologyEx函数
void morphologyEx( InputArray src, OutputArray dst,
int op, InputArray kernel )
Mat src:输入图像
Mat dst:输出图像
int op:形态学操作类型
CV_MOP_OPEN:开操作
CV_MOP_CLOSE:闭操作
CV_MOP_GRADIENT:形态学梯度
CV_MOP_TOPHAT:顶帽
CV_MOP_BLACKHAT:黑帽
Mat kernel:结构元素
int s = 3; //具体多大看情况
Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
//形态学操作(开、闭、形态学梯度、顶帽、黑帽)
morphologyEx(srcImage, dst, MORPH_OPEN, kernel);
一、开操作 Open
1)算法说明:
对图像进行 先腐蚀后膨胀 的操作
dst = open(src, element) = dilate(erode(dst, element))
2)应用:
假设图片对象前景色为白色,背景色为黑色,通过开操作,可以去掉小范围的对象元素。同样,也可以用于有效的消除亮点(白点)噪音。
二、闭操作 Close
1)算法说明:
对图像进行 先膨胀后腐蚀 的操作
dst = close(src, element) = erode(dilate(dst, element))
2)应用:
假设图片对象前景色为白色,背景色为黑色,通过闭操作,可以去掉小范围的对象元素。同样,也可以用于有效的消除暗点(黑点)噪音。
三、形态学梯度 Morphological Gradient
1)算法说明:
膨胀减去腐蚀
dst = morph_grad(src, element) = dilate(src, element) - erode(src, element)
(这里指基本梯度,其他还包括 内部梯度、方向梯度))
2)应用:
针对二值图,可以去掉填充部分得到轮廓线
四、顶帽 Top Hat
1)算法说明:
顶帽 是源图像与开操作图像之间的差值图像)
2)效果示例:
五、黑帽 Black Hat
1)算法说明:
黑帽 是闭操作图像与源图像的差值图像)
2)效果示例:
(三) erode & dilate函数
腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。
膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空洞。
int s =XXX;//具体多大看情况
Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
erode( src, dst, kernel);
//dilate( src, dst, kernel);
(四)测试用例
int s =XXX;//具体多大看情况
Mat kernel = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
//形态学操作(开、闭、形态学梯度、顶帽、黑帽)
morphologyEx(src,
dst,
MORPH_BLACKHAT,
kernel,
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue());
//第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。
//第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。
//第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:
//MORPH_OPEN – 开运算(Opening operation):先腐蚀后膨胀,去掉小对象
//MORPH_CLOSE – 闭运算(Closing operation):先膨胀后腐蚀,可以填充一些小的空洞(fill hole)
//MORPH_GRADIENT - 形态学梯度(Morphological gradient):膨胀后的图减去腐蚀后的图(设置恰当的参数可以得到目标的大致边缘)
//MORPH_TOPHAT - “顶帽”(“Top hat”):原图像与开操作之间的差值图像(可以用来观察开运算除去了哪些小目标)
//MORPH_BLACKHAT - “黑帽”(“Black hat“):闭操作图像与源图像的差值图像(可以观察闭运算的效果)
//第四个参数:结构元素即形态学运算的内核
//第五个参数,Point类型的anchor,锚的位置,其有默认值( - 1, - 1),表示锚位于中心。
//第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。
//第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。
//第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档