您的位置:首页 > 运维架构

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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐