我有一些BGR图像:
cv::Mat image;
我想从图像中的所有像素中减去矢量:
[10, 103, 196]
意味着所有像素的蓝色通道将减少10,绿色减少103,红色减少196.
有没有标准的方法可以做到这一点,还是应该在所有通道和所有像素上运行循环?
答案 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]