【问题标题】:OpenCV: subtract same BGR values from all pixelsOpenCV:从所有像素中减去相同的 BGR 值
【发布时间】:2018-02-20 21:31:59
【问题描述】:

我有一些 BGR 图像:

cv::Mat image;

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

[10, 103, 196]

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

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

【问题讨论】:

  • 是的,subtract 是来自 Mat 的标量,或者使用 matrix expression 来实现相同的目的。 | “我应该运行循环吗?”如果您想这样做,请仔细阅读文档-在绝大多数情况下(尤其是对于像您的情况这样微不足道的事情),这是不必要且次优的(因为 OpenCV 可能包含矢量化和并行实现)。

标签: opencv


【解决方案1】:

假设我们有一个所有通道都填充为零的图像,例如它的尺寸是 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]

【讨论】:

  • “这是个好问题”——恕我直言,这个问题是研究工作量低的一个很好的例子。我只是不明白这个“在不阅读文档的情况下使用库(如果缺少文档,则使用源代码)”的工作原理......也许我一直在努力做事:D |如果您使用正确的句子(大写、标点符号)并提供一些指向您所指的数据结构和函数的文档的链接,您的答案会好很多。
猜你喜欢
  • 1970-01-01
  • 2012-07-11
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多