当前位置:   article > 正文

【opencv】教程代码 —ImgProc (5)提取图像中水平线和垂直线的opencv示例

【opencv】教程代码 —ImgProc (5)提取图像中水平线和垂直线的opencv示例

3f83c1ffa3528761c8cd210dc501afdf.png

5. Morphology_3.cpp 提取图像中水平线和垂直线的opencv示例

7b9f2b913b52a95b1ac8da51d55e46fb.png

原图notes.png

87379c2b5c8899a65264dc544b2c6c26.png

灰度化

bf6c01b29efc1f41fa6c97b8194ac2e7.png

二值化

6867976d27f2aa3b196d2fa897515748.png

提取水平线

32f97ad9b41e9e0824c39f7f7ded14f4.png

提取垂直线

cbeced7931b09065a0d52e6d7c27abf9.png

对垂直图像取反

9dff0e3c3a256c75ae71ff85a01dcab2.png

提取边缘

f123a9a421faf48eef24faf9eae0d74a.png

使用膨胀操作处理边缘

eba58f261e8c7dce0b44f4189c3f7423.png

平滑处理:vertical.copyTo(smooth); blur(smooth, smooth, Size(2, 2)); smooth.copyTo(vertical, edges);

78d3ea1164d95381d58274b6170a5a06.png

5356dd4f7ad0fd9240e1fe7da7624971.png

4b57834bfd7d0bef9334ca67ac3d792f.png

2bd02467c868aaec25b57048430ade21.png

d43998ffe3ca3fa64142f53a7a9976bb.png

  1. /**
  2. * @file Morphology_3(Extract_Lines).cpp
  3. * @brief 使用形态变换提取图片中的水平线和垂直线的示例代码
  4. * @author OpenCV team
  5. */
  6. // 引入所需的库
  7. #include <opencv2/core.hpp> // 查找、修改和复制矩阵
  8. #include <opencv2/imgproc.hpp> // 图像处理
  9. #include <opencv2/highgui.hpp> // 高级图像展示
  10. #include <iostream> // 标准输入输出库
  11. void show_wait_destroy(const char* winname, cv::Mat img); // 创建一个函数,用于显示图像并在按键后销毁窗口
  12. // 使用标准库和OpenCV库
  13. using namespace std;
  14. using namespace cv;
  15. int main(int argc, char** argv)
  16. {
  17. //! [load_image]
  18. CommandLineParser parser(argc, argv, "{@input | notes.png | 输入图片}");
  19. // 读取输入图像
  20. Mat src = imread( samples::findFile( parser.get<String>("@input") ), IMREAD_COLOR);
  21. if (src.empty())
  22. {
  23. // 若图像无法读取或无法找到,则打印出错误信息
  24. cout << "无法打开或找到图片!\n" << endl;
  25. cout << "用法: " << argv[0] << " < 输入图片 >" << endl;
  26. return -1;
  27. }
  28. // 展示原图像
  29. imshow("src", src);
  30. //! [加载图片]
  31. //! [灰度化]
  32. // 若原图像不是灰度图,将之转为灰度图
  33. Mat gray;
  34. if (src.channels() == 3)
  35. {
  36. cvtColor(src, gray, COLOR_BGR2GRAY);
  37. }
  38. else
  39. {
  40. gray = src;
  41. }
  42. // 展示灰度图像
  43. show_wait_destroy("gray", gray);
  44. //! [灰度化]
  45. //! [二值化]
  46. // 在灰度图的反向图上应用自适应阈值化处理,注意此处需要用到~符号
  47. Mat bw;
  48. adaptiveThreshold(~gray, bw, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
  49. // 展示二值化图像
  50. show_wait_destroy("binary", bw);
  51. //! [二值化]
  52. //! [初始化]
  53. // 创建两张图片,分别用于提取水平线和垂直线
  54. Mat horizontal = bw.clone();
  55. Mat vertical = bw.clone();
  56. //! [初始化]
  57. //! [提取水平线]
  58. // 指定水平轴上的大小
  59. int horizontal_size = horizontal.cols / 30;
  60. // 创建结构元素,通过形态操作来提取水平线
  61. Mat horizontalStructure = getStructuringElement(MORPH_RECT, Size(horizontal_size, 1));
  62. // 应用形态操作
  63. erode(horizontal, horizontal, horizontalStructure, Point(-1, -1));
  64. dilate(horizontal, horizontal, horizontalStructure, Point(-1, -1));
  65. // 展示提取出的水平线
  66. show_wait_destroy("horizontal", horizontal);
  67. //! [提取水平线]
  68. //! [提取垂直线]
  69. // 指定垂直轴上的大小
  70. int vertical_size = vertical.rows / 30;
  71. // 创建结构元素,通过形态操作来提取垂直线
  72. Mat verticalStructure = getStructuringElement(MORPH_RECT, Size(1, vertical_size));
  73. // 应用形态操作
  74. erode(vertical, vertical, verticalStructure, Point(-1, -1));
  75. dilate(vertical, vertical, verticalStructure, Point(-1, -1));
  76. // 展示提取出的垂直线
  77. show_wait_destroy("vertical", vertical);
  78. //! [提取垂直线]
  79. //! [平滑处理]
  80. // 对垂直图像取反
  81. bitwise_not(vertical, vertical);
  82. show_wait_destroy("vertical_bit", vertical);
  83. // 根据逻辑提取边缘和平滑图像
  84. // 1. 提取边缘
  85. // 2. 使用膨胀操作处理边缘
  86. // 3. 将原图像复制至平滑图像
  87. // 4. 对平滑图像进行模糊处理
  88. // 5. 将平滑图像复制至源图像,覆盖边缘部分
  89. // 步骤1
  90. Mat edges;
  91. adaptiveThreshold(vertical, edges, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 3, -2);
  92. show_wait_destroy("edges", edges);
  93. // 步骤2
  94. Mat kernel = Mat::ones(2, 2, CV_8UC1);
  95. dilate(edges, edges, kernel);
  96. show_wait_destroy("dilate", edges);
  97. // 步骤3
  98. Mat smooth;
  99. vertical.copyTo(smooth);
  100. // 步骤4
  101. blur(smooth, smooth, Size(2, 2));
  102. // 步骤5
  103. smooth.copyTo(vertical, edges);
  104. // 展示最终结果
  105. show_wait_destroy("smooth - final", vertical);
  106. //! [平滑处理]
  107. return 0;
  108. }
  109. // 创建一个函数,用于显示图像并在按键后销毁窗口
  110. void show_wait_destroy(const char* winname, cv::Mat img) {
  111. imshow(winname, img);
  112. moveWindow(winname, 500, 0);
  113. waitKey(0);
  114. destroyWindow(winname);
  115. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/333967
推荐阅读
相关标签
  

闽ICP备14008679号