OpenCV 图像处理 --腐蚀和膨胀

图像膨胀就是图像中的高亮部分进行膨胀,「领域扩张」,效果图拥有比原图更大的高亮区域。
图像腐蚀就是原图中的高亮部分被腐蚀,「领域被蚕食」,效果图拥有比原图更小的高亮区域。

二值化:
函数原型:
在这里插入图片描述
参数说明

  1. src:源图像,可以为8位的灰度图,也可以为32位的彩色图像。(两者由区别)
  2. dst:输出图像
  3. thresh:阈值
  4. maxval:dst图像中最大值
  5. type:阈值类型

可以具体类型如下:

OpenCV 图像处理 --腐蚀和膨胀_第1张图片
例子:

   Mat src = imread("/home/wangcf/Qtprojects/qtopencvandeasypr/hai.png");
    imshow("src",src);
    Mat gray;
    cvtColor(src, gray, CV_BGR2GRAY);
    imshow("gray",gray);
    Mat BINARY;
    threshold(gray,BINARY,25,255,CV_THRESH_BINARY);
    imshow("threshold",BINARY);

OpenCV 图像处理 --腐蚀和膨胀_第2张图片
图像腐蚀
图像腐蚀其中有两个比较关键的输入对象,一个是二值图像,另一个是卷积核

卷积核是腐蚀中的关键,卷积核的中心点逐个扫描原始图像中的每一个像素点,被扫描到的原始图像中的像素点,只有当卷积核对应的元素值均为 1 时,其值才为 1 ,否则其值修改为 0 。

下面是一个 5 * 5 的卷积核卷积的过程:
OpenCV 图像处理 --腐蚀和膨胀_第3张图片
OpenCV 为图像腐蚀提供的函数是:erode() ,它的原函数如下:
在这里插入图片描述
参数详解:

  • 第一个参数:InputArray类型的src,输入图像,Mat类的对象即可。图像的通道数可以是任意的,但是图像的深度应该是CV_8U,CV_16U,CV_16S,CV_32F,CV_64F之一。
  • 第二个参数:OutputArray类型的dst,目标图像,需要和输入图像有一样的尺寸和类型。
  • 第三个参数:InputArray类型的kernel,膨胀操作的核。当为NULL时,表示的是使用的是参考点位于中心3*3的核。
  • 第四个参数:Point类型的anchor,锚点的位置,默认值是 (-1, -1),表示位于中心。
  • 第五个参数:int类型的iterations,迭代的次数,默认值是1。
  • 第六个参数:int类型的borderType,用于推断图像外部像素的某种边界模式,默认值是BORDER_DEFAULT。
  • 第七个参数:const Scalar&类型的borderValue,一般不管它。

一般只需要传入前三个参数,后面的四个参数 有默认值。
例子:

Mat dstImage;
    Mat element = cv::getStructuringElement(MORPH_RECT,Size(3,3));
    erode(BINARY,dstImage,element);
    imshow("erode",dstImage);

效果:
OpenCV 图像处理 --腐蚀和膨胀_第4张图片
图像膨胀
图像膨胀正好和图像腐蚀相反,卷积核的中心点逐个扫描原始图像中的每一个像素点,被扫描到的原始图像中的像素点,只要有一个值为 1 时则为 1 ,否则为 0 。
图像膨胀卷积核的卷积过程如下:
OpenCV 图像处理 --腐蚀和膨胀_第5张图片
OpenCV 为图像腐蚀提供的函数是:dilate() ,它的原函数如下:
在这里插入图片描述
参数详解:

  • 第一个参数:InputArray类型的src,输入图像,Mat类的对象即可。图像的通道数可以是任意的,但是图像的深度应该是CV_8U,CV_16U,CV_16S,CV_32F,CV_64F之一。
  • 第二个参数:OutputArray类型的dst,目标图像,需要和输入图像有一样的尺寸和类型。
  • 第三个参数:InputArray类型的kernel,膨胀操作的核。当为NULL时,表示的是使用的是参考点位于中心3*3的核。

通常使用函数getStructuringElement配合这个参数使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。其中getStructuringElement函数的第一个参数表示内核的形状,一共有三种形状可以选择:

  矩形:MORPH_RECT

  交叉形:MOTPH_CROSS

  椭圆形:MOTRPH_ELLIPSE

而getStructuringElement函数的第二个参数和第三个参数分别是内核的尺寸以及锚点的位置。
一般在定义erode和dilate函数之前,先定义一个Mat类型的变量来得到getStructuringElement函数的返回值。对于锚点的位置,默认是Point
(-1, -1),表示锚点位于中心。十字形的element形状唯一依赖于锚点的位置,而其他情况,锚点只影响了形态学运算结果的偏移。

  • 第四个参数:Point类型的anchor,锚点的位置,默认值是 (-1, -1),表示位于中心。
  • 第五个参数:int类型的iterations,迭代的次数,默认值是1。
  • 第六个参数:int类型的borderType,用于推断图像外部像素的某种边界模式,默认值是BORDER_DEFAULT。
  • 第七个参数:const Scalar&类型的borderValue,一般不管它。

例子:

  Mat dstImage1;
     Mat element2 = cv::getStructuringElement(MORPH_RECT,Size(10,10));
     dilate(BINARY,dstImage1,element2);
     imshow("erode",dstImage1);

效果
OpenCV 图像处理 --腐蚀和膨胀_第6张图片
总结:
膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原图的高亮区域更大。
腐蚀类似于“领域被蚕食”,将图像中的高亮区域或白色部分进行缩减细化,其运行结果图比原图的高亮区域更小。

你可能感兴趣的