当前位置:   article > 正文

使用Opencv实现Halcon中的动态阈值

使用Opencv实现Halcon中的动态阈值
  • 直接调用Opencv的函数实现

  1. //
  2. //opencv4.1.0
  3. //
  4. #include <opencv2/opencv.hpp>
  5. using namespace std;
  6. using namespace cv;
  7. int main() {
  8. Mat src, srcMean, SubImage, dstImage;
  9. src = imread("1.png",0);
  10. blur(src, srcMean, Size(9, 9));
  11. subtract(src, srcMean, SubImage);
  12. //addWeighted(src,-1,srcMean,1,0,SubImage); //可以利用图像权重相加的函数实现图像相减
  13. threshold(SubImage, dstImage, 5, 255, THRESH_BINARY);
  14. imshow("动态阈值", dstImage);
  15. waitKey(0);
  16. return 0;
  17. }
  • dyn_threshold算子使用C++实现

效果图:

                                                                                                    原图      

                                                                                            Light模式结果图

代码:

  1. //
  2. //opencv4.1.0
  3. //
  4. #include <opencv2/opencv.hpp>
  5. using namespace std;
  6. using namespace cv;
  7. //实现Halcon里的动态阈值
  8. void DynThreshold(Mat& src,Mat& srcMean,Mat& reslut, int offset,int LightDark);
  9. //枚举定义动态阈值的模式
  10. enum Dyn
  11. {
  12. Light = 1,
  13. Dark,
  14. Equal,
  15. Not_equal
  16. };
  17. int main() {
  18. Mat src, srcMean;
  19. src = imread("1.png",0);
  20. //均值滤波
  21. blur(src, srcMean, Size(9, 9));
  22. //动态阈值
  23. Mat result = Mat::zeros(src.size(), CV_8UC1);
  24. DynThreshold(src, srcMean, result, 5, Light);
  25. imshow("原图", src);
  26. imshow("均值滤波", srcMean);
  27. imshow("动态阈值", result);
  28. waitKey(0);
  29. return 0;
  30. }
  31. void DynThreshold(Mat& src, Mat& srcMean, Mat& result, int offset, int LightDark) {
  32. int r = src.rows;//
  33. int c = src.cols;//
  34. int Value = 0;
  35. for (int i = 0; i < r; i++){
  36. uchar* datasrc = src.ptr<uchar>(i); //指针访问图像像素
  37. uchar* datasrcMean = srcMean.ptr<uchar>(i);
  38. uchar* dataresult = result.ptr<uchar>(i);
  39. for (int j = 0; j < c; j++){
  40. switch (LightDark)
  41. {
  42. case 1:
  43. Value = datasrc[j] - datasrcMean[j];
  44. if (Value >= offset) {
  45. dataresult[j] = 255;
  46. }
  47. break;
  48. case 2:
  49. Value = datasrcMean[j] - datasrc[j];
  50. if (Value >= offset) {
  51. dataresult[j] = 255;
  52. }
  53. break;
  54. case 3:
  55. Value = datasrc[j] - datasrcMean[j];
  56. if (Value >= -offset && Value <= offset) {
  57. dataresult[j] = 255;
  58. }
  59. break;
  60. case 4:
  61. Value = datasrc[j] - datasrcMean[j];
  62. if (Value < -offset || Value > offset) {
  63. dataresult[j] = 255;
  64. }
  65. break;
  66. default:
  67. break;
  68. }
  69. }
  70. }
  71. }

 

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

闽ICP备14008679号