OpenCV:从所有像素中减去相同的BGR值

时间:2017-05-25 15:17:15

标签: opencv

我有一些BGR图像:

cv::Mat image;

我想从图像中的所有像素中减去矢量:

[10, 103, 196]

意味着所有像素的蓝色通道将减少10,绿色减少103,红色减少196.

有没有标准的方法可以做到这一点,还是应该在所有通道和所有像素上运行循环?

1 个答案:

答案 0 :(得分:2)

假设我们的图像中所有通道都填充零,例如它的尺寸为2x3

cv::Mat image = cv::Mat::zeros(2,3,CV_32SC3)

输出将是:

 [0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0]

然后,如果我们想要添加或减去单个变量,那么我们可以使用cv::Scalar

1-假设我们想在蓝色频道中添加3

image = image + Scalar(3,0,0);  // the result will be same as image=image+3; 

上面的代码我们的矩阵现在是:

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

2-如果您想要添加到另一个频道,您可以使用cv::Scalar的第二个或第三个参数(或者说下方),如下所示

image = image +Scalar(3,2,-3);

输出

[3, 2, -3, 3, 2, -3, 3, 2, -3;
 3, 2, -3, 3, 2, -3, 3, 2, -3]

使用cv::subtract

cv::Mat image = cv::Mat::zeros(2,3,CV_32SC3);
subtract(image,Scalar(2,3,1),image);

输出

[-2, -3, -1, -2, -3, -1, -2, -3, -1;
 -2, -3, -1, -2, -3, -1, -2, -3, -1]