形态学操作就是基于形状的一系列图像处理操作,也可以理解为一种滤波行为。最基本的形态学操作使:膨胀和腐蚀。
膨胀是图像和核进行卷积,然后取覆盖区域的最大值,这样就会使图像的高亮区域增大,OpenCV的API是dilate。和膨胀相反的,腐蚀是取的覆盖区域最小值。这样会使图像的高亮区域减少,OpenCV的API是erode。
void dilate( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
void erode( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
和卷积核不同的是,我们可以自定义自己的形态核,形态核不需要任何数值的填充,核在图像上移动时候,核元素只需要确定简单的标明在哪个范围内取最大值和最小值。自定义核的API函数是getStructuringElement。
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
Mat src,dst,dst1,mapx,mapy;
char OUTPUT[] ="Win2";
int TrackBarPos = 0;
int TrackBarMax = 21;
void CallBack(int, void*);
int main()
{
src = imread("D:/Lena.jpg");
if(!src.data)
{
cout<<"Picture loading failed !"<
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 = morphologyDefaultBorderValue() );
Mat src,dst,dst1,mapx,mapy;
char OUTPUT[] ="Win2";
int TrackBarPos = 0;
int TrackBarMax = 21;
int ModePos = 0;
int ModeMax = 6;
void CallBack(int, void*);
int main()
{
src = imread("D:/dilate.jpg");
if(!src.data)
{
cout<<"Picture loading failed !"<
int main()
{
//读取图像
Mat src, dst;
src = imread("D:/121.png");
if (!src.data)
{
cout<<"Picture loading failed !"<