【问题标题】:How to change cv :: Mat value according to tolerance如何根据公差更改 cv :: Mat 值
【发布时间】:2020-11-01 18:47:51
【问题描述】:

我是 C++ 新手,直到现在我还在用 Python 编程。

我有一个 cv :: Mat,我想将所有大于 100 的像素传递给 255,如果它们小于 100,我将它们传递给 0。

在 python 中是:

imgDst(imgDst > 100) = 255.
imgDst(imgDst <= 100) = 0.

谁能告诉我这个操作在 C++ 中会是什么样子?显然不用逐个像素地遍历矩阵。

【问题讨论】:

    标签: python c++ opencv


    【解决方案1】:

    另一种选择是使用cv::Mat的成员方法:

    imgDst.setTo(255, imgDst > 100);
    

    类似

    imgDst.setTo(0, imgDst <= 100)
    

    【讨论】:

      【解决方案2】:

      您可以使用LUT

      std::vector<char> lut(256);
      for (int i = 0; i < 256; ++i) {
          lut[i] = i > 100 ? 255 : 0;
      }
      
      cv::LUT(imgDst, lut, imgDst);
      

      【讨论】:

      • 使用 LUT 并不是执行此操作的最优雅方式。有更多的矢量化方式来完成 OP 的要求,例如在其他答案中看到的那些。
      • 同意,只是提出了一种方式。
      【解决方案3】:

      您也可以只对图像使用二元运算,其中任何满足表达式的东西都会将图像转换为 CV_8UC1,其中 255 满足操作,否则为 0。在您的情况下,二元运算是大于或等于运算:

      cv::Mat imgDst;
      // ...
      // Do operations here...
      //
      imgDst = imgDst > 100;
      

      根本不需要使用查找表。

      【讨论】:

        猜你喜欢
        • 2019-04-19
        • 1970-01-01
        • 2012-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多