图像的形态学操作是基于形状的一系列图像处理操作的合集,主要是基于集合理论基础上的形态学数学。
形态学主要有四个操作:腐蚀,膨胀,开环,闭环。
形态学操作——膨胀
跟卷积操作类似,假设有图像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);
原图:
二值图:
开运算: