Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Merging channels in OpenCV

Tags:

c++

opencv

I need to create a 'red' image from a grayscale image. I am using this code:

void build_red(const cv::Mat& in, cv::Mat& out) {
    out = Mat::zeros(in.rows, in.cols, CV_8UC1);

    Mat zeros = Mat::zeros(in.rows, in.cols, CV_8UC1);
    Mat tmp;
    in.convertTo(tmp, CV_8UC1);

    vector<Mat> ch;
    ch.push_back(zeros);
    ch.push_back(zeros);
    ch.push_back(tmp);

    cout << "Using " << ch.size() << " channels" << endl;
    merge(ch, out);
} // build_red

With some explanations:

void build_red(const cv::Mat& in, cv::Mat& out) {

in is the input matrix, out the output.

out = Mat::zeros(in.rows, in.cols, CV_8UC1);

allocate some space for out (may be useless, but part of my attempts)

    Mat zeros = Mat::zeros(in.rows, in.cols, CV_8UC1);
    Mat tmp;
    in.convertTo(tmp, CV_8UC1);

Create an empty matrix with the same size and convert the input image to single-channel uchar.

    vector<Mat> ch;
    ch.push_back(zeros);
    ch.push_back(zeros);
    ch.push_back(tmp);

    cout << "Using " << ch.size() << " channels" << endl;
    merge(ch, out);

Create a vector with three channels, then merge them into 'out'.

However, when I run the code I get the following message:

     Using 3 channels

and the following exception:

OpenCV Error: Bad number of channels (Source image must have 1, 3 or 4 channels) 
in cvConvertImage, file /[...]/libs/OpenCV-2.4.0/modules/highgui/src/utils.cpp, 
line 611
terminate called after throwing an instance of 'cv::Exception'
what():  /[...]/libs/OpenCV-2.4.0/modules/highgui/src/utils.cpp:611: 
error: (-15) Source image must have 1, 3 or 4 channels in function cvConvertImage

Could you please help me? From my inexperienced point of view, the type of the images is the same and the number of channels is correct.

like image 649
Antonio Sesto Avatar asked Jan 29 '13 11:01

Antonio Sesto


People also ask

What does OpenCV merge do?

cv2. merge() is used to merge several single-channel images into a colored/multi-channel image.

How do I merge channels?

You can't merge or link separate YouTube channels or automatically transfer data from one channel to another. But you can manually re-upload your videos to a different channel that you manage. Watch time and other metrics will start over for any new uploads. Download your videos from your own channel.

How do you split and merge in Python?

Method: In Python, we can use the function split() to split a string and join() to join a string. the split() method in Python split a string into a list of strings after breaking the given string by the specified separator.

What is channels in cv2?

There are three channels in an RGB image- red, green and blue. The color space where red, green and blue channels represent images is called RGB color space. In OpenCV, BGR sequence is used instead of RGB. This means the first channel is blue, the second channel is green, and the third channel is red.


1 Answers

Why are you converting the image if you have a grayscale image present?

Just create two empty matrix of the same size for Blue and Green.

And you have defined your output matrix as 1 channel matrix. Your output matrix must contain at least 3 channels. (Blue, Green and Red). Where Blue and Green will be completely empty and you put your grayscale image as Red channel of the output image.

#include <opencv2/highgui/highgui.hpp> 
#include <stdio.h>
using namespace std;
using namespace cv;

int main()
{
    Mat img, g, fin_img;
    img = imread("Lenna.png",CV_LOAD_IMAGE_GRAYSCALE);
    vector<Mat> channels;

    g = Mat::zeros(Size(img.rows, img.cols), CV_8UC1);

    channels.push_back(g);
    channels.push_back(g);
    channels.push_back(img);

    merge(channels, fin_img);
    imshow("img", fin_img);
    waitKey(0);
    return 0;
}
like image 144
Froyo Avatar answered Sep 18 '22 09:09

Froyo