(_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 <iostream>
#include <opencv.hpp> 
#include <core/core.hpp>
#include <highgui/highgui.hpp>

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

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

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 <iostream>
#include <opencv.hpp> 
#include <core/core.hpp>
#include <highgui/highgui.hpp>

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

输出结果:第一眼看,图像变得更加模糊。但是仔细观察会发现,一些噪声点(白点),发丝等细节被放大。

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 <iostream>
#include <opencv.hpp> 
#include <core/core.hpp>
#include <highgui/highgui.hpp>

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

输出结果:

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 <iostream>
#include <opencv.hpp> 
#include <core/core.hpp>
#include <highgui/highgui.hpp>

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

输出结果:

5.梯度运算

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

代码:

#include <iostream>
#include <opencv.hpp> 
#include <core/core.hpp>
#include <highgui/highgui.hpp>

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

输出结果:

6.礼帽与黑帽

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

 代码:

#include <iostream>
#include <opencv.hpp> 
#include <core/core.hpp>
#include <highgui/highgui.hpp>

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

输出结果:

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

 代码:

#include <iostream>
#include <opencv.hpp> 
#include <core/core.hpp>
#include <highgui/highgui.hpp>

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

输出结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值