当前位置:   article > 正文

【opencv】教程代码 —ImgProc (10)图像平滑处理

【opencv】教程代码 —ImgProc (10)图像平滑处理

a4ec63e9731543de76d1bd94e104eca3.png

10. Smoothing.cpp 图像平滑处理

f82f595b0e9f646fa0b38d2cc1ad3e22.png

演示不同滤波器的效果。这些滤波器包括均值滤波、高斯滤波、中值滤波和双边滤波。每个滤波器都会在原始图像上应用,并显示滤波后的效果。

  1. /**
  2. * 文件 Smoothing.cpp
  3. * 简单滤镜的样例代码
  4. * 作者 OpenCV团队
  5. */
  6. //引入所需库文件
  7. #include <iostream>
  8. #include "opencv2/imgproc.hpp"
  9. #include "opencv2/imgcodecs.hpp"
  10. #include "opencv2/highgui.hpp"
  11. using namespace std;
  12. using namespace cv;
  13. //定义一些全局变量
  14. int DELAY_CAPTION = 1500; //延迟时间
  15. int DELAY_BLUR = 100; //模糊延迟时间
  16. int MAX_KERNEL_LENGTH = 31; //最大滤镜核心大小
  17. Mat src; Mat dst; // 定义两个Mat变量,src存储原始图像,dst用于存储处理后的图像
  18. char window_name[] = "Smoothing Demo"; //程序窗口的名字
  19. //函数声明
  20. int display_caption( const char* caption ); //显示文字
  21. int display_dst( int delay ); //显示图片
  22. /**
  23. * 主函数
  24. */
  25. int main( int argc, char ** argv )
  26. {
  27. //创建一个窗口
  28. namedWindow( window_name, WINDOW_AUTOSIZE );
  29. //载入原始图像
  30. const char* filename = argc >=2 ? argv[1] : "lena.jpg"; //如果用户没有输入,则默认打开lena.jpg
  31. src = imread( samples::findFile( filename ), IMREAD_COLOR ); //使用imread函数读取图像文件
  32. if (src.empty())
  33. {
  34. printf(" Error opening imagen\n"); //如果图像为空,则打印错误信息
  35. printf(" Usage:\n %s [image_name-- default lena.jpg] n", argv[0]); //显示使用说明
  36. return EXIT_FAILURE; //结束程序
  37. }
  38. //显示原始图像
  39. if( display_caption( "Original Image" ) != 0 )
  40. {
  41. return 0; //如果失败,结束程序
  42. }
  43. dst = src.clone(); //克隆src到dst
  44. if( display_dst( DELAY_CAPTION ) != 0 )
  45. {
  46. return 0; //如果失败,结束程序
  47. }
  48. //应用均值模糊
  49. if( display_caption( "Homogeneous Blur" ) != 0 )
  50. {
  51. return 0; //显示标题失败,结束程序
  52. }
  53. for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
  54. {
  55. //应用模糊滤镜
  56. blur( src, dst, Size( i, i ), Point(-1,-1) );
  57. if( display_dst( DELAY_BLUR ) != 0 )
  58. {
  59. return 0; //显示图像失败,结束程序
  60. }
  61. }
  62. //应用高斯模糊
  63. if( display_caption( "Gaussian Blur" ) != 0 )
  64. {
  65. return 0; //显示标题失败,结束程序
  66. }
  67. //应用高斯模糊滤镜
  68. for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
  69. {
  70. GaussianBlur( src, dst, Size( i, i ), 0, 0 );
  71. if( display_dst( DELAY_BLUR ) != 0 )
  72. {
  73. return 0; //显示图像失败,结束程序
  74. }
  75. }
  76. //应用中值模糊
  77. if( display_caption( "Median Blur" ) != 0 )
  78. {
  79. return 0; //显示标题失败,结束程序
  80. }
  81. //应用中值模糊滤镜
  82. for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
  83. {
  84. medianBlur ( src, dst, i );
  85. if( display_dst( DELAY_BLUR ) != 0 )
  86. {
  87. return 0; //显示图像失败,结束程序
  88. }
  89. }
  90. //应用双边滤波
  91. if( display_caption( "Bilateral Blur" ) != 0 )
  92. {
  93. return 0; //显示标题失败,结束程序
  94. }
  95. //应用双边滤波器
  96. for ( int i = 1; i < MAX_KERNEL_LENGTH; i = i + 2 )
  97. {
  98. bilateralFilter ( src, dst, i, i*2, i/2 );
  99. if( display_dst( DELAY_BLUR ) != 0 )
  100. {
  101. return 0; //显示图像失败,结束程序
  102. }
  103. }
  104. //完成
  105. display_caption( "Done!" );
  106. return 0;
  107. }
  108. /**
  109. * @function display_caption 显示标题函数
  110. */
  111. int display_caption( const char* caption )
  112. {
  113. dst = Mat::zeros( src.size(), src.type() ); //暂时将dst置为src相同大小的全零矩阵
  114. putText( dst, caption,
  115. Point( src.cols/4, src.rows/2),
  116. FONT_HERSHEY_COMPLEX, 1, Scalar(255, 255, 255) ); //将标题文字写入dst图片中
  117. return display_dst(DELAY_CAPTION); //显示dst图片
  118. }
  119. /**
  120. * @function display_dst 显示dst图片函数
  121. */
  122. int display_dst( int delay )
  123. {
  124. imshow( window_name, dst ); //显示窗口中的dst图片
  125. int c = waitKey ( delay ); //等待按键事件
  126. if( c >= 0 ) { return -1; } //如果有按键输入,则返回-1
  127. return 0; //否则返回0
  128. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/333983
推荐阅读
相关标签
  

闽ICP备14008679号