【发布时间】:2020-11-01 18:47:51
【问题描述】:
我是 C++ 新手,直到现在我还在用 Python 编程。
我有一个 cv :: Mat,我想将所有大于 100 的像素传递给 255,如果它们小于 100,我将它们传递给 0。
在 python 中是:
imgDst(imgDst > 100) = 255.
imgDst(imgDst <= 100) = 0.
谁能告诉我这个操作在 C++ 中会是什么样子?显然不用逐个像素地遍历矩阵。
【问题讨论】:
我是 C++ 新手,直到现在我还在用 Python 编程。
我有一个 cv :: Mat,我想将所有大于 100 的像素传递给 255,如果它们小于 100,我将它们传递给 0。
在 python 中是:
imgDst(imgDst > 100) = 255.
imgDst(imgDst <= 100) = 0.
谁能告诉我这个操作在 C++ 中会是什么样子?显然不用逐个像素地遍历矩阵。
【问题讨论】:
另一种选择是使用cv::Mat的成员方法:
imgDst.setTo(255, imgDst > 100);
类似
imgDst.setTo(0, imgDst <= 100)
【讨论】:
您可以使用LUT
std::vector<char> lut(256);
for (int i = 0; i < 256; ++i) {
lut[i] = i > 100 ? 255 : 0;
}
cv::LUT(imgDst, lut, imgDst);
【讨论】:
您也可以只对图像使用二元运算,其中任何满足表达式的东西都会将图像转换为 CV_8UC1,其中 255 满足操作,否则为 0。在您的情况下,二元运算是大于或等于运算:
cv::Mat imgDst;
// ...
// Do operations here...
//
imgDst = imgDst > 100;
根本不需要使用查找表。
【讨论】: