openCV 和 python:边界外的形态变换

zin*_*non 5 python opencv

我正在使用 python 和 OpenCV。我有一个(矩形或任何)内核并尝试执行一些形态转换。我的问题是图像边界怎么样?

例如,openCV 如何决定内核元素边界外的扩张?它是否忽略它们或使用其邻居的价值?

Mik*_*iki 4

正如 OpenCV 文档中关于morphologyEx的报告:

\n
\n

C++:voidmorphologyEx(InputArray src,OutputArray dst,int op,InputArray kernel,点锚= Point(-1,-1),int迭代= 1,int borderType = BORDER_CONSTANT,const Scalar&borderValue = morphologyDefaultBorderValue())

\n

Python: cv2.morphologyEx(src, op, kernel[, dst[,anchor[, iterations[, borderType[, borderValue]]]]]) \xe2\x86\x92 dst

\n
\n

您会看到该函数默认创建一个具有常量值的边框。该值取决于形态学运算的类型,并由下式定义morphologyDefaultBorderValue()

\n
//! returns "magic" border value for erosion and dilation. \n//! It is automatically transformed to Scalar::all(-DBL_MAX) for dilation.\nstatic inline Scalar morphologyDefaultBorderValue() { return Scalar::all(DBL_MAX); }\n
Run Code Online (Sandbox Code Playgroud)\n

然后将针对实际矩阵类型进行校正。因此,对于CV_8U矩阵,边界值为 0(对于dilate)或 255(对于erosion)。

\n

请注意,所有其他形态操作都是不同的dilateerode序列。

\n

FilterEngine边界长度在实际执行形态学操作的中定义为:

\n
 int borderLength = std::max(ksize.width - 1, 1);\n
Run Code Online (Sandbox Code Playgroud)\n

其中ksize是结构元素的大小。

\n

因此,默认情况下,OpenCV 使用特定值创建所需的附加边界(根据borderLength内核的正确边界)。该值保证了形态学操作在跨边界时是一致的。

\n