前言
在上一篇文章中,我们了解了腐蚀与膨胀的原理与实现,今天我们继续学习形态学技术操作里面的开运算与闭运算。
开运算
Q:什么是开运算?
A: 我们将先腐蚀后膨胀称为开运算,开运算能够去除孤立的小点,毛刺和小桥(即联通两块区域的小点),而总的位置和形状不变。
参考代码
void morphologyEx( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar&borderValue = morph - ologyDefaultBorderValue() )
其中,src代表输入图像(二值图像或灰度图像),dst表示输出图像,op表示形态学操作算子类型,可以设置为MORPH_OPEN开操作,MORPH_CLOSE闭操作,MORPH_GRADIENT形态学梯度操作,MORPH_TOPHAT顶帽操作,MORPH_BLACKHAT黑帽操作,iterations可以选择对图像进行多次形态学运算,borderValue 和borderType 为可选参数设置,针对边界处理。
#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/types_c.h> #include<opencv2/imgproc.hpp> #include<iostream> using namespace std; using namespace cv; int main() { cv::Mat srcImage = cv::imread("...cc.png"); if (!srcImage.data) return 1; cv::Mat srcGray; cvtColor(srcImage, srcGray, CV_RGB2GRAY); cv::Mat segDst, dilDst, eroDst; // 分通道二值化 cv::inRange(srcGray, cv::Scalar(100),cv::Scalar(255), segDst); // 定义结构元素 cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(10, 10)); // 形态学闭操作 cv::Mat closeMat; cv::morphologyEx(segDst, closeMat, cv::MORPH_CLOSE, element); cv::imshow(" srcGray ", srcGray); cv::imshow(" closeMat", closeMat); cv::waitKey(); return 0; }
闭运算
Q:什么是闭运算?
A:我们将先膨胀后腐蚀成为闭运算,闭运算能够填平小孔,弥合小裂缝,而总的位置和形态不变。
参考代码
void morphologyEx( InputArray src, OutputArray dst, int op, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar&borderValue = morph - ologyDefaultBorderValue() )
其中,src代表输入图像(二值图像或灰度图像),dst表示输出图像,op表示形态学操作算子类型,可以设置为MORPH_OPEN开操作,MORPH_CLOSE闭操作,MORPH_GRADIENT形态学梯度操作,MORPH_TOPHAT顶帽操作,MORPH_BLACKHAT黑帽操作,iterations可以选择对图像进行多次形态学运算,borderValue 和borderType 为可选参数设置,针对边界处理。
#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/types_c.h> #include<opencv2/imgproc.hpp> #include<iostream> using namespace std; using namespace cv; int main() { cv::Mat srcImage = cv::imread("C:\\Users\\86173\\Desktop\\cc.png"); if (!srcImage.data) return 1; cv::Mat srcGray; cvtColor(srcImage, srcGray, CV_RGB2GRAY); cv::Mat segDst, dilDst, eroDst; // 分通道二值化 cv::inRange(srcGray, cv::Scalar(100),cv::Scalar(255), segDst); // 定义结构元素 cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(10, 10)); //形态学开操作 cv::Mat openMat; cv::morphologyEx(segDst, openMat, cv::MORPH_OPEN, element); cv::imshow(" srcGray ", srcGray); cv::imshow(" openMat", openMat); cv::waitKey(); return 0; }