当前位置:   article > 正文

【opencv】示例-morphology2.cpp 形态学操作:膨胀、腐蚀、开运算、闭运算

【opencv】示例-morphology2.cpp 形态学操作:膨胀、腐蚀、开运算、闭运算

45e2d13bc45bff29776375e83145cdaf.png

b1831debea4e3a664ef0258099d12d9d.png

element_shape = MORPH_ELLIPSE;

6e387d5e35257b4456731a90ae76e3d3.png

element_shape = MORPH_RECT

2220835fa2cac410ff19ddbc2cdc9636.png

element_shape = MORPH_CROSS;

7dd9c872190d6543468c63be98e972ce.gif

aedd2f977cce9519a0cb04a70395f6d2.gif

  1. // 包含必要的OpenCV头文件
  2. #include "opencv2/imgproc.hpp" // 图像处理
  3. #include "opencv2/imgcodecs.hpp" // 图像编码解码
  4. #include "opencv2/highgui.hpp" // 高层GUI
  5. #include <stdlib.h> // 标准库函数
  6. #include <stdio.h> // 标准输入输出
  7. #include <string> // 字符串操作
  8. // 使用标准的OpenCV命名空间
  9. using namespace cv;
  10. // 功能帮助信息的静态函数
  11. static void help(char** argv)
  12. {
  13. // 打印帮助信息
  14. printf("\nShow off image morphology: erosion, dialation, open and close\n"
  15. "Call:\n %s [image]\n"
  16. "This program also shows use of rect, ellipse and cross kernels\n\n", argv[0]);
  17. printf( "Hot keys: \n"
  18. "\tESC - quit the program\n"
  19. "\tr - use rectangle structuring element\n"
  20. "\te - use elliptic structuring element\n"
  21. "\tc - use cross-shaped structuring element\n"
  22. "\tSPACE - loop through all the options\n" );
  23. }
  24. // 声明原图像和结果图像的矩阵
  25. Mat src, dst;
  26. // 默认形状为矩形
  27. int element_shape = MORPH_RECT;
  28. // 进行形态学操作的最大迭代数
  29. int max_iters = 10;
  30. // 开运算和闭运算的位置参数
  31. int open_close_pos = 0;
  32. // 腐蚀和膨胀的位置参数
  33. int erode_dilate_pos = 0;
  34. // 用于开运算/闭运算的轨迹条的回调函数
  35. static void OpenClose(int, void*)
  36. {
  37. int n = open_close_pos;
  38. int an = abs(n);
  39. // 创建结构元素
  40. Mat element = getStructuringElement(element_shape, Size(an*2+1, an*2+1), Point(an, an) );
  41. if( n < 0 )
  42. // 执行开运算
  43. morphologyEx(src, dst, MORPH_OPEN, element);
  44. else
  45. // 执行闭运算
  46. morphologyEx(src, dst, MORPH_CLOSE, element);
  47. // 显示结果
  48. imshow("Open/Close",dst);
  49. }
  50. // 用于腐蚀/膨胀的轨迹条的回调函数
  51. static void ErodeDilate(int, void*)
  52. {
  53. int n = erode_dilate_pos;
  54. int an = abs(n);
  55. // 创建结构元素
  56. Mat element = getStructuringElement(element_shape, Size(an*2+1, an*2+1), Point(an, an) );
  57. if( n < 0 )
  58. // 执行腐蚀
  59. erode(src, dst, element);
  60. else
  61. // 执行膨胀
  62. dilate(src, dst, element);
  63. // 显示结果
  64. imshow("Erode/Dilate",dst);
  65. }
  66. // 主函数
  67. int main( int argc, char** argv )
  68. {
  69. // 解析命令行参数
  70. cv::CommandLineParser parser(argc, argv, "{help h||}{ @image | baboon.jpg | }");
  71. if (parser.has("help"))
  72. {
  73. // 如果有帮助命令,显示帮助
  74. help(argv);
  75. return 0;
  76. }
  77. // 获取文件名
  78. std::string filename = samples::findFile(parser.get<std::string>("@image"));
  79. // 读取图片
  80. if( (src = imread(filename,IMREAD_COLOR)).empty() )
  81. {
  82. // 图片为空则显示帮助
  83. help(argv);
  84. return -1;
  85. }
  86. // 创建窗口显示输出图像
  87. namedWindow("Open/Close",1);
  88. namedWindow("Erode/Dilate",1);
  89. // 设置轨迹条位置
  90. open_close_pos = erode_dilate_pos = max_iters;
  91. createTrackbar("iterations", "Open/Close",&open_close_pos,max_iters*2+1,OpenClose);
  92. setTrackbarMin("iterations", "Open/Close", -max_iters);
  93. setTrackbarMax("iterations", "Open/Close", max_iters);
  94. setTrackbarPos("iterations", "Open/Close", 0);
  95. createTrackbar("iterations", "Erode/Dilate",&erode_dilate_pos,max_iters*2+1,ErodeDilate);
  96. setTrackbarMin("iterations", "Erode/Dilate", -max_iters);
  97. setTrackbarMax("iterations", "Erode/Dilate", max_iters);
  98. setTrackbarPos("iterations", "Erode/Dilate", 0);
  99. // 主循环
  100. for(;;)
  101. {
  102. // 根据轨迹条位置执行开闭运算和腐蚀膨胀
  103. OpenClose(open_close_pos, 0);
  104. ErodeDilate(erode_dilate_pos, 0);
  105. // 按键响应
  106. char c = (char)waitKey(0);
  107. if( c == 27 ) // ESC键退出
  108. break;
  109. // 更换结构元素的形状
  110. if( c == 'e' )
  111. element_shape = MORPH_ELLIPSE;
  112. else if( c == 'r' )
  113. element_shape = MORPH_RECT;
  114. else if( c == 'c' )
  115. element_shape = MORPH_CROSS;
  116. else if( c == ' ' )
  117. element_shape = (element_shape + 1) % 3;
  118. }
  119. return 0;
  120. }
Mat element = getStructuringElement(element_shape, Size(an*2+1, an*2+1), Point(an, an) );

135c073b9acca5d1ec786d1dd496700a.png

morphologyEx(src, dst, MORPH_OPEN, element);

83da2ecaf9a4fc6290b9bcabd29c0a7a.png

morphologyEx(src, dst, MORPH_CLOSE, element);

47e390c63e9baf4d833e0a0b02661685.png

erode(src, dst, element);

fa4a6901efd4d593f24b772984c30ca0.png

dilate(src, dst, element);

7a31b73712eb64a85c4f3cae88bbf3df.png

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/422967
推荐阅读
相关标签
  

闽ICP备14008679号