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

标签 opencv

我有一些 BGR 图片:

cv::Mat image;

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

[10, 103, 196]

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

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

最佳答案

假设我们有图像,所有 channel 都用零填充,例如它的尺寸是 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-假设我们想在蓝色 channel 中添加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- 如果你想添加到另一个 channel ,你可以使用 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]

关于OpenCV:从所有像素中减去相同的 BGR 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44184020/

相关文章:

python - 不循环的OpenCV中calcOpticalFlowFarneback的绘制结果

python - 将旋转的矩形绘制成图像

c++ - Create Mat from Vector<point2f>断言失败错误

python-2.7 - 使用opencv检测python中的圆形黑色 Blob

android - 从照片opencv中去除眩光

image - 如何使用 opencv python 库从内存缓冲区 (StringIO) 或 url 中读取图像

c++ - opencv C++ 中的 findHomography(par1, par2, par3) 返回什么

windows - 在 cygwin 上运行一个 gui 应用程序

opencv - 使用图像比较检测丢失的对象

python-3.x - 第一个视频文件正确保存后如何获取视频文件