Opencv 图像形态学 Image Morphology

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

猜你喜欢

转载自blog.csdn.net/a40850273/article/details/83006791