如何根据公差更改 cv :: Mat 值

Posted

技术标签:

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

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

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

在 python 中是:

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

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

【问题讨论】:

【参考方案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;

根本不需要使用查找表。

【讨论】:

以上是关于如何根据公差更改 cv :: Mat 值的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV 3:如何将 cv::Mat 作为可选参数传递

在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)

如何访问 CV_32F/CV_64F Mat 的像素值?

如何将OpenCV Mat的所有像素设置为特定值?

如何清除 cv::Mat 内容?

如何正确地将 cv::Mat 转换为具有完美匹配值的 torch::Tensor?