形态学操作

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

形态学操作——膨胀
跟卷积操作类似,假设有图像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);

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值