在OpenCV C ++中掩盖颜色图像

时间:2015-05-06 01:28:47

标签: c++ opencv

我有黑/白图像和相同尺寸的彩色图像。我想把它们组合起来得到一张黑色和白色图像是黑色的图像,黑色和白色图像为白色的彩色图像颜色相同。

这是C ++中的代码:

#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){
    Mat img1 = imread("frame1.jpg"); //coloured image
    Mat img2 = imread("framePr.jpg", 0); //grayscale image

    imshow("Oreginal", img1);

    //preform AND
    Mat r;
    bitwise_and(img1, img2, r);

    imshow("Result", r);

    waitKey(0);
    return 0;

}

这是错误消息:

OpenCV Error: Sizes of input arguments do not match (The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array') in binary_op, file /home/voja/src/opencv-2.4.10/modules/core/src/arithm.cpp, line 1021
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/voja/src/opencv-2.4.10/modules/core/src/arithm.cpp:1021: error: (-209) The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array' in function binary_op

Aborted (core dumped)

2 个答案:

答案 0 :(得分:2)

首先,黑/白(二进制)图像与灰度图像不同。两者都是CV_8U类型的Mat's。但灰度图像中的每个像素可以取0到255之间的任何值。二进制图像预计只有两个值 - 零和非零数字。

其次,bitwise_and无法应用于不同类型的Mat's。灰度图像是CV_8U类型的单通道图像(每像素8位),彩色图像是CV_BGRA类型的3通道图像(每像素32位)。

看起来你要做的事情可以用面具来完成。

//threshold grayscale to binary image 
cv::threshold(img2 , img2 , 100, 255, cv::THRESH_BINARY);
//copy the color image with binary image as mask
img1.copyTo(r, img2);

答案 1 :(得分:1)

实际上,在copyTo中使用img1作为掩码非常简单:

//Create a black colored image, with same size and type of the input color image
cv::Mat r = zeros(img2.size(),img2.type()); 
img1.copyTo(r, img2); //Only copies pixels which are !=0 in the mask

如Kiran所述,您会收到错误,因为bitwise_and无法对不同类型的图片进行操作。

作为noted by Kiran,初始分配和归零不是强制性的(但是初步处理对性能没有影响)。来自documentation

  

当指定操作掩码时,如果显示Mat :: create调用   上面重新分配矩阵,新分配的矩阵是   在复制数据之前用全零初始化。

所以整个操作可以通过简单的方式完成:

img1.copyTo(r, img2); //Only copies pixels which are !=0 in the mask