OpenCV 4.10.0
开源计算机视觉
|
形态学变换是基于图像形状的一些简单操作。这种操作通常在二值图像上执行。它需要两个输入,一个是原始图像,另一个称为**结构/形态学元素**或**内核**,它决定操作的性质。两个基本的形态学操作符是腐蚀和膨胀。然后其变体形式,如开运算、闭运算和梯度等也会发挥作用。我们将借助以下图像逐个了解它们
腐蚀的基本思想就像土壤侵蚀一样,它侵蚀前景物体的边界(始终尝试将前景保持为白色)。它会做什么?当内核滑过图像(就像在二维卷积中)时,原始图像(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)。 |
边界值 | 常量边框的情况下的边框值 |
这与腐蚀正好相反。此处,当内核下至少有一个像素是时,则像素元素为“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)。 |
边界值 | 常量边框的情况下的边框值 |
开启只另一种叫法,即 腐蚀后跟膨胀。它有助于去除噪声。
我们使用函数: 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)。 |
边界值 | 在采用恒定边界的情况下且边界值为默认值时,具有特殊含义。 |
闭运算与开运算相反,它是膨胀操作后接腐蚀操作。它可用于封闭前景对象内部的小孔,或对象上较小的黑点。
形态梯度指图像的膨胀与腐蚀运算之间的差别。
结果看起来将呈现物体的轮廓。
礼帽指输入图像与该图像的开运算之间的差别。
黑帽指输入图像的闭运算与输入图像之间的差别。
在之前利用 cv.Mat.ones 创建了构建元素。构建元素具有矩形形状。但在某些情况下,你可能需要椭圆形/圆形的内核。因此,针对此类情况,OpenCV 设计了一个函数:cv.getStructuringElement()。你只需传入内核的形状和大小即可得到所需的内核。
我们使用函数:cv.getStructuringElement (shape, ksize, anchor = new cv.Point(-1, -1))
形状 | 元素形状,可以是 cv.MorphShapes 中的一种 |
ksize | 构建元素的大小。 |
anchor | 元素中的锚点位置。默认值 [−1,−1] 表示锚点位于中心。请注意,仅十字形元素的形状取决于锚点的位置。在其他情况下,锚点仅调节形态学操作结果的偏移量。 |