OpenCV  4.10.0
开源计算机视觉
正在加载...
正在搜索...
没有匹配项
形态学变换

目标

理论

形态学变换是基于图像形状的一些简单操作。这种操作通常在二值图像上执行。它需要两个输入,一个是原始图像,另一个称为**结构/形态学元素**或**内核**,它决定操作的性质。两个基本的形态学操作符是腐蚀和膨胀。然后其变体形式,如开运算、闭运算和梯度等也会发挥作用。我们将借助以下图像逐个了解它们

image

1. 腐蚀

腐蚀的基本思想就像土壤侵蚀一样,它侵蚀前景物体的边界(始终尝试将前景保持为白色)。它会做什么?当内核滑过图像(就像在二维卷积中)时,原始图像(1 或 0)中的像素仅当内核下的所有像素都为 1 时才被视为 1,否则它会被腐蚀(变为零)。

因此,发生的事情是,所有靠近边界处的像素都将根据内核的大小被丢弃。因此,前景物体的厚度或大小会减小,或者图像中的白色区域会减小。它可用于去除小的白色噪声(如我们在色彩空间章节中看到的那样),分离两个连接的对象等。

我们使用函数:cv.erode (src, dst, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())

参数
src输入图像;通道数可以任意指定,但深度应为 cv.CV_8U、cv.CV_16U、cv.CV_16S、cv.CV_32F 或 cv.CV_64F 之一。
dst输出图像,其大小和类型与 src 相同。
kernel用于腐蚀的结构元素。
anchor锚在元素中的位置;new cv.Point(-1, -1) 的默认值表示该锚位于元素中心。
迭代腐蚀应用的次数。
边框类型像素外推方法(请参阅 cv.BorderTypes)。
边界值常量边框的情况下的边框值

尝试一下

2. 膨胀

这与腐蚀正好相反。此处,当内核下至少有一个像素是时,则像素元素为“1”。所以它会增大图像中的白色区域或加大前景物体尺寸。通常,在噪声去除等情况下,腐蚀后会进行膨胀。因为,腐蚀会去除白色噪声,但它也会缩小我们的物体。所以我们要膨胀它。由于噪声已经去除,它们将不会回来,但我们的物体面积却增加了。它还有助于连接物体的破碎部分。

我们使用函数: cv.dilate (src, dst, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())

参数
src输入图像;通道数可以任意指定,但深度应为 cv.CV_8U、cv.CV_16U、cv.CV_16S、cv.CV_32F 或 cv.CV_64F 之一。
dst输出图像,其大小和类型与 src 相同。
kernel用于膨胀的结构元素。
anchor锚在元素中的位置;new cv.Point(-1, -1) 的默认值表示该锚位于元素中心。
迭代膨胀应用的次数。
边框类型像素外推方法(请参阅 cv.BorderTypes)。
边界值常量边框的情况下的边框值

尝试一下

3. 开启

开启只另一种叫法,即 腐蚀后跟膨胀。它有助于去除噪声。

我们使用函数: cv.morphologyEx (src, dst, op, kernel, anchor = new cv.Point(-1, -1), iterations = 1, borderType = cv.BORDER_CONSTANT, borderValue = cv.morphologyDefaultBorderValue())

参数
src源图像。通道数量可以任意。深度应为 cv.CV_8U、cv.CV_16U、cv.CV_16S、cv.CV_32F 或 cv.CV_64F 之一
dst目标图像,其大小和类型与源图像相同。
op形态学操作类型(请参阅 cv.MorphTypes)。
kernel构建元素。可以使用 cv.getStructuringElement 创建构建元素。
anchor内核中的锚点位置。负值表示锚点位于内核中心。
迭代膨胀应用的次数。
边框类型像素外推方法(请参阅 cv.BorderTypes)。
边界值在采用恒定边界的情况下且边界值为默认值时,具有特殊含义。

实践

4. 闭运算

闭运算与开运算相反,它是膨胀操作后接腐蚀操作。它可用于封闭前景对象内部的小孔,或对象上较小的黑点。

实践

5. 形态梯度

形态梯度指图像的膨胀与腐蚀运算之间的差别。

结果看起来将呈现物体的轮廓。

实践

6. 礼帽

礼帽指输入图像与该图像的开运算之间的差别。

实践

7. 黑帽

黑帽指输入图像的闭运算与输入图像之间的差别。

实践

构建元素

在之前利用 cv.Mat.ones 创建了构建元素。构建元素具有矩形形状。但在某些情况下,你可能需要椭圆形/圆形的内核。因此,针对此类情况,OpenCV 设计了一个函数:cv.getStructuringElement()。你只需传入内核的形状和大小即可得到所需的内核。

我们使用函数:cv.getStructuringElement (shape, ksize, anchor = new cv.Point(-1, -1))

参数
形状元素形状,可以是 cv.MorphShapes 中的一种
ksize构建元素的大小。
anchor元素中的锚点位置。默认值 [−1,−1] 表示锚点位于中心。请注意,仅十字形元素的形状取决于锚点的位置。在其他情况下,锚点仅调节形态学操作结果的偏移量。

实践