如何根据公差更改 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 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)