我遇到矩阵逻辑运算问题。我想将bitwise_and
与图像A和图像B一起使用以获得结果图像C.
图像数据类型都是Mat
,图像A在某些功能之后被处理,它是具有3个通道的二进制图像。经过一些处理后,图像B也是一个二进制图像,但只有1个通道。
由于频道号不同,我在bitwise_and
时会收到错误。
如何合并频道或其他任何方法来解决此问题?
这里显示图像A,B,C:
答案 0 :(得分:3)
您需要A
和B
具有相同的尺寸,类型和频道数。您可以使用cvtColor
从3转换为1个频道,反之亦然。这取决于C
所需的类型:
Mat A; // CV_8UC3
Mat B; // CV_8UC1
如果您希望C
成为3个频道:
cvtColor(B, B, COLOR_GRAY2BGR);
Mat C;
bitwise_and(A,B,C); // C will be 3 channel, CV_8UC3
否则,如果您希望C
成为1个频道:
cvtColor(A, A, COLOR_BGR2GRAY);
Mat C;
bitwise_and(A,B,C); // C will be 1 channel, CV_8UC1
此外,如果您不需要使用面具,您只需执行以下操作:
Mat C = A & B;
答案 1 :(得分:1)
我喜欢 Java 中的以下内容。
阈值通道1。 webcam_image频道3.
OPENCV 3.0
// convert 3 channel
Imgproc.cvtColor(thresholded, thresholded, Imgproc.COLOR_GRAY2BGR);
Core.bitwise_and(thresholded, webcam_image, webcam_image);
也许它会帮助你。
答案 2 :(得分:1)
您可以拆分三个通道矩阵并按位"和操作"分别在每个频道上:
vector<Mat> channels(3);
// split img:
split(imageA, channels);
bitwise_and(channels[0], imageB, channels[0]);
bitwise_and(channels[1], imageB, channels[1]);
bitwise_and(channels[2], imageB, channels[2]);
然后合并通道以获得3通道Mat对象:
merge(channels, imageC);