opencv--膨胀和腐化

形态学

形态学(morphology)常应用在生物学中,研究动植物的形态和结构;

图像形态学即数学形态学(Mathematical morphology)是一门建立在格伦和拓扑学基础上的图像分析学科,是数学形态学图像处理的基本理论;

常见图像形态学运算:腐蚀、膨胀、开运算、闭运算、骨架抽取、极线腐蚀、击中击不中变换、Top-hat变换、颗粒分析、流域变换、形态学梯度等;

最基本的形态学操作是:膨胀(dilation)和腐蚀(erosion);

  • 膨胀操作会扩大(粗化)图像中物体的轮廓,可以用来弥补(填充)物体间的孔洞,强化离散点,代价是导致物体的面积比原来的面积要大。
  • 腐蚀操作会收缩(细化)图像中物体的轮廓,可以用来断开(分离)物体间的连接,消除离散点,代价是导致物体的面积比原来的面积要小。
    在这里插入图片描述

膨胀和腐蚀

腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。膨胀就是图像中的高亮部分进行膨胀,“领域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中的高亮部分被腐蚀,“领域被蚕食”,效果图拥有比原图更小的高亮区域。

这些形态学操作都涉及到一个关键的因子——结构元。结构元基本的形态是矩形、十字形或椭圆形(圆形)。

结构元素就相当于我们在滤波中所涉及到的模板,也就是说它是一个给定像素的矩阵,这个矩阵可以是任意形状的,但是一般情况下都是正方形,圆形或者菱形的但是在结构元素中有一个中心点(也叫做anchor point)。和模板中心一样,处理后的结果赋值给和这个中心点对齐的像素点。处理的过程也是基本相同。
结构元素和卷积模板的区别在于,

膨胀是以集合运算为基础的,卷积是以算数运算为基础的。

膨胀原理:

膨胀:求局部最大值;
①定义一个卷积核B,
核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
②将核B与图像A进行卷积,计算核B覆盖区域的像素点最大值;

  1. 用结构元素,扫描图像的每一个像素
  2. 用结构元素与其覆盖的二值图像做“与”操作
  3. 如果都为0,结果图像的该像素为0。否则为1

③将这个最大值赋值给参考点指定的像素;
因此,图像中的高亮区域逐渐增长。
在这里插入图片描述

腐蚀

腐蚀:局部最小值(与膨胀相反);
①定义一个卷积核B,
核可以是任何的形状和大小,且拥有一个单独定义出来的参考点-锚点(anchorpoint);
通常和为带参考点的正方形或者圆盘,可将核称为模板或掩膜;
②将核B与图像A进行卷积,计算核B覆盖区域的像素点最小值;

  1. 用结构元素,扫描图像的每一个像素
  2. 用结构元素与其覆盖的二值图像做“与”操作
  3. 如果都为1,结果图像的该像素为1。否则为0

③将这个最小值赋值给参考点指定的像素;
因此,图像中的高亮区域逐渐减小。
在这里插入图片描述

膨胀和腐蚀的主要用途:

  • 消除噪声;
  • 分割出独立的图像元素,在图像中连接相邻的元素;
  • 寻找图像中明显的极大值或极小值区;
  • 求出图像的梯度;

【注】:
腐蚀和膨胀是对像素值大的部分而言的,即高亮白部分而不是黑色部分;
膨胀是图像中的高亮部分进行膨胀,领域扩张,效果图拥有比原图更大的高亮区域;
腐蚀是图像中的高亮部分被腐蚀掉,领域缩减,效果图拥有比原图更小的高亮区域;

opencv中API

在这里插入图片描述

  • 卷积核
    关于核,一般配合==getStructuringElement()==使用;
    1. 功能:返回指定形状和尺寸的结构元素;
    2. 格式:
      getStructuringElement(int shape, Size ksize, Point anchor=Point(-1,-1));
    3. 参数:
      shape:表核的形状,矩形MORPH_RECT;交叉形MORPH_CROSS;椭圆形MORPH_ELLIPSE;
      ksize:核尺寸大小;
      anchor:锚点的位置,锚点只影响形态学运算结果的偏移
  • 膨胀:
CV_EXPORTS_W void dilate( InputArray src,    //输入
                          OutputArray dst,   //输出 
                          InputArray kernel, //卷积核
                          Point anchor = Point(-1,-1), //锚位置(-1,-1)为中心
                          int iterations = 1,//迭代次数
                          int borderType = BORDER_CONSTANT,//图像边界像素模式
                          const Scalar& borderValue = morphologyDefaultBorderValue() //边界值
                         );

  • 腐蚀:
CV_EXPORTS_W void erode(
				InputArray src,    //输入
				OutputArray dst,   //输出
				InputArray kernel, //核大小
				Point anchor=Point(-1,-1),// 锚位置,(-1,-1)为中心
				int iterations=1,  //迭代次数
				int borderType=BORDER_CONSTANT, //图像边界像素模式
				const Scalar& borderValue=morphologyDefaultBorderValue()//边界值
				);

在这里插入图片描述

举例

Mat src,dst1, dst2;
int step_size = 3;
int max_size = 21;

void my_dilate(int ,void*) {
	int s = step_size * 2 + 1;
	Mat structingElement = getStructuringElement(MORPH_ELLIPSE, Size(s, s), Point(-1, -1));
	dilate(src, dst1, structingElement);
	imshow("dilate", dst1);
	return;
}

void my_erode(int, void*) {
	int s = step_size * 2 + 1;
	Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(s, s));
	erode(src, dst2, kernel);
	imshow("erode", dst2);
	return;
}
int main() {
    src = imread("D:\\cat.jpg");
	if (src.empty()) {
		cerr << "open error" << endl;
		return -1;
	}
	imshow("cat", src);
	my_dilate(0, 0);
	my_erode(0, 0);
	createTrackbar("erode_size", "erode", &step_size, max_size, my_erode);
	createTrackbar("膨胀:", "dilate", &step_size, max_size,my_dilate);
	waitKey(0);
}

在这里插入图片描述

详细:https://blog.csdn.net/qq_37059483/article/details/77878829

猜你喜欢

转载自blog.csdn.net/qq_41498261/article/details/84030883