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

Som*_*ing 2 opencv

我有一些 BGR 图像:

cv::Mat image;
Run Code Online (Sandbox Code Playgroud)

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

[10, 103, 196]
Run Code Online (Sandbox Code Playgroud)

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

是否有标准方法可以做到这一点,或者我应该在所有通道和所有像素上运行 for 循环?

Sae*_*omi 6

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

cv::Mat image = cv::Mat::zeros(2,3,CV_32SC3)
Run Code Online (Sandbox Code Playgroud)

输出将是:

 [0, 0, 0, 0, 0, 0, 0, 0, 0;
  0, 0, 0, 0, 0, 0, 0, 0, 0]
Run Code Online (Sandbox Code Playgroud)

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

1-假设我们要添加3蓝色通道:

image = image + Scalar(3,0,0);  // the result will be same as image=image+3; 
Run Code Online (Sandbox Code Playgroud)

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

[3, 0, 0, 3, 0, 0, 3, 0, 0;
 3, 0, 0, 3, 0, 0, 3, 0, 0]
Run Code Online (Sandbox Code Playgroud)

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

image = image +Scalar(3,2,-3);
Run Code Online (Sandbox Code Playgroud)

输出将是

[3, 2, -3, 3, 2, -3, 3, 2, -3;
 3, 2, -3, 3, 2, -3, 3, 2, -3]
Run Code Online (Sandbox Code Playgroud)

使用cv::subtract

cv::Mat image = cv::Mat::zeros(2,3,CV_32SC3);
subtract(image,Scalar(2,3,1),image);
Run Code Online (Sandbox Code Playgroud)

输出

[-2, -3, -1, -2, -3, -1, -2, -3, -1;
 -2, -3, -1, -2, -3, -1, -2, -3, -1]
Run Code Online (Sandbox Code Playgroud)