【问题标题】:OpenCV: Invert a mask?OpenCV:反转蒙版?
【发布时间】:2011-03-16 17:28:58
【问题描述】:

有没有使用 OpenCV 反转掩码的简单方法?例如,如果我有这样的面具:

010
111
010

我想把它倒过来得到这个:

101
000
101

注意:我使用的是 OpenCV 的 Python 绑定,所以虽然可能简单地遍历掩码中的每个元素,但执行速度可能会成为一个问题。

【问题讨论】:

  • 使用bitwise Not 翻转矩阵中的所有位。
  • 我可能在做一些愚蠢和错误的事情,但我不认为比特币不是我想要的……因为那样我最终会得到255,254,255,...。可能是因为我的面具是Image
  • 这取决于掩码的位深度。通常掩码应该有 1 位的深度,这会将单个位从 0 翻转到 1,反之亦然。您可能需要先将掩码转换为 1 位深的图像。如果您有更大的位深度(例如 4),那么它会从 0001 翻转到 1110 并从 0000 翻转到 1111

标签: python opencv


【解决方案1】:

cv2.bitwise_not(mask) 在这里会有所帮助

【讨论】:

  • 这是一个很好的建议,但它不适用于具有不同 max_value 的掩码,例如,如果一个掩码是 255 和零,另一个是 1 和零,因为它是位运算符。
  • 它对我不起作用,我没有看到任何变化
【解决方案2】:

如果你有一个 8 位掩码,那么你应该使用mask = 255 - mask。 cv::Mat 减法运算符被重载以执行标量每个元素的减法。

【讨论】:

    【解决方案3】:

    对于使用 255 作为“on”值的 8 位掩码:

    mask = cv::Mat::ones(mask.size(), mask.type()) * 255 - mask;
    

    我正在使用这个而不是 Matt M 解决方案,因为我仍在为我的一个项目使用 OpenCV 2.1.0。

    【讨论】:

      【解决方案4】:

      我认为这样的事情可能会处理输入掩码可能具有各种非零值的情况:

      cv::Mat1b inputMask = ....;
      cv::Mat1b invertedMask(inputMask.rows, inputMask.cols);
      
      std::transform(
          inputMask.begin(), inputMask.end(), invertedMask.begin(),
          std::logical_not<uint8_t>()
      );
      

      【讨论】:

      • 这不是 C++ 问题
      猜你喜欢
      • 2017-07-03
      • 1970-01-01
      • 2017-07-17
      • 2018-11-26
      • 1970-01-01
      • 2013-01-02
      • 2011-06-02
      • 1970-01-01
      相关资源
      最近更新 更多