本文首发于“小白学视觉”微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究!


经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》。为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通,提前在公众号上连载部分内容,请持续关注小白。

图像的膨胀与图像腐蚀是一对相反的过程,与图像腐蚀相似,图像膨胀同样需要结构元素用于控制图像膨胀的效果。结构元素可以任意指定结构的中心点,并且结构元素的尺寸和具体内容都可以根据需求自己定义。定义结构元素之后,将结构元素的中心点依次放到图像中每一个非0元素处,如果原图像中某个元素被结构元素覆盖,但是该像素的像素值不与结构元素中心点对应的像素点的像素值相同,那么将原图像中的该像素的像素值修改为结构元素中心点对应点的像素值。图像的膨胀过程示意图如图6-12所示,图6-12中左侧为待膨胀的原图像,中间为结构元素,首先将结构元素的中心与原图像中的A像素重合,将结构元素覆盖的所有像素的像素值都修改为1,将结构元素中心点依次与原图像中的每个像素重合,判断是否有需要填充的像素。原图像膨胀的结果如图6-17中右侧图像所示。

图6-17 图像膨胀结果示意图

图像膨胀可以用“⊕\oplus⊕”表示,其数学表示形式如式(6.5)所示,通过公式可以发现,其实图像A的膨胀运算就是生成能够将结构元素B全部包含的图像。
A⊕B={z∣(B)z∩A≠Φ}(6.5)A \oplus B = \left\{ {z|{{(B)}_z} \cap A \ne \Phi } \right\} \tag{6.5}A⊕B={z∣(B)z​∩A​=Φ}(6.5)

OpenCV 4提供了用于图像膨胀的dilate()函数,该函数的函数原型在代码清单6-13中给出。

代码清单6-13 dilate()图像膨胀
1.  void cv::dilate(InputArray  src,
2.                     OutputArray  dst,
3.                     InputArray  kernel,
4.                     Point  anchor = Point(-1,-1),
5.                     int  iterations = 1,
6.                     int  borderType = BORDER_CONSTANT,
7.                     const Scalar &  borderValue = morphologyDefaultBorderValue()
8.                     )
  • src:输入的待膨胀图像,图像的通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
  • dst:膨胀后的输出图像,与输入图像src具有相同的尺寸和数据类型。
  • kernel:用于膨胀操作的结构元素,可以自己定义,也可以用getStructuringElement()函数生成。
  • anchor:中心点在结构元素中的位置,默认参数为结构元素的几何中心点
  • iterations:膨胀的次数,默认值为1。
  • borderType:像素外推法选择标志,取值范围在表3-5中给出。默认参数为BORDER_DEFAULT,表示不包含边界值倒序填充。
  • borderValue:使用边界不变外推法时的边界值。

该函数根据结构元素对输入图像进行膨胀,在膨胀多通道图像时每个通道独立进行膨胀运算。函数的第一个参数为待膨胀的图像,图像通道数可以是任意的,但是图像的数据类型必须是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。函数第二个参数为膨胀后的输出图像,与输入图像具有相同的尺寸和数据类型。函数第三个和第四个参数都是与结构元素相关的参数,第三个参数为结构元素,膨胀时使用的结构元素尺寸越大效果越明显,第四个参数为结构元素的中心位置,第四个参数的默认值为Point(-1,-1),表示结构元素的几何中心处为结构元素的中心点。函数第五个参数是使用结构元素膨胀的次数,膨胀次数越多效果越明显,默认参数为1,表示只膨胀1次。函数第六个参数是图像像素外推法的选择标志,第七个参数为使用边界不变外推法时的边界值,这两个参数对图像中主要部分的膨胀操作没有影响,因此在多数情况下使用默认值即可。

需要注意的是该函数的膨胀过程只针对图像中的非0像素,因此如果图像是以0像素为背景,那么膨胀操作后会看到图像中的内容变得更粗更大;如果图像是以255像素为背景,那么膨胀操作后会看到图像中的内容变得更细更小。

为了更加了解图像膨胀的效果以及dilate()函数的使用方法,在代码清单6-14中给出了对图6-17中的原图像进行膨胀的示例程序,程序运行结果如图6-18所示。另外,程序中分别利用矩形结构元素和十字结构元素对像素值为0做背景的图像和像素值为255做背景的图像进行膨胀,结果在图6-19、图6-20给出。最后为了验证膨胀与腐蚀效果之间的关系,求取黑背景图像的腐蚀结果与白背景图像的膨胀结果进行逻辑和、逻辑异或运算,证明两个过程的相反性,结果在图6-21给出。

代码清单6-14 myDilate.cpp图像膨胀
1.  #include <opencv2\opencv.hpp>
2.  #include <iostream>
3.  #include <vector>
4.
5.  using namespace cv;
6.  using namespace std;
7.
8.  int main()
9.  {10.     //生成用于腐蚀的原图像
11.     Mat src = (Mat_<uchar>(6, 6) << 0, 0, 0, 0, 255, 0,
12.         0, 255, 255, 255, 255, 255,
13.         0, 255, 255, 255, 255, 0,
14.         0, 255, 255, 255, 255, 0,
15.         0, 255, 255, 255, 255, 0,
16.         0, 0, 0, 0, 0, 0);
17.     Mat struct1, struct2;
18.     struct1 = getStructuringElement(0, Size(3, 3));  //矩形结构元素
19.     struct2 = getStructuringElement(1, Size(3, 3));  //十字结构元素
20.
21.     Mat erodeSrc;  //存放腐蚀后的图像
22.     dilate(src, erodeSrc, struct2);
23.     namedWindow("src", WINDOW_GUI_NORMAL);
24.     namedWindow("dilateSrc", WINDOW_GUI_NORMAL);
25.     imshow("src", src);
26.     imshow("dilateSrc", erodeSrc);
27.
28.     Mat LearnCV_black = imread("LearnCV_black.png", IMREAD_ANYCOLOR);
29.     Mat LearnCV_write = imread("LearnCV_write.png", IMREAD_ANYCOLOR);
30.     if (LearnCV_black.empty()||LearnCV_write.empty())
31.     {32.         cout << "请确认图像文件名称是否正确" << endl;
33.         return -1;
34.     }
35.
36.     Mat dilate_black1, dilate_black2, dilate_write1, dilate_write2;
37.     //黑背景图像膨胀
38.     dilate(LearnCV_black, dilate_black1, struct1);
39.     dilate(LearnCV_black, dilate_black2, struct2);
40.     imshow("LearnCV_black", LearnCV_black);
41.     imshow("dilate_black1", dilate_black1);
42.     imshow("dilate_black2", dilate_black2);
43.
44.     //白背景图像膨胀
45.     dilate(LearnCV_write, dilate_write1, struct1);
46.     dilate(LearnCV_write, dilate_write2, struct2);
47.     imshow("LearnCV_write", LearnCV_write);
48.     imshow("dilate_write1", dilate_write1);
49.     imshow("dilate_write2", dilate_write2);
50.
51.     //比较膨胀和腐蚀的结果
52.     Mat erode_black1, resultXor, resultAnd;
53.     erode(LearnCV_black, erode_black1, struct1);
54.     bitwise_xor(erode_black1, dilate_write1, resultXor);
55.     bitwise_and(erode_black1, dilate_write1, resultAnd);
56.     imshow("resultXor", resultXor);
57.     imshow("resultAnd", resultAnd);
58.     waitKey(0);
59.     return 0;
60. }

图6-18 用十字结构元素膨胀示例 图6-19 myErode.cpp程序中黑背景图像膨胀结果 图6-20 myErode.cpp程序中白背景图像膨胀结果 图6-21 myErode.cpp程序中腐蚀与膨胀关系验证结果

OpenCV 4开发详解
往期推荐
【OpenCV 4开发详解】图像LUT查找表
【OpenCV 4开发详解】图像连接
【OpenCV 4开发详解】图像仿射变换
【OpenCV 4开发详解】图像透视变换
【OpenCV 4开发详解】图像极坐标变换
【OpenCV 4开发详解】图像上绘制几何图形
【OpenCV 4开发详解】图像金字塔
【OpenCV 4开发详解】窗口交互操作
【OpenCV 4开发详解】图像直方图绘制
【OpenCV 4开发详解】直方图操作
【OpenCV 4开发详解】直方图应用
【OpenCV 4开发详解】图像模板匹配
【OpenCV 4开发详解】图像卷积
【OpenCV 4开发详解】图像噪声的种类与生成
【OpenCV 4开发详解】均值滤波
【OpenCV 4开发详解】方框滤波
【OpenCV 4开发详解】高斯滤波
【OpenCV 4开发详解】可分离滤波
【OpenCV 4开发详解】中值滤波
【OpenCV 4开发详解】边缘检测原理
【OpenCV 4开发详解】Scharr算子
【OpenCV 4开发详解】Laplacian算子
【OpenCV 4开发详解】Canny算法
【OpenCV 4开发详解】图像距离变换
【OpenCV 4开发详解】图像连通域分析
【OpenCV 4开发详解】图像腐蚀
经过几个月的努力,市面上第一本OpenCV 4入门书籍《OpenCV 4开发详解》将春节后由人民邮电出版社发行。如果小伙伴觉得内容有帮助,希望到时候多多支持!
关注小白的小伙伴可以提前看到书中的内容,我们创建了学习交流群,欢迎各位小伙伴添加小白微信加入交流群,添加小白时请备注“学习OpenCV 4”。

【OpenCV 4开发详解】图像膨胀相关推荐

  1. 【OpenCV 4开发详解】分割图像——分水岭法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  2. 【OpenCV 4开发详解】图像修复

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  3. 【OpenCV 4开发详解】分割图像——Mean-Shift分割算法

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  4. 【OpenCV 4开发详解】分割图像——Grabcut图像分割

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  5. 【OpenCV 4开发详解】图像腐蚀

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  6. 【OpenCV 4开发详解】图像二值化

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  7. 【OpenCV 4开发详解】图像距离变换

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  8. 【OpenCV 4开发详解】图像连通域分析

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

  9. 【OpenCV 4开发详解】图像噪声的种类与生成

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. 计算机录入技能考试题,计算机文字录入员高级技能考试试卷
  2. C# 连接数据库 Sql Server
  3. 技术走向管理一些思考(1)-性格特质和自我管理
  4. JDBC有这一篇就够了(万字JDBC附代码详解)
  5. 5个球放入3个箱子_乌龙!3个可疑箱子出现在中国总领事馆外,警方排爆后发现是口罩……...
  6. android开发相关资料整理【2011-11-10】
  7. SpringBoot —— @ComponentScan注解
  8. 考博之前一定要明白:读博的硬道理
  9. 基于websocket的简单通信
  10. 清华大学迎来中国首位原创AI虚拟学生;百度造车:定价20万元以上;亚马逊面临 7.5 万项仲裁|极客头条...
  11. WinFormDataGridView单元格提示和相关应用 之配餐系统的开发
  12. JDK使用VolatileImage可以有效改进刷屏
  13. PAT-A1020:Tree Traversal(二叉树的重建及其中序、后序遍历)
  14. IT项目 软件研发最佳实践
  15. 易语言输入框参数和调用
  16. dinic算法 java_网络流问题(Dinic算法JAVA实现)
  17. 学完了Scratch,我要开始学Python了~~~
  18. SQI SERVER2016安装选项
  19. 编辑器更新中国移动跨平台开发组件(英文简称UDE)
  20. RuoYi若依打包发布与部署

热门文章

  1. 关于CVPR 2019投稿的一些感想
  2. 关于AI,腾讯又有大动作!开发者该如何应对?
  3. 面试定心丸:AI知识点备忘录(包括ML、DL、Python、Pandas等)
  4. 资源 | 机器学习、NLP、Python和Math最好的150余个教程(建议收藏)
  5. 牛客网:为什么不能将实数作为 HashMap 的 key?
  6. 惊呆了,Spring中竟然有12种定义bean的方法
  7. 再见了,收费的Navicat。
  8. 五分钟体验SpringBoot+Skywalking
  9. 关于 MyBatis 我总结了 10 种通用的写法
  10. 还在担心写的一手烂SQL,送你4款工具