OpenCV bitwise_or只是将两个图像的像素值相加

时间:2014-03-09 21:49:24

标签: opencv image-processing

我尝试在两张bitwise_or张图片上使用CV_8UC1,但结果并非我的预期。

在我的情况下,对于 image_1 ,每个像素值都设置为2,而对于 image_2 ,每个像素值都设置为3,即{{1}的输出是一个图像,每个像素值设置为5,而我所期望的是每个像素值是2 | 3,应该是2.

有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:3)

2和3之间的按位或运算结果为3.您可以这样检查:

cout<<(2|3); // The result will be 3

另外,如果你在分别包含所有像素2和3的两个矩阵上进行bitwise_or,你应该得到一个矩阵,其所有像素都设置为3,如下例所示:

Mat m1 = Mat(3, 3, CV_8UC1, Scalar(2));
Mat m2 = Mat(3, 3, CV_8UC1, Scalar(3));
Mat r;
bitwise_or(m1, m2, r);
cout<<r;

结果:

[3, 3, 3;
3, 3, 3;
3, 3, 3]

您要添加两张图片吗?如果是这种情况,您只需使用+运算符,如下所示:

Mat m1 = Mat(3, 3, CV_8UC1, Scalar(2));
Mat m2 = Mat(3, 3, CV_8UC1, Scalar(3));
Mat r = m1+m2;
cout<<r;

结果:

[5, 5, 5;
5, 5, 5;
5, 5, 5]

在十进制系统中,等效或操作是最大操作。 (此外,和操作的等效操作是最小操作)。

如果这是你想要的,OpenCV提供了一个cv::max()函数,用于计算相同大小的两个矩阵的元素最大值。这是一个例子:

Mat a = Mat::ones(3, 3, CV_8UC1) * 2;
Mat b = Mat::ones(3, 3, CV_8UC1) * 100;
cout<<a<<endl<<b<<endl;
Mat max = cv::max(a, b);
cout<<max;

结果是:

a=[2, 2, 2;
  2, 2, 2;
  2, 2, 2]
b=[100, 100, 100;
  100, 100, 100;
  100, 100, 100]
max=[100, 100, 100;
  100, 100, 100;
  100, 100, 100]