OpenCV—形态学运算定义与实现

1.形态学运算与结构元素

形态学运算是针对二值图像依据数学形态学(Mathematical Morphology)的集合论方法发展起来的图像处理方法。数学形态学起源于岩相学对岩石结构的定量描述工作,近年来在数字图像处理和机器视觉领域中得到了广泛的应用,形成了一种独特的数字图像分析方法和理论。

结构元素可以简单的定义为像素的组合,在对应的像素上定义了原点(也称锚点)。形态学滤波器的应用过程就是利用这个结构元素探测图像中每个像素的操作过程。把某个像素设为结构元素的锚点后,结构元素和图像重叠部分的像素集合就是特定形态学运算的应用对象。结构元素原则上可以是任何形状,但通常是一个简单形状,如正方形、圆形、菱形等,且把中心点作为原点。

2.腐蚀与膨胀运算

(1)腐蚀 erode

腐蚀的定义

也就是说,由B对X腐蚀所产生的二值图像E是满足以下条件的点(x,y)的集合:如果B的原点平移到点(x,y),那么B将完全包含于X中。

另一种理解,腐蚀就是把当前像素替换成所定义的像素集中的最小像素值。由于输入的二值图像只包含黑色(0)和白色(255)像素,因此如果结构元素覆盖的图像区域中有黑色像素,则锚点所在像素(x,y)将会被替换成黑色0,否则替换成白色255。而物体的边界通常会有黑色像素,所以腐蚀相当于收缩边界。

腐蚀的作用

腐蚀是一种消除边界点,使边界向内部收缩的过程。可以用来消除小且无意义的物体。

[cpp] view plaincopy
  1. // Read input image
  2. cv::Mat image= cv::imread("binary.bmp");
  3. if (!image.data)
  4. return 0;
  5. // Display the image
  6. cv::namedWindow("Image");
  7. cv::imshow("Image",image);
  8. // Erode the image
  9. cv::Mat eroded;
  10. cv::erode(image,eroded,cv::Mat());//cv::Mat()为空矩阵,此时采用默认3*3正方形结构元素
  11. // Display the eroded image
  12. cv::namedWindow("Eroded Image");
  13. cv::imshow("Eroded Image",eroded);
  14. // Erode the image with a larger s.e.定义更大的结构元素
  15. cv::Mat element(7,7,CV_8U,cv::Scalar(1));
  16. // Display the eroded image by large s.e.
  17. cv::erode(image,eroded,element);
  18. cv::namedWindow("Eroded Image (7x7)");
  19. cv::imshow("Eroded Image (7x7)",eroded);
  20. // Erode the image 3 times.腐蚀3次
  21. cv::erode(image,eroded,cv::Mat(),cv::Point(-1,-1),3);//cv::Point(-1,-1)表示原点是矩阵的中心点
  22. // Display the eroded image
  23. cv::namedWindow("Eroded Image (3 times)");
  24. cv::imshow("Eroded Image (3 times)",eroded);
  25. cv::waitKey(0);

原始二值图像

3×3正方形结构元素腐蚀结果

7×7正方形结构元素腐蚀结果

3×3正方形结构元素腐蚀3次结果

(2)膨胀 dilate

膨胀的定义

由B对X膨胀所产生的二值图像D是满足以下条件的点(x,y)的集合:如果B的原点平移到点(x,y),那么它与X的交集非空。

另一种理解为:膨胀是腐蚀的反运算,它把当前像素(原点所在位置(x,y))替换成所定义的像素集中的最大像素值。由于输入的二值图像只包含黑色(0)和白色(255)像素,因此当结构元素覆盖的图像中有白色(物体),则该结构元素原点所在位置(x,y)的值将会被替换成白色255。

膨胀的作用

也就是说,膨胀是将与物体接触的所有背景点合并到该物体中,使边界向外部扩张的过程。可以用来填补物体中的空洞。

[cpp] view plaincopy
  1. // Dilate the image
  2. cv::Mat dilated;
  3. cv::dilate(image,dilated,cv::Mat());
  4. // Display the dialted image
  5. cv::namedWindow("Dilated Image");
  6. cv::imshow("Dilated Image",dilated);

3×3正方形结构元素膨胀结果

(3)自定义结构元素

除了使用常规的规则结构元素,我们也可以自定义结构元素。下面使用Mat类型的构造函数创建一个3×3十字型的结构元素。

[cpp] view plaincopy
  1. // 创建自定义结构元素
  2. unsigned char m[9] = {
  3. 0,1,0,
  4. 1,1,1,
  5. 0,1,0
  6. };
  7. cv::Mat element1(3,3,CV_8U,m); //创建自定义矩阵element1
  8. //显示该结构元素
  9. int nr = element1.rows;
  10. int nl = element1.cols;
  11. for(int j = 0;j<nr;j++)
  12. {
  13. char *data = element1.ptr<char>(j);
  14. for(int i = 0; i<nl; i++)
  15. {
  16. int value = data[i];
  17. cout<<value<<" ";
  18. }
  19. cout<<endl;
  20. }
  21. // Display the eroded image by large s.e.
  22. cv::erode(image,eroded,element1);
  23. cv::namedWindow("Eroded Image (user define)");
  24. cv::imshow("Eroded Image (user define)",eroded);

自定义结构元素腐蚀结果

使用Mat_模板类自定义5×5大小十字形、菱形、方形、x形结构元素:

[cpp] view plaincopy
  1. cv::Mat_<uchar> cross(5,5);
  2. cv::Mat_<uchar> diamond(5,5);
  3. cv::Mat_<uchar> x(5,5);
  4. cv::Mat_<uchar> square(5,5);
  5. // Creating the cross-shaped structuring element
  6. cross <<
  7. 0, 0, 1, 0, 0,
  8. 0, 0, 1, 0, 0,
  9. 1, 1, 1, 1, 1,
  10. 0, 0, 1, 0, 0,
  11. 0, 0, 1, 0, 0;
  12. // Creating the diamond-shaped structuring element
  13. diamond <<
  14. 0, 0, 1, 0, 0,
  15. 0, 1, 1, 1, 0,
  16. 1, 1, 1, 1, 1,
  17. 0, 1, 1, 1, 0,
  18. 0, 0, 1, 0, 0;
  19. // Creating the x-shaped structuring element
  20. x <<
  21. 1, 0, 0, 0, 1,
  22. 0, 1, 0, 1, 0,
  23. 0, 0, 1, 0, 0,
  24. 0, 1, 0, 1, 0,
  25. 1, 0, 0, 0, 1;
  26. // Creating the square-shaped structuring element
  27. square <<
  28. 1, 1, 1, 1, 1,
  29. 1, 1, 1, 1, 1,
  30. 1, 1, 1, 1, 1,
  31. 1, 1, 1, 1, 1,
  32. 1, 1, 1, 1, 1;
  33. <span style="white-space:pre">    </span> //display x-shaped structuring element
  34. cout<<endl<<"x-shaped structuring element"<<endl<<endl;
  35. int xnr = x.rows;
  36. int xnl = x.cols;
  37. for(int j = 0;j<nr;j++)
  38. {
  39. char *data = x.ptr<char>(j);
  40. for(int i = 0; i<nl; i++)
  41. {
  42. int value = data[i];
  43. cout<<value<<" ";
  44. }
  45. cout<<endl;
  46. }

3.开闭运算

(1)闭运算

闭运算定义  先膨胀后腐蚀

闭运算作用

闭运算用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。基本上所有小到不能完整容纳结构元素的空隙或间隙,都会被闭运算消除(即连起来)。

[cpp] view plaincopy
  1. cv::Mat element5(5,5,CV_8U,cv::Scalar(1));//5*5正方形,8位uchar型,全1结构元素
  2. cv::Mat closed;
  3. cv::morphologyEx(image, closed,cv::MORPH_CLOSE,element5);//高级形态学运算函数
  4. // Display the opened image
  5. cv::namedWindow("Closed Image");
  6. cv::imshow("Closed Image",closed);
  7. cv::waitKey(0);

5×5正方形结构元素闭运算结果

(2)开运算

开运算定义  先腐蚀后膨胀

开运算作用

用来背景中的消除小物体、在纤细点处分离物体、平滑较大物体的边界的同时并不明显改变其面积。所有小到不能容纳结构元素的物体都会被移除。

[cpp] view plaincopy
  1. cv::Mat element5(5,5,CV_8U,cv::Scalar(1));//5*5正方形,8位uchar型,全1结构元素
  2. cv::Mat opened;
  3. cv::morphologyEx(image, opened,cv::MORPH_OPEN,element5);
  4. // Display the opened image
  5. cv::namedWindow("Opened Image");
  6. cv::imshow("Opened Image",opened);
  7. cv::waitKey(0);

5×5正方形结构元素开运算结果

形态学还有很多其他运算,例如top-hat等,等空了再补充。
转载请注明:iracer的CSDN博客 http://blog.csdn.net/iracer/article/details/49057145

OpenCV—形态学运算定义与实现相关推荐

  1. OpenCV形态学运算

    1.OpenCV形态学运算morphologyEx(开运算 .闭运算 .形态学梯度 .顶帽运算 .黑帽运算 .腐蚀运算 .膨胀运算 .击中击不中运算) void cv::morphologyEx (I ...

  2. opencv形态学运算:腐蚀(erode)和膨胀(dilate)

    形态学操作就是基于形状的一系列图像处理操作.OpenCV为进行图像的形态学变换提供了快捷.方便的函数.最基本的形态学操作有二种,他们是:膨胀与腐蚀(Dilation与Erosion). 膨胀与腐蚀能实 ...

  3. 【OpenCV学习笔记 008】基于形态学运算的图像变换

    一.形态学滤波对图像进行腐蚀.膨胀运算 1.概念及原理 (1)腐蚀和膨胀是形态学中最基本的运算,而结构元素又是数学形态学中最基本的工具.结构元素可以简单理解为像素的结构以及一个原点.使用形态学滤波就是 ...

  4. Python+Opencv简易车牌识别(二):形态学运算,HSV颜色空间筛选与图像分割

    注:这是依然一个简单的车牌识别demo 1.前言 在上一篇Python+Opencv简易车牌识别(一):基于HSV颜色空间的图像分割中,我们讲了如何仅基于颜色来进行简单粗暴的车牌分割.今天我们考虑对图 ...

  5. OpenCV 形态学操作之腐蚀与膨胀,开运算与闭运算,顶帽与黑帽,图像梯度运算相关知识点回顾

    Python OpenCV 365 天学习计划,与橡皮擦一起进入图像领域吧.本篇博客是这个系列的第 45 篇. 该系列文章导航参考:https://blog.csdn.net/hihell/categ ...

  6. OpenCV形态学操作

    OpenCV形态学操作 本文转载自:http://blog.csdn.net/byxdaz/article/details/5775717 一.图像腐蚀 膨胀 细化的基本原理   1.图像细化的基本原 ...

  7. Python——OpenCV形态学处理(膨胀与腐蚀)

    定义结构元素 形态学处理的核心就是定义结构元素,在OpenCV-Python中,可以使用其自带的getStructuringElement函数,也可以直接使用NumPy的ndarray来定义一个结构元 ...

  8. 15、OpenCV形态学操作——Hit-or-Miss

    OpenCV形态学操作--Hit-or-Miss 一.学习目标 二.Hit-or-Miss 一.学习目标 理解什么是Hit-or-Miss 学会在OpenCV中使用Hit-or-Miss 二.Hit- ...

  9. 基于形态学运算的图像变换

    一.形态学滤波对图像进行腐蚀.膨胀运算 1.概念及原理 (1)腐蚀和膨胀是形态学中最基本的运算,而结构元素又是数学形态学中最基本的工具.结构元素可以简单理解为像素的结构以及一个原点.使用形态学滤波就是 ...

最新文章

  1. 警惕!勒索病毒DXXD 2.0版来袭,黑客称只能缴纳赎金无法破解
  2. pdo 连接数据库 报错 could not find driver 解决方法
  3. Flutter入门:Hero共享元素
  4. mysql命令速查手册
  5. androidwear环境搭建以及android进入之后出现(Error:Failed to resolve: com.android.support:support-v4:26.0.0)
  6. python字符串基本操作符有哪些_Python字符串及基本操作(入门必看)!!
  7. 【转】CSS3 圆角 阴影 渐变 透明 旋转等功能详述
  8. 如何在word里插入矢量图
  9. word生成目录和给目录添加虚线和页码
  10. tornado 学习笔记7 RequestHandler功能分析
  11. 51单片机的定时器/计数器及编程
  12. 鸡啄米C++和MFC学习网址链接
  13. PMP分享|不在挣扎中蜕变,就在安逸中消亡
  14. 镭速联合Azure Blob 存储,重塑大文件传输平台存储架构
  15. 人机对话这件事为什么难?| 清华x-lab人工智能研习社
  16. 大数据在线分析处理和常用工具
  17. 怎么在oracle里执行sql语句,在Oracle中执行动态SQL的几种方法
  18. Python 建立虚拟环境
  19. IOS 定位当前位置
  20. gradle第三方Jar包依赖统一管理

热门文章

  1. boost::mutex相关的测试程序
  2. boost::detail::lightweight_mutex相关的测试程序
  3. boost::math::policies用法的测试程序
  4. boost::hana::group用法的测试程序
  5. Boost:双图bimap的范围标准方式的测试程序
  6. ITK:通过镜像填充图像
  7. VTK:可视化之ChooseTextColor
  8. VTK:Utilities之PCAStatistics
  9. VTK:图片之ImageIdealHighPass
  10. VTK:图表之CreateTree