概述:腐蚀掉图像的细节。若图像有很多毛刺,通过腐蚀操作,可以将毛刺消除。
下面所说的“值”可以简单理解为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;
}
输出结果:可以注意到很多毛刺都变得更加细,或者被消除。
概述:与腐蚀相反,膨胀后的图片会将放大图像的细节。
其实原理和腐蚀原理一样。所说的“值”可以简单理解为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;
}
输出结果:第一眼看,图像变得更加模糊。但是仔细观察会发现,一些噪声点(白点),发丝等细节被放大。
概述:先对图像进行腐蚀,再对图像进行膨胀。
函数:形态学计算(开运算、闭运算、梯度运算、礼帽、黑帽)等操作均使用该函数。
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;
}
概述:先对图像进行膨胀,再对图像进行腐蚀。
函数:形态学计算(开运算、闭运算、梯度运算、礼帽、黑帽)等操作均使用该函数。
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;
}
概述:通过对腐蚀和膨胀的理解,我们可以认识到由于边界上色彩的差异很大,所以导致腐蚀和膨胀在边界区域的影响很大。简单化理解就是腐蚀是腐蚀边界上的细节,膨胀也是放大边界的细节,两者相减,就可以算出图像的边界信息。
代码:
#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;
}
输出结果:
概述:礼帽运算=原始图像-开运算生成的图像
代码:
#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;
}
输出结果:
代码:
#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;
}
输出结果: