前言
形态学腐蚀膨胀操作是形态学的基本操作,常用于图形处理方面,实现了对目标像素点进行拓展的目的。从数学角度来讲,腐蚀膨胀操作就是将图像或者图像的一部分(称之为核A)与核(称之为核B)进行卷积。
腐蚀
Q:什么是腐蚀?
A: 腐蚀就是求局部最小值的操作,也就是核B与图像进行卷积,计算核B覆盖区域的像素点的最小值,并把最小值赋值给参考点指定的像素,使得图像中的白色区域变小。
参考代码
void erode( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefaultB - orderValue() )
其中,src 代表输入图像(二值化、灰度图像),dst 代表输出图像,kernel表示定义的结构元素大小,anchor代表结构元素的中心,如果默认参数为 (-1,-1),程序会自动将其设置为结构元素的中心。iteration为迭代次数,可以选择对图像进行多次形态学运算。borderType以及borderValue是可选择参数设置,针对边界设置。
#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/types_c.h> #include<opencv2/imgproc.hpp> #include<iostream> using namespace cv; using namespace std; 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(5, 5)); // 腐蚀膨胀操作 cv::erode(segDst, eroDst, element); cv::imshow(" srcGray ", srcGray); cv::imshow(" segDst ", segDst); cv::imshow(" eroDst ", eroDst); cv::waitKey(); return 0; }
实现效果
膨胀
Q:什么是膨胀?
A: 膨胀就是求局部最大值的操作,也就是核B与图像进行卷积,计算核B覆盖区域的像素点的最大值,并把最大值赋值给参考点指定的像素,使得图像中的白色区域变大。
参考代码
void dilate( InputArray src, OutputArray dst, InputArray kernel, Point anchor = Point(-1, -1), int iterations = 1, int borderType = BORDER_CONSTANT, const Scalar& borderValue = morphologyDefault - BorderValue() )
其中,src 代表输入图像(二值化、灰度图像),dst 代表输出图像,kernel表示定义的结构元素大小,anchor代表结构元素的中心,如果默认参数为 (-1,-1),程序会自动将其设置为结构元素的中心。iteration为迭代次数,可以选择对图像进行多次形态学运算。borderType以及borderValue是可选择参数设置,针对边界设置。
#include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/types_c.h> #include<opencv2/imgproc.hpp> #include<iostream> using namespace cv; using namespace std; 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(5, 5)); // 腐蚀膨胀操作 cv::dilate(segDst, dilDst, element); cv::imshow(" srcGray ", srcGray); cv::imshow(" segDst ", segDst); cv::imshow(" dilDst ", dilDst); cv::waitKey(); return 0; }
实现效果