OPenCV膨胀函数dilate()的使用
OPenCV版本:4.4
IDE:VS2017
功能描述
简述:使用一个指定的核元素去膨胀一个图像,图像膨胀的过程类似于一个卷积的过程,源图像矩阵A以及结构元素B,B在A矩阵上依次移动,每个位置上B所覆盖元素的最大值替换B的中心位置值(即锚点处),完成整个膨胀的过程。
注意:所谓的腐蚀与膨胀的对象是针对图像中的白色元素所说的。看成是图像中的物体话会理解反。
算法通俗理解:膨胀算法使图像扩大一圈,给图像中的对象边界添加像素,其运算过程就是用3X3的结构元素,扫描二值图像的每一个像素,用结构元素与其覆盖的二值图像做“与”运算,如果都为0,结构图像的该像素为0,否则为1。结果就是使二值图像扩大一圈。
函数使用一个指定的核元素去膨胀源图像,内核有一个可定义的 锚点,我们叫他内核中心点,膨胀操作时,获取内核覆盖区域最大像素值,并代替锚点的像素,最大值通过以下公式获取:
dst
(
x
,
y
)
=
max
(
x
′
,
y
′
)
:
element
(
x
′
,
y
′
)
≠
0
src
(
x
+
x
′
,
y
+
y
′
)
\texttt{dst} (x,y) = \max _{(x',y'): \, \texttt{element} (x',y') \ne0 } \texttt{src} (x+x',y+y')
dst(x,y)=(x′,y′):element(x′,y′)=0maxsrc(x+x′,y+y′)
函数支持就地模式,膨胀操作可以迭加使用多次,在多通道图像的情况下,每个通道独立处理。
函数原型:
CV_EXPORTS_W void dilate( InputArray src, OutputArray dst, InputArray kernel,
Point anchor = Point(-1,-1), int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue() );
参数描述
-
参数 src 输入图像;通道的数量可以是任意的,但是深度值应该是以下之一:
CV_8U, CV_16U, CV_16S, CV_32F or CV_64F. -
参数 dst 和源图像同样大小和类型的输出图像。
-
参数 kernel 膨胀核元素,如果elemenat=Mat(), 是一个3 x 3的矩形核元素,核可以使用getStructuringElement来创建。
-
参数 anchor 元素中的锚点的位置,默认是值(-1,-1),也就是说锚点在元素的中心位置。
-
参数 iterations 膨胀的迭代次数。
-
参数 borderType 像素外推方法。参见#BorderTypes, BORDER_WRAP不支持。
-
参数 borderValue 固定边缘的情况下的边缘值。
参考: erode, morphologyEx, getStructuringElement
源码示例:
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
cv::Mat image = cv::imread("D:\\OpenCVtest\\images\\juice.png");
if (image.empty())
{
std::cout << "image read failed!" << std::endl;
cv::waitKey(0);
return 0;
}
cv::Mat imageDst;
//自定义核
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(8, 8));
cv::imshow("原图", image);
cv::dilate(image, imageDst, element);
cv::imshow("膨胀", imageDst);
cv::waitKey(0);
}
运行结果:
背景(白色)膨胀,而果汁杯子的图像及水果的图像缩小了。
更多推荐
所有评论(0)