Coherence-Enhancing Shock Filters 代码及详细注释【OpenCV】

举报
ShaderJoy 发表于 2021/12/30 01:49:23 2021/12/30
【摘要】 本文代码参考自博客 原作者论文下载地址 // CoherenceFilter.cpp : 定义控制台应用程序的入口点。// #include "stdafx.h"#include <opencv2/opencv.hpp> using namespace cv; /* ===================...


本文代码参考自博客

原作者论文下载地址



  
  1. // CoherenceFilter.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include <opencv2/opencv.hpp>
  5. using namespace cv;
  6. /* ==============================================
  7. * Coherence-Enhancing Shock Filters
  8. * Author:WinCoder@qq.com
  9. * inspired by
  10. * Joachim Weickert "Coherence-Enhancing Shock Filters"
  11. * http://www.mia.uni-saarland.de/Publications/weickert-dagm03.pdf
  12. *
  13. * Paras:
  14. * @img : input image ranging value from 0 to 255.
  15. * @sigma : sobel kernel size.
  16. * @str_sigma : neighborhood size,see detail in reference[2]
  17. * @belnd : blending coefficient.default value 0.5.
  18. * @iter : number of iteration.
  19. *
  20. * Example:
  21. * Mat dst = CoherenceFilter(I,11,11,0.5,4);
  22. * imshow("shock filter",dst);
  23. */
  24. Mat CoherenceFilter(Mat img, int sigma, int str_sigma, float blend, int iter)
  25. {
  26. Mat I = img.clone();
  27. int height = I.rows;
  28. int width = I.cols;
  29. for (int i = 0; i <iter; i++)
  30. {
  31. Mat gray;
  32. cvtColor(I, gray, COLOR_BGR2GRAY);
  33. // 计算特征值和特征向量
  34. Mat eigen;
  35. cornerEigenValsAndVecs(gray, eigen, str_sigma, 3);
  36. vector<Mat> vec;
  37. split(eigen, vec);// vec[0]: λ1, vec[1]: λ2, vec[2]: x1, vec[3]: y1, vec[4]: x2, vec[5]: y2
  38. // 主特征向量 w
  39. Mat x, y;
  40. x = vec[2]; // c
  41. y = vec[3]; // s
  42. // Sobel近似求解二阶导数
  43. Mat gxx, gxy, gyy;
  44. Sobel(gray, gxx, CV_32F, 2, 0, sigma);
  45. Sobel(gray, gxy, CV_32F, 1, 1, sigma);
  46. Sobel(gray, gyy, CV_32F, 0, 2, sigma);
  47. Mat ero;
  48. Mat dil;
  49. erode(I, ero, Mat()); // 最小值附近进行腐蚀
  50. dilate(I, dil, Mat()); // 最大值附近进行膨胀
  51. Mat img1 = ero;
  52. for (int nY = 0; nY<height; nY++)
  53. {
  54. for (int nX = 0; nX<width; nX++)
  55. {
  56. // 边界检测子v(ww)
  57. if (x.at<float>(nY, nX)* x.at<float>(nY, nX)* gxx.at<float>(nY, nX)
  58. + 2 * x.at<float>(nY, nX)* y.at<float>(nY, nX)* gxy.at<float>(nY, nX)
  59. + y.at<float>(nY, nX)* y.at<float>(nY, nX)* gyy.at<float>(nY, nX)<0)
  60. {
  61. img1.at<Vec3b>(nY, nX) = dil.at<Vec3b>(nY, nX); // 最大值的影响区域 dil
  62. }
  63. // 否则是最小值的影响区域 ero
  64. }
  65. }
  66. // 和原图按比例混合
  67. I = I*(1.0 - blend) + img1*blend;
  68. }
  69. return I;
  70. }
  71. int main()
  72. {
  73. Mat img = imread("D:/Pictures/beard.jpg", 1);
  74. Mat result = CoherenceFilter(img, 11, 11, 0.5, 2);
  75. imshow("Result", result);
  76. waitKey(0);
  77. return 0;
  78. }





文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/52828214

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。