形态学操作

图像的形态学操作是基于形状的一系列图像处理操作的合集,主要是基于集合理论基础上的形态学数学。
形态学主要有四个操作:腐蚀,膨胀,开环,闭环。

形态学操作——膨胀
跟卷积操作类似,假设有图像A和结构元素B,结构元素在图像A上进行逐点移动,定义结构元素B的中心点,计算B覆盖在A上的最大像素值用来替换中心点的像素。结构元素B可以是任意形状。
这里写图片描述

CV_EXPORTS_W Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));

参数shape:结构元素的形状,可以为MORPH_RECT,MORPH_CROSS,MORPH_ELLIPSE。
参数ksize:结构元素的大小
参数anchor:默认是Point(-1,-1),意思是中心像素点。

CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
                          Point anchor = Point(-1,-1), int iterations = 1,
                          int borderType = BORDER_CONSTANT,
                          const Scalar& borderValue = morphologyDefaultBorderValue() );

参数src:输入图像
参数dst:输出图像
参数kernel:结构元素
参数anchor:元素内的锚点,默认是中心点

int element_size = 3;
int max_size = 21;

createTrackbar("Element Size:", output_win, &element_size, max_size, Callback_Demo);
Callback_Demo(0, 0);
void Callback_Demo(int, void*)
{
    int s = element_size * 2 + 1;
    Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
    dilate(src, dst, structureElement, Point(-1, -1));
    imshow(output_win, dst);
    return;
}

这里写图片描述
这里写图片描述

形态学操作——腐蚀
腐蚀和膨胀操作过程类似,唯一不同的是以最小值替换中心点的像素。
这里写图片描述

CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() 

参数src:输入图像
参数dst:输出图像
参数kernel:结构元素
参数anchor:元素内的锚点,默认是中心点

void Callback_Demo(int, void*)
{
    int s = element_size * 2 + 1;
    Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
    erode(src, dst, structureElement, Point(-1, -1));
    imshow(output_win, dst);
    return;
}

这里写图片描述

动态调整结构元素

使用滑动块来调整结构元素大小

CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);

参数trackbarname:轨迹条的名称
参数winname:窗口的名称,用来表示轨迹条放在哪个窗口上
参数value:表示滑块的位置,即初始化时滑块的位置
参数count:滑块的最大位置
参数onChange :回调函数的指针,每次移动滑块时,都会调用该函数,回调函数的类型必须为void Callback(int, void*);

开闭环操作
开环操作:对目标图像先使用结构元素腐蚀操作,在进行膨胀操作
闭环操作:对目标图像先使用结构元素膨胀操作,在进行腐蚀操作

CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst,
                                     double maxValue, int adaptiveMethod,
                                     int thresholdType, int blockSize, double C );

参数src:输入图像
参数dst:输出图像
参数maxValue:图像中的最大灰度值
参数adaptiveMethod:自适应阈值方式,参数为ADAPTIVE_THRESH_MEAN_C或者ADAPTIVE_THRESH_GAUSSIAN_C之一
参数thresholdType:阈值类型,参数为THRESH_BINARY或者 THRESH_BINARY_INV
参数C:从平均值或加权平均值中减去的常量。

CV_EXPORTS_W 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() );

参数src:输入图像
参数dst:输出图像
参数op:形态学操作类型,参数为MORPH_ERODE(腐蚀),MORPH_DILATE(膨胀),MORPH_OPEN(开运算),MORPH_CLOSE(闭运算),MORPH_GRADIENT(形态学梯度运算),MORPH_TOPHAT(顶帽),MORPH_BLACKHAT(黑帽),MORPH_HITMISS(击中击不中)
参数kernel:结构元素
参数anchor:结构元素的锚点

//在图像前加~表示,图像取非运算,gray_src是二值图
adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 9, -2);
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
morphologyEx(binImg, dst, CV_MOP_OPEN, kernel);

原图:
这里写图片描述
二值图:
这里写图片描述
开运算:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab形态学操作主要有膨胀、腐蚀、开运算、闭运算、骨架提取等。 1. 膨胀操作: 膨胀操作是一种图像处理常用的形态学操作,它可以将图像的物体进行膨胀,使物体的边界向外扩张。膨胀操作可以用于填充图像的空洞、连接相邻物体等。 使用Matlab的imdilate函数进行膨胀操作,例如: ```matlab img = imread('lena.jpg'); se = strel('disk', 5); img_dilate = imdilate(img, se); imshow(img_dilate); ``` 其,img是待处理的图像,se是膨胀操作的结构元素,可以是各种形状,例如矩形、圆形等。上述代码,我们使用了一个半径为5的圆形结构元素进行膨胀操作。 2. 腐蚀操作: 腐蚀操作是一种图像处理常用的形态学操作,它可以将图像的物体进行腐蚀,使物体的边界向内收缩。腐蚀操作可以用于去除图像的噪声、分离相邻物体等。 使用Matlab的imerode函数进行腐蚀操作,例如: ```matlab img = imread('lena.jpg'); se = strel('disk', 5); img_erode = imerode(img, se); imshow(img_erode); ``` 其,img是待处理的图像,se是腐蚀操作的结构元素,可以是各种形状,例如矩形、圆形等。上述代码,我们使用了一个半径为5的圆形结构元素进行腐蚀操作。 3. 开运算操作: 开运算操作是一种图像处理常用的形态学操作,它可以先进行腐蚀操作,再进行膨胀操作,用于去除图像的噪声、平滑物体的边缘等。 使用Matlab的imopen函数进行开运算操作,例如: ```matlab img = imread('lena.jpg'); se = strel('disk', 5); img_open = imopen(img, se); imshow(img_open); ``` 其,img是待处理的图像,se是开运算操作的结构元素,可以是各种形状,例如矩形、圆形等。上述代码,我们使用了一个半径为5的圆形结构元素进行开运算操作。 4. 闭运算操作: 闭运算操作是一种图像处理常用的形态学操作,它可以先进行膨胀操作,再进行腐蚀操作,用于填充图像的空洞、平滑物体的边缘等。 使用Matlab的imclose函数进行闭运算操作,例如: ```matlab img = imread('lena.jpg'); se = strel('disk', 5); img_close = imclose(img, se); imshow(img_close); ``` 其,img是待处理的图像,se是闭运算操作的结构元素,可以是各种形状,例如矩形、圆形等。上述代码,我们使用了一个半径为5的圆形结构元素进行闭运算操作。 5. 骨架提取: 骨架提取是一种图像处理常用的形态学操作,它可以将图像的物体提取出来,得到物体的骨架结构。骨架提取可以用于医学图像分析、机器人视觉等领域。 使用Matlab的bwmorph函数进行骨架提取操作,例如: ```matlab img = imread('lena.jpg'); img_bw = im2bw(img); img_skel = bwmorph(img_bw, 'skel', Inf); imshow(img_skel); ``` 其,img是待处理的图像,先将图像转换为二值图像img_bw,然后使用bwmorph函数进行骨架提取操作,‘skel’表示提取骨架结构,Inf表示提取到最细的骨架结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值