从3通道矩阵中减去opencv矩阵

时间:2018-02-20 08:30:19

标签: c++ opencv image-processing

我有两个矩阵:

        cv::Mat bgr(rows, cols, CV_16UC3);
        cv::Mat ir(rows, cols, CV_16UC1 );

我想从 bgr 元素的每个通道中减去 ir 。我还没有找到一个优雅的解决方案。

修改

一种可能的解决方案可能是:

    // subtract IR from BGR
    Vec3u tmp;
    for (int i = 0; i < ir.rows; i++) {
        for (int j = 0; j < ir.cols; j++) {
            tmp = bgr.at<Vec3u>(i,j);
            tmp[0] = tmp[0] - ir.at<ushort>(i,j);
            tmp[1] = tmp[1] - ir.at<ushort>(i,j);
            tmp[2] = tmp[2] - ir.at<ushort>(i,j);

            bgr.at<Vec3u>(i, j) = tmp;
        }
    }

问题在于是否有更快的解决方案。

1 个答案:

答案 0 :(得分:0)

如果我们谈论一种优雅的方式,它可能是这样的:

Mat mat = Mat::ones(2,2,CV_8UC1);
Mat mat1 = Mat::ones(2,2,CV_8UC2)*3;    
Mat mats[2];
split(mat1,mats);
mats[0]-=mat;
mats[1]-=mat;
merge(mats,2,mat1);

如果您希望代码更高效,则不应该在()使用。使用指针并检查Mats的连续性:

int rows = mat.rows;
int cols = mat.cols;

if(mat.isContinuous() && mat1.isContinuous())
{
    cols*=rows;
    rows = 1;
}
for(int j = 0;j<rows;j++) {
    auto channe2limg = mat1.ptr<Vec2b>(j);
    auto channelimg = mat.ptr<uchar>(j);
    for (int i = 0; i < cols; i++) {
        channe2limg[i][0]-=channelimg[i];
        channe2limg[i][1]-=channelimg[i];          
    }
}