1.腐蚀与膨胀
腐蚀:删除对象边界的某些像素,将图像的边缘腐蚀掉。作用就是将目标的边缘的“毛刺”踢除掉。
膨胀:为图像中的对象边界添加像素,将图像的边缘扩大些。作用就是将目标的边缘或者是内部的坑填掉。
腐蚀替换当前像素位像素集合中找到的最小像素值;
膨胀替换挡墙像素位像素集合中找到的最大像素值;
腐蚀和膨胀分别由函数cv::erode和cv::dilate实现;
erode(src, dst, cv::Mat());
OpenCv默认使用3*3的方形结构元素,当第3个参数被设置为空矩阵(即cv::Mat())时,这个默认结构被使用。
你也可以这样使用
cv::Mat element(7, 7, CV_8U, Scalar(1));
erode(src, dst, element);
对图像腐蚀3次, erode(src, dst, cv::Mat(),Point(-1,-1),3);获得的图像与7*7结构元素的结果一样
//图像的腐蚀与膨胀
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("001.jpg");
if(!src.data){ cout << "error"; exit(1); }
Mat dst,dst2;
//腐蚀图像
erode(src, dst, cv::Mat());
imshow("腐蚀", dst);
//膨胀图像
dilate(src, dst2, cv::Mat());
imshow("膨胀", dst2);
imshow("原图", src);
waitKey(0);
return 0;
}
结果如下:原图,腐蚀,膨胀
2.闭运算与开运算
此函数实现闭运算:cv::morphologyEx(src, closed, cv::MORPH_CLOSE, element5);
此函数实现开运算:cv::morphologyEx(src, opened, cv::MORPH_OPEN,element5);
闭运算定义为对图像先膨胀再腐蚀;
开运算定义为对图像先腐蚀再膨胀;
注意:对一幅图像多次使用相同的开运算(或闭运算)是没有效果的
//闭运算与开运算
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("001.jpg");
if(!src.data){ cout << "error"; exit(1); }
Mat closed,opened;
cv::Mat element5(5, 5, CV_8U, Scalar(1));
//闭运算
cv::morphologyEx(src, closed, cv::MORPH_CLOSE, element5);
imshow("闭运算", closed);
//膨胀图像
cv::morphologyEx(src, opened, cv::MORPH_OPEN,element5);
imshow("开运算", opened);
imshow("原图", src);
waitKey(0);
return 0;
}
由结果看到:闭运算将白色前景物体中的小洞填充,开运算移除的是场景中比较小的物体。