それで、あなたはすでにopenCVのステップ1と2を理解しましたか?論理演算子を使用しようとしているだけの場合、openCVを使用すると、論理演算子を使用して操作できる生データにアクセスできます。すでに3つのチャネルに分割され、しきい値処理されていると仮定します
//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