访问OpenCV中每个单独的通道



我有一个图像有3个通道(img)和另一个有一个通道(ch1)。

    Mat img(5,5,CV_64FC3);
    Mat ch1 (5,5,CV_64FC1);

是否有有效的方法(不使用for循环)复制img的第一个通道到ch1?

事实上,如果您只想复制其中一个通道或将彩色图像拆分为3个不同的通道,CvSplit()更合适(我的意思是简单使用)。

Mat img(5,5,CV_64FC3);
Mat ch1, ch2, ch3;
// "channels" is a vector of 3 Mat arrays:
vector<Mat> channels(3);
// split img:
split(img, channels);
// get the channels (dont forget they follow BGR order in OpenCV)
ch1 = channels[0];
ch2 = channels[1];
ch3 = channels[2];

有一个叫做cvMixChannels的函数。您需要在源代码中看到实现,但我打赌它经过了很好的优化。

您可以使用split函数,然后在您想要忽略的通道上加上零。这将导致显示三个通道中的一个。见下文. .

例如:

Mat img, chans[3]; 
img = imread(.....);  //make sure its loaded with an image
//split the channels in order to manipulate them
split(img, chans);
//by default opencv put channels in BGR order , so in your situation you want to copy the first channel which is blue. Set green and red channels elements to zero.
chans[1]=Mat::zeros(img.rows, img.cols, CV_8UC1); // green channel is set to 0
chans[2]=Mat::zeros(img.rows, img.cols, CV_8UC1);// red channel is set to 0
//then merge them back
merge(chans, 3, img);
//display 
imshow("BLUE CHAN", img);
cvWaitKey();

您可以访问一个特定的通道,它比split操作更快

Mat img(5,5,CV_64FC3);
Mat ch1;
int channelIdx = 0;
extractChannel(img, ch1, channelIdx); // extract specific channel
// or extract them all
vector<Mat> channels(3);
split(img, channels);
cout << channels[0].size() << endl;

一个更简单的,如果你有一个RGB与3通道是cvSplit()如果我没有错,你有更少的配置…(我认为这也是很好的优化)。

我会使用cvMixChannel()"更难"的任务…:p(我知道我很懒)。

下面是cvSplit()的文档

相关内容

  • 没有找到相关文章

最新更新