OpenCV 形态学操作:膨胀与腐蚀

简介: OpenCV 形态学操作:膨胀与腐蚀

前导知识


图像形态学操作:基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学


形态学有四个基本操作:腐蚀、膨胀、开、闭


膨胀与腐蚀是图像处理中最常用的形态学操作手段


定义


膨胀


跟卷积操作类似,假设有图像A和结构元素B,结构元素B在A上面移动,其中B定义其中心为锚点,计算B覆盖下A的最大像素值用来替换锚点的像素,其中B作为结构体可以是任意形状。


这种操作会造成图像中像素值高的区域变大,而像素值小的区域变小。(亮区变粗,暗区变细)


腐蚀


腐蚀跟膨胀操作的过程类似,唯一不同的是以最小值替换锚点重叠下图像的像素值


这种操作会造成图像中像素值高的区域变小,而像素值小的区域变大。(亮区变细,暗区变粗)


API


结构元形状构造函数


函数原型:


getStructuringElement( 
  int shape, 
  Size ksize, 
  Point anchor
)


参数:


  • shape:结构元类型:


1)MORPH_RECT 表示产生矩形的结构元


2)MORPH_ELLIPSEM 表示产生椭圆形的结构元


3)MORPH_CROSS 表示产生十字交叉形的结构元


  • ksize:表示结构元的尺寸,即(宽,高),必须是奇数


  • anchor:表示结构元的锚点,即参考点。默认值Point(-1, -1)代表中心像素为锚点

膨胀


函数原型:


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:表示输入矩阵


  • element:表示结构元,即 函数getStructuringElement( )的返回值


  • anchor:结构元的锚点,即参考点


  • iterations:膨胀操作的次数,默认为一次


  • borderType:边界扩充类型


  • borderValue:边界扩充值


腐蚀


函数原型:


void erode( 
  InputArray src, 
  OutputArray dst, 
  InputArray kernel,
  Point anchor = Point(-1,-1), 
  int iterations = 1,
  int borderType = BORDER_CONSTANT,
  const Scalar& borderValue = morphologyDefaultBorderValue() 
);


参数:


  • src:表示输入矩阵


  • dst:表示输出矩阵


  • element:表示结构元,即 函数getStructuringElement( )的返回值


  • anchor:结构元的锚点,即参考点


  • iterations:腐蚀操作的次数,默认为一次


  • borderType:边界扩充类型


  • borderValue:边界扩充值


案例


案例中用到了 Trackbar 函数,可以参考我的另一篇博文学习 Trackbar:


https://blog.csdn.net/weixin_45525272/article/details/121265662


膨胀


效果展示:



代码如下:


#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>  
using namespace cv;
using namespace std;
Mat src, dst;                   // 全局变量
int element_size = 3;     // 全局变量
int max_size = 21;        // 全局变量
void CallBack_func(int, void*);
int main()
{
  src = imread("test2.jpg");
  if (src.empty())
  {
    printf("could not load the  image...\n");
    return -1;
  }
  namedWindow("原图:", CV_WINDOW_AUTOSIZE);
  imshow("原图:", src);
  namedWindow("膨胀操作后:", CV_WINDOW_AUTOSIZE);
  createTrackbar("结构元尺寸 :", "膨胀操作后:", &element_size, max_size, CallBack_func);
  CallBack_func(element_size, 0);
  waitKey(0);
  return 0;
}
// 膨胀操作 Trackbar 回调函数
void CallBack_func(int, void*)
{
  int s = element_size * 2 + 1;
  Mat structureElement = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));    // 创建结构元
  dilate(src, dst, structureElement, Point(-1, -1), 1);                   // 调用膨胀API
  imshow("膨胀操作后:", dst);
}


相关文章
|
1月前
|
计算机视觉
Opencv学习笔记(十二):图片腐蚀和膨胀操作
这篇文章介绍了图像腐蚀和膨胀的原理、作用以及使用OpenCV实现这些操作的代码示例,并深入解析了开运算和闭运算的概念及其在图像形态学处理中的应用。
109 1
Opencv学习笔记(十二):图片腐蚀和膨胀操作
|
4月前
|
存储 计算机视觉
OpenCv形态学(一)
OpenCv形态学(一)
|
5月前
|
计算机视觉
OpenCV中图像算术操作与逻辑操作
OpenCV中图像算术操作与逻辑操作
67 1
|
5月前
|
存储 Cloud Native Linux
OpenCV鼠标操作(画红色方框截取图像)
OpenCV鼠标操作(画红色方框截取图像)
|
5月前
|
计算机视觉
OpenCV图像像素逻辑操作
OpenCV图像像素逻辑操作
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
【Qt&OpenCV 图像的形态学变换 morpholgyEx】
36 0
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像阈值操作 threshold】
【Qt&OpenCV 图像阈值操作 threshold】
60 0
|
6月前
|
编解码 计算机视觉 C++
【OpenCV】—形态学滤波(1):腐蚀与膨胀
【OpenCV】—形态学滤波(1):腐蚀与膨胀
|
6月前
|
API 计算机视觉
【OpenCV】形态学滤波(2):开运算、形态学梯度、顶帽、黑帽
【OpenCV】形态学滤波(2):开运算、形态学梯度、顶帽、黑帽
|
6月前
|
计算机视觉
OpenCV(三十一):形态学操作
OpenCV(三十一):形态学操作
106 0