Opencv 图像形态学 Image Morphology
图像形态学包含诸多操作,不过都是基于两个基础操作——膨胀(Dilation)和腐蚀(Erosion)。
膨胀和腐蚀
膨胀就是使用一个核在给定的图像做卷积,而指定的像素值将被替换为核所覆盖的图像像素的最大值。膨胀的作用就是填充图像中的空隙,扩大图像中的明亮区域。
而腐蚀就是相反的操作,用局部最小值来替代指定的像素值。同理,腐蚀的作用就是扩大图像中的空隙,缩小图像中的明亮区域。
void cv::erode(
cv::InputArray src, // Input image
cv::OutputArray dst, // Result image
cv::InputArray element, // Structuring, a cv::Mat()
cv::Point anchor = cv::Point(-1, -1), // Location of anchor point
int iterations = 1, // Number of times to apply
int borderType = cv::BORDER_CONSTANT // Border extrapolation
const cv::Scalar& borderValue = cv::morphologyDefaultBorderValue()
);
void cv::dilate(
cv::InputArray src, // Input image
cv::OutputArray dst, // Result image
cv::InputArray element, // Structuring, a cv::Mat()
cv::Point anchor = cv::Point(-1, -1), // Location of anchor point
int iterations = 1, // Number of times to apply
int borderType = cv::BORDER_CONSTANT // Border extrapolation
const cv::Scalar& borderValue = cv::morphologyDefaultBorderValue()
);
参数说明:
- src,dst:输入和输出图像,支持 in-place,即输入和输出图像允许是一个
- element:核,如果输入 Mat() 则使用默认 3 * 3 的核,其中锚点位于核的中心
- anchor:锚点,就是每次卷积更新的像素点位置
- iterations:卷积的次数
- borderType:填充边缘的方式,比如 cv::BORDER_CONSTANT,就是边缘用常数填充,而数值使用 borderValue 参数
- borderValue:只在 borderType 设置为 cv::BORDER_CONSTANT,才被使用
morphologyEx()
void cv::morphologyEx(
cv::InputArray src, // Input image
cv::OutputArray dst, // Result image
int op, // Operator (e.g. cv::MOP_OPEN)
cv::InputArray element, // Structuring element, cv::Mat()
cv::Point anchor = cv::Point(-1, -1), // Location of anchor point
int iterations = 1, // Number of times to apply
int borderType = cv::BORDER_DEFAULT // Border extrapolation
const cv::Scalar& borderValue = cv::morphologyDefaultBorderValue()
);
其相比于膨胀和腐蚀,只多了一个操作符 op 参数。其可选参数如下
Value of operation Morphological operator Requires temp image?
cv::MOP_OPEN Opening No
cv::MOP_CLOSE Closing No
cv::MOP_GRADIENT Morphological gradient Always
cv::MOP_TOPHAT Top Hat For in-place only (src = dst)
cv::MOP_BLACKHAT Black Hat For in-place only (src = dst)
- 开启:先腐蚀后膨胀,对于多次操作,其先进行多次腐蚀,再进行多次膨胀。对于非二值图像,其作用可理解为去除高于周围像素的突起
- 闭合:先膨胀后腐蚀,对于多次操作,其先进行多次膨胀,再进行多次腐蚀。对于非二值图像,其作用可理解为填补低于周围像素的突起
- 形态学梯度:膨胀结果 - 腐蚀结果。对于非二值图像,其作用可以理解为计算图像灰度变化的大小
- 礼帽(Top Hat):源图像 - 开启结果。对于非二值图像,其作用可以理解为找出图中突出的亮的区域
- 黑帽(Black Hat):闭合结果 - 源图像。对于非二值图像,其作用可以理解为找出图中突出的暗的区域
自定义卷积核 cv::getStructuringElement()
cv::Mat cv::getStructuringElement(
int shape, // Element shape, e.g., cv::MORPH_RECT
cv::Size ksize, // Size of structuring element (odd num!)
cv::Point anchor = cv::Point(-1, -1) // Location of anchor point
);
参数说明:
- shape:其可选参数如下
Value of shape Element Description
cv::MORPH_RECT Rectangular Ei, j = 1, ∀ i, j
cv::MORPH_ELLIPSE Elliptic Ellipse with axes ksize.width and ksize.height.
cv::MORPH_CROSS Cross-shaped Ei, j = 1, iff i == anchor.y or j == anchor.x