我正在使用python和OpenCV。 我有一个(矩形或任何东西)内核并尝试执行一些形态转换。我的问题是图像边界是什么?
例如,openCV如何决定扩展边界内的内核元素?它会忽略它们还是使用邻居的价值?
答案 0 :(得分:2)
正如morphologyEx的OpenCV文档所报告的那样:
C ++:void morphologyEx(InputArray src,OutputArray dst,int op,InputArray kernel,Point anchor = Point(-1,-1),int iterations = 1,int borderType = BORDER_CONSTANT,const Scalar& borderValue = morphologyDefaultBorderValue() )
Python:cv2.morphologyEx(src,op,kernel [,dst [,anchor [,iterations [,borderType [,borderValue]]]]]])→dst
您会看到默认情况下该功能会创建一个具有常量值的边框。此值取决于形态学操作的类型,由morphologyDefaultBorderValue()
:
//! returns "magic" border value for erosion and dilation.
//! It is automatically transformed to Scalar::all(-DBL_MAX) for dilation.
static inline Scalar morphologyDefaultBorderValue() { return Scalar::all(DBL_MAX); }
然后将针对实际矩阵类型进行校正。因此,对于CV_8U
矩阵,边界值为0(对于 dilate )或255(对于侵蚀)。
请注意,所有其他形态操作都是 dilate 和 erode 的不同序列。
边界长度在实际执行形态学操作的FilterEngine
中定义为:
int borderLength = std::max(ksize.width - 1, 1);
其中ksize
是结构元素的大小。
因此,默认情况下,OpenCV会创建所需的附加边界(根据内核的正确borderLength
),具有特定值。该值保证了形态学操作在边界上是一致的。