(_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用

1.腐蚀

概述:腐蚀掉图像的细节。若图像有很多毛刺,通过腐蚀操作,可以将毛刺消除。

        下面所说的“值”可以简单理解为RGB三个通道[0,255],值越小,亮度越低,值越大,亮度越高。

        我们首先定义了一个3*3的矩阵作为,我们不关心矩阵的值,只关心他的大小。在图像中用核选中3*3的像素块,若像素块中的值相差很大(我们可以将其想象成边界),值大的像素点会被值小的像素点给取代。这种计算操作对于图像的边缘是极为敏感的。

函数:erode(cv::InputArray src, cv::OutputArray dst, cv::InputArray kernel)

参数:在腐蚀操作中,我们主要关注以下三个参数。另一些关于边界填充的参数这里不做介绍。

1.cv::InputArray src 输入图像
2.OutputArray dst 输出图像
3.InputArray kernel

核:n*n的矩阵。n越大,腐蚀的越厉害

代码: 

#include 
#include  
#include 
#include 

using namespace cv;
using namespace std;

int main()
{
	Mat image_1 = imread("lena.jpg");
	Mat res;
	//定义一个3*3大小的方形核
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));

	erode(image_1,res,element);
	imshow("lena", image_1);
	imshow("res",res);
	waitKey(0);
	return 0;
}

输出结果:可以注意到很多毛刺都变得更加细,或者被消除。

(_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用_第1张图片

2.膨胀

概述:与腐蚀相反,膨胀后的图片会将放大图像的细节。

        其实原理和腐蚀原理一样。所说的“值”可以简单理解为RGB三个通道[0,255],值越小,亮度越低,值越大,亮度越高。

        我们首先定义了一个3*3的矩阵作为,我们不关心矩阵的值,只关心他的大小。在图像中用核选中3*3的像素块,若像素块中的值相差很大(我们可以将其想象成边界),值小的像素点会被值大的像素点给取代。也就是亮度高的像素点会被放大取代亮度低的背景像素点。

函数:dilate(cv::InputArray src, cv::OutputArray dst, cv::InputArray kernel)

参数:在膨胀操作中,我们也只关注以下三个参数。

1.cv::InputArray src 输入图像
2.OutputArray dst 输出图像
3.InputArray kernel

核:n*n的矩阵。n越大,腐蚀的越厉害

代码: 

#include 
#include  
#include 
#include 

using namespace cv;
using namespace std;

int main()
{
	Mat image_1 = imread("lena.jpg");
	Mat res;
	//定义一个3*3大小的方形核
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));

	dilate(image_1,res,element);
	imshow("lena", image_1);
	imshow("res",res);
	waitKey(0);
	return 0;
}

输出结果:第一眼看,图像变得更加模糊。但是仔细观察会发现,一些噪声点(白点),发丝等细节被放大。(_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用_第2张图片

3.开运算

 概述:先对图像进行腐蚀,再对图像进行膨胀。

函数:形态学计算(开运算、闭运算、梯度运算、礼帽、黑帽)等操作均使用该函数。

cv::morphologyEx(cv::InputArray src, cv::OutputArray dst, int op, cv::InputArray kernel,)

参数:我们关注以下四个参数。

1.cv::InputArray src 输入图像
2.OutputArray dst

输出图像

3.int op

形态操作类型(MORPH_OPEN )

4.InputArray kernel

核:n*n的矩阵。n越大,腐蚀的越厉害

代码:

#include 
#include  
#include 
#include 

using namespace cv;
using namespace std;

int main()
{
	Mat image_1 = imread("lena.jpg");
	Mat res;
	//定义一个3*3大小的方形核
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));

	morphologyEx(image_1,res,MORPH_OPEN,element);

	imshow("lena", image_1);
	imshow("res",res);
	waitKey(0);
	return 0;
}

输出结果:(_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用_第3张图片

4.闭运算

概述:先对图像进行膨胀,再对图像进行腐蚀。

函数:形态学计算(开运算、闭运算、梯度运算、礼帽、黑帽)等操作均使用该函数。

cv::morphologyEx(cv::InputArray src, cv::OutputArray dst, int op, cv::InputArray kernel,)

参数:我们关注以下四个参数。

1.cv::InputArray src 输入图像
2.OutputArray dst

输出图像

3.int op

形态操作类型(MORPH_CLOSE)

4.InputArray kernel

核:n*n的矩阵。n越大,腐蚀的越厉害

代码:

#include 
#include  
#include 
#include 

using namespace cv;
using namespace std;

int main()
{
	Mat image_1 = imread("lena.jpg");
	Mat res;
	//定义一个3*3大小的方形核
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));

	morphologyEx(image_1,res,MORPH_CLOSE,element);

	imshow("lena", image_1);
	imshow("res",res);
	waitKey(0);
	return 0;
}

输出结果:(_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用_第4张图片

5.梯度运算

概述:通过对腐蚀和膨胀的理解,我们可以认识到由于边界上色彩的差异很大,所以导致腐蚀和膨胀在边界区域的影响很大。简单化理解就是腐蚀是腐蚀边界上的细节,膨胀也是放大边界的细节,两者相减,就可以算出图像的边界信息。

代码:

#include 
#include  
#include 
#include 

using namespace cv;
using namespace std;

int main()
{
	Mat image_1 = imread("lena.jpg");
	Mat res;
	//定义一个3*3大小的方形核
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));

	morphologyEx(image_1,res,MORPH_GRADIENT,element);

	imshow("lena", image_1);
	imshow("res",res);
	waitKey(0);
	return 0;
}

输出结果:

(_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用_第5张图片

6.礼帽与黑帽

概述:礼帽运算=原始图像-开运算生成的图像

 代码:

#include 
#include  
#include 
#include 

using namespace cv;
using namespace std;

int main()
{
	Mat image_1 = imread("lena.jpg");
	Mat res;
	//定义一个3*3大小的方形核
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));

	morphologyEx(image_1,res,MORPH_TOPHAT,element);

	imshow("lena", image_1);
	imshow("res",res);
	waitKey(0);
	return 0;
}

输出结果:

(_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用_第6张图片

概述:礼帽运算=闭运算生成的图像-原始图像

 代码:

#include 
#include  
#include 
#include 

using namespace cv;
using namespace std;

int main()
{
	Mat image_1 = imread("lena.jpg");
	Mat res;
	//定义一个3*3大小的方形核
	Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));

	morphologyEx(image_1,res,MORPH_BLACKHAT,element);

	imshow("lena", image_1);
	imshow("res",res);
	waitKey(0);
	return 0;
}

输出结果:

(_cai_) opencv学习笔记(1):图像形态学计算的方式 morphology函数的应用_第7张图片

你可能感兴趣的:(计算机视觉,c++,图像处理)