У меня есть изображение с 3-мя каналами (img), а другое - с одним каналом (ch1).
Mat img(5,5,CV_64FC3);
Mat ch1 (5,5,CV_64FC1);
Есть ли эффективный способ (не использовать для цикла) для копирования первого канала img на ch1?
У меня есть изображение с 3-мя каналами (img), а другое - с одним каналом (ch1).
Mat img(5,5,CV_64FC3);
Mat ch1 (5,5,CV_64FC1);
Есть ли эффективный способ (не использовать для цикла) для копирования первого канала img на ch1?
Существует функция, называемая cvMixChannels. Вам нужно будет увидеть реализацию в исходном коде, но я уверен, что она хорошо оптимизирована.
Фактически, если вы просто хотите скопировать один из каналов или разделить цветное изображение в 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];
Вы можете использовать функцию split, а затем поместить нули в каналы, которые хотите игнорировать. Это приведет к отключению одного канала из трех. См. Ниже..
Например:
Mat img,chans[3];
img = imread(.....); //make sure its loaded with an image
//split the channels in order to manipulate them
split(img,channel);
//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();
Проще, если у вас есть RGB с 3-мя каналами, это cvSplit(), если я не ошибаюсь, у вас меньше настроек... (и я думаю, что он также хорошо оптимизирован).
Я бы использовал cvMixChannel() для "более сложных" задач...: p (я знаю, что я ленив).