那么你已经在 openCV 中弄清楚了步骤 1 和 2 了吗?如果您只是尝试使用逻辑运算符,openCV 可以让您访问原始数据,然后您可以使用逻辑运算符对其进行操作。假设您已经分成三个通道并设置了阈值
//three binary images in the format you specified above
cv::Mat g;
cv::Mat b;
cv::Mat r;
uchar* gptr = g.data();
uchar* bptr = b.data();
uchar* rptr = r.data();
//assuming the matrix data is continuous you can just iterate straight through the data
if(g.isContinuous()&&r.isContinuous()&&b.isContinuous())
{
for(int i = 0; i < g.rows*g.cols; i++)
{
rptr[i] = rptr[i]&&!bptr[i]&&!gptr[i];
}
}
r 现在包含您描述的输出。如果您不想覆盖 r,也可以将其复制到新矩阵中。
有几种方法可以遍历 cv::Mat 并访问所有数据点,C++ 提供了您可能需要的所有逻辑运算符。据我所知,openCV 不提供矩阵逻辑运算符函数,但您可以很容易地编写自己的函数,如上所示。
编辑
根据 QuentinGeissmann 的建议,您可以使用 bitwise_not 和 bitwise_and 函数完成同样的事情。我不知道它们的存在。我怀疑使用它们会更慢,因为必须迭代数据的次数,但它可以用更少的代码完成。
cv::bitwise_not(g,g);
cv::bitwise_not(b,b);
cv::bitwise_and(b,g,b);
cv::bitwise_and(r,b,r);
//r now contains r&&!b&&!g