opencv2图像的腐蚀和膨胀运算
2015-01-12 21:42
260 查看
图像的腐蚀和膨胀是图像的形态学运算的基础算法,下面来分别看一下两种运算,opencv已经将这个算法分装起来了
在这里我将这两个函数分装一下,使用起来更加方便
下面程序中实现了腐蚀和膨胀运算:
在这里我将这两个函数分装一下,使用起来更加方便
下面程序中实现了腐蚀和膨胀运算:
#include<opencv2/imgproc/imgproc.hpp> #include<opencv2/imgproc/types_c.h> #include<opencv2/highgui/highgui.hpp> #include<opencv2/core/core.hpp> #include<iostream> #include<vector> #include<opencv2/nonfree/features2d.hpp> #include<opencv2/legacy/legacy.hpp> #include<opencv2/features2d/features2d.hpp> #include<opencv2/calib3d/calib3d.hpp> #include<opencv2/video/tracking.hpp> #include<sstream> using namespace cv; using namespace std; class Package { private: Mat GrayImage; public: /*图像的腐蚀运算 腐蚀运算一般是对二值图像进行分析的,所以输入的是一副二值图像 这里为了使用方便,如果输入的不是二值图像,该函数将先转换为二值图像,所以有个参数是选择阀值化的阀值 函数返回的是一个经过腐蚀处理的二值图像 函数的第二个参数是为输入的图像不是二值图像设定的,如果不是二值图像,想要哪个通道变成二值图像,需要通过这个参数设定 后面的几个参数分别是进行二值处理的时候用的阀值和最大值参数和进行阀值化的类型参数 倒数第二个参数是进行进行腐蚀处理的结构矩阵,可以通过调用Package类中的CreatElement()函数得到结构矩阵,也可以用Mat() 最后一个参数是选择运算的次数*/ Mat ErodeImage(const Mat &InImage, int channelsnum, double thresholded, double maxval, int type, Mat &element, int mathnum = 1); /*图像的膨胀运算 和腐蚀处理的函数类似,只是处理的结果不同*/ Mat DilateImage(const Mat &InImage, int channelsnum, double thresholded, double maxval, int type, Mat &element, int mathnum = 1); /*创建一个8位的n*n的结构元素*/ Mat CreatElement(int n); }; Mat Package::ErodeImage(const Mat &InImage, int channelsnum, double thresholded, double maxval, int type, Mat &element, int mathnum) { Mat OutImage; Mat HsvImage; vector<Mat>channelsvector; vector<Mat>hsvvector; if (InImage.channels() == 3) { if (channelsnum == 0) { cvtColor(InImage, GrayImage, CV_BGR2GRAY); } if (channelsnum == 1) { split(InImage, channelsvector); GrayImage = channelsvector[0]; } if (channelsnum == 2) { split(InImage, channelsvector); GrayImage = channelsvector[1]; } if (channelsnum == 3) { split(InImage, channelsvector); GrayImage = channelsvector[2]; } if (channelsnum == 4) { cvtColor(InImage, HsvImage, CV_BGR2HSV); split(HsvImage, hsvvector); GrayImage = hsvvector[0]; } if (channelsnum == 5) { cvtColor(InImage, HsvImage, CV_BGR2HSV); split(HsvImage, hsvvector); GrayImage = hsvvector[1]; } if (channelsnum == 6) { cvtColor(InImage, HsvImage, CV_BGR2HSV); split(HsvImage, hsvvector); GrayImage = hsvvector[2]; } } else GrayImage = InImage; threshold(GrayImage, OutImage, thresholded, maxval, type); //开始进行腐蚀处理 erode(OutImage, OutImage, element, Point(-1, -1), mathnum); return OutImage; } Mat Package::DilateImage(const Mat &InImage, int channelsnum, double thresholded, double maxval, int type, Mat &element, int mathnum) { Mat OutImage; Mat HsvImage; vector<Mat>channelsvector; vector<Mat>hsvvector; if (InImage.channels() == 3) { if (channelsnum == 0) { cvtColor(InImage, GrayImage, CV_BGR2GRAY); } if (channelsnum == 1) { split(InImage, channelsvector); GrayImage = channelsvector[0]; } if (channelsnum == 2) { split(InImage, channelsvector); GrayImage = channelsvector[1]; } if (channelsnum == 3) { split(InImage, channelsvector); GrayImage = channelsvector[2]; } if (channelsnum == 4) { cvtColor(InImage, HsvImage, CV_BGR2HSV); split(HsvImage, hsvvector); GrayImage = hsvvector[0]; } if (channelsnum == 5) { cvtColor(InImage, HsvImage, CV_BGR2HSV); split(HsvImage, hsvvector); GrayImage = hsvvector[1]; } if (channelsnum == 6) { cvtColor(InImage, HsvImage, CV_BGR2HSV); split(HsvImage, hsvvector); GrayImage = hsvvector[2]; } } else GrayImage = InImage; threshold(GrayImage, OutImage, thresholded, maxval, type); //开始进行膨胀处理 dilate(OutImage, OutImage, element, Point(-1, -1), mathnum); return OutImage; } Mat Package::CreatElement(int n) { Mat OutImage(n, n, CV_8U, Scalar(1)); return OutImage; } Package P; int main() { Mat img = imread("G:\\group.jpg"); Mat element = P.CreatElement(5); //创建一个5*5的结构矩阵 namedWindow("img"); imshow("img", img); Mat erode = P.ErodeImage(img, 0, 40, 255, THRESH_BINARY_INV, element); namedWindow("erode"); imshow("erode", erode); Mat dilate = P.DilateImage(img, 0, 40, 255, THRESH_BINARY_INV, element); namedWindow("dilate"); imshow("dilate", dilate); waitKey(0); return 0; }
相关文章推荐
- opencv(十二)---图像的腐蚀,膨胀,开运算和闭运算
- opencv 图像处理 形态学操作 腐蚀 膨胀 开闭运算 阈值二值化 图像卷积 图像金字塔 Sobel算子 Laplacian 算子 candy边缘检测 霍夫变换 直方图
- OpenCV2编程手册笔记之 5.2形态学滤波对图像进行腐蚀、膨胀运算
- 【OpenCV3图像处理】形态学 --- 膨胀、腐蚀、开运算 闭运算、形态学梯度、顶帽运算、黑帽运算
- opencv for python (14) 形态学转换(图像腐蚀、图像膨胀、开运算、闭运算、形态学梯度、礼帽、黑帽)
- OpenCV学习(10) 图像的腐蚀与膨胀(1)
- 图像处理__腐蚀和膨胀_开运算_闭运算
- OpenCV之十 形态学图像处理(一):膨胀与腐蚀
- opencv----形态学运算:腐蚀、膨胀
- python 简单图像处理(14) 灰度图腐蚀和膨胀,开运算、闭运算
- 有关opencv的学习(16)—图像的膨胀和腐蚀(2)
- 图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算
- 【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀
- OpenCV学习笔记:二值图像的腐蚀和膨胀的原理
- opencv 形态学膨胀和腐蚀以及开运算和闭运算
- 14. 对一幅二值图像进行膨胀、腐蚀、开运算和闭运算,观察效果。
- 【OpenCV入门教程之十】 形态学图像处理(一):膨胀与腐蚀
- opencv 图像的膨胀和腐蚀(一)
- [转] opencv中的图像形态学——腐蚀膨胀
- Matlab 图像处理 形态学 腐蚀 膨胀 开闭运算 连通分量