opencv学习笔记3 滤波 形态学

一。滤波

1.方框滤波

void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )

2.均值滤波

void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT )

3.高斯滤波

void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT )

4.中值滤波

void medianBlur(InputArray src,OutputArray dst, int ksize)

5.双边滤波

void bilateralFilter(InputArray src, OutputArraydst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)

二。形态学-膨胀、腐蚀

1.膨胀(求局部最大值)

void dilate(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);

2.腐蚀(求局部最小值)

void erode(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor=Point(-1,-1),
int iterations=1,
int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue()
);

 1 #include <opencv2/core/core.hpp>
 2 #include<opencv2/highgui/highgui.hpp>
 3 #include"opencv2/imgproc/imgproc.hpp"
 4 #include <iostream>
 5 using namespace std;
 6 using namespace cv;
 7 int main()
 8 {
 9     Mat src = imread("E:/test.jpg");
10     Mat dst1;
11     Mat dst2;
12     //定义内核
13     Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
14     dilate(src, dst1, element);//膨胀
15     erode(src, dst2, element);//腐蚀
16     imshow("src", src);
17     imshow("dst1", dst1);
18     imshow("dst2", dst2);
19     waitKey();
20     return 0;
21 }

三。形态学-开运算、闭运算、形态学梯度、顶帽、黑帽

morphologyEx函数

void morphologyEx(
InputArray src,
OutputArray dst,
int op,
InputArraykernel,
Pointanchor=Point(-1,-1),
intiterations=1,
intborderType=BORDER_CONSTANT,
constScalar& borderValue=morphologyDefaultBorderValue() );

op选项

MORPH_OPEN – 开运算(Opening operation)
MORPH_CLOSE – 闭运算(Closing operation)
MORPH_GRADIENT -形态学梯度(Morphological gradient)
MORPH_TOPHAT - “顶帽”(“Top hat”)
MORPH_BLACKHAT - “黑帽”(“Black hat“)

1.开运算 先腐蚀后膨胀

开运算可以用来消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积

1     Mat src = imread("E:/test.jpg");
2     Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
3     Mat open;
4     morphologyEx(src, open,MORPH_OPEN, element);
5     imshow("原图", src);
6     imshow("开运算", open);

2.闭运算 膨胀后腐蚀

闭运算能够排除小型黑洞(黑色区域)

1     Mat src = imread("E:/test.jpg");
2     Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
3     Mat close;
4     morphologyEx(src, close,MORPH_CLOSE, element);
5     imshow("原图", src);
6     imshow("闭运算", close);

3.形态学梯度 膨胀图与腐蚀图之差

形态学梯度来保留物体的边缘轮廓

1     Mat src = imread("E:/test.jpg");
2     Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
3     Mat gradient;
4     morphologyEx(src, gradient, MORPH_GRADIENT, element);
5     imshow("原图", src);
6     imshow("形态学梯度", gradient);

4.顶帽 原图与开运算后的图作差

顶帽运算往往用来分离比邻近点亮一些的斑块。当一幅图像具有大幅的背景的时候,而微小物品比较有规律的情况下,可以使用顶帽运算进行背景提取

1     Mat src = imread("E:/test.jpg");
2     Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
3     Mat tophat;
4     morphologyEx(src, tophat, MORPH_TOPHAT, element);
5     imshow("原图", src);
6     imshow("顶帽", tophat);

5.黑帽 闭运算的图与原图作差

黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。

所以,黑帽运算用来分离比邻近点暗一些的斑块

1     Mat src = imread("E:/test.jpg");
2     Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
3     Mat blackhat;
4     morphologyEx(src, blackhat, MORPH_BLACKHAT, element);
5     imshow("原图", src);
6     imshow("形态学梯度", blackhat);

 

猜你喜欢

转载自www.cnblogs.com/sclu/p/11507717.html