我正在使用 python 和 OpenCV。我有一个(矩形或任何)内核并尝试执行一些形态转换。我的问题是图像边界怎么样?
例如,openCV 如何决定内核元素边界外的扩张?它是否忽略它们或使用其邻居的价值?
正如 OpenCV 文档中关于morphologyEx的报告:
\n\n\nC++:voidmorphologyEx(InputArray src,OutputArray dst,int op,InputArray kernel,点锚= Point(-1,-1),int迭代= 1,int borderType = BORDER_CONSTANT,const Scalar&borderValue = morphologyDefaultBorderValue())
\nPython: cv2.morphologyEx(src, op, kernel[, dst[,anchor[, iterations[, borderType[, borderValue]]]]]) \xe2\x86\x92 dst
\n
您会看到该函数默认创建一个具有常量值的边框。该值取决于形态学运算的类型,并由下式定义morphologyDefaultBorderValue():
//! 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); }\nRun Code Online (Sandbox Code Playgroud)\n然后将针对实际矩阵类型进行校正。因此,对于CV_8U矩阵,边界值为 0(对于dilate)或 255(对于erosion)。
请注意,所有其他形态操作都是不同的dilate和erode序列。
\nFilterEngine边界长度在实际执行形态学操作的中定义为:
int borderLength = std::max(ksize.width - 1, 1);\nRun Code Online (Sandbox Code Playgroud)\n其中ksize是结构元素的大小。
因此,默认情况下,OpenCV 使用特定值创建所需的附加边界(根据borderLength内核的正确边界)。该值保证了形态学操作在跨边界时是一致的。