Доступ ко всему каналу в многоканальном массиве в opencv

Я пытаюсь получить доступ ко всему каналу в 3-канальном изображении в opencv (чтобы заменить канал целой матрицей, см. ниже). Можно ли сделать это без перебора значений отдельных пикселей?

Mat RGB(320, 480, CV_8UC3)
Mat R(320, 480, CV_8UC1)
Mat G(320, 480, CV_8UC1)
Mat B(320, 480, CV_8UC1)

// First channel of RGB = R
// second channel of RGB = G
// third channel fo RGB = B

person user3079474    schedule 02.04.2014    source источник
comment
вы хотите повысить производительность или просто сделать код более читабельным?   -  person Micka    schedule 02.04.2014
comment
Улучшить производительность...   -  person user3079474    schedule 02.04.2014
comment
так как макет памяти BGRBGRBGR для первых 3 пикселей в первой строке, вы не можете легко получить доступ/манипулировать только одним каналом, не извлекая его сначала (cv::split), и вы не можете легко установить какую-либо область памяти для этого канала без его выравнивания (cv::merge ). Поскольку не существует пошаговой копии (согласно stackoverflow.com/ questions/17090742/copying-stried-data-in-c ), я думаю, что openCV внутренне использует какой-то цикл, но это все же может быть более эффективным, чем ручной цикл, поскольку они могут использовать некоторые оптимизации.   -  person Micka    schedule 02.04.2014


Ответы (1)


Просто используйте split и объединить

Mat RGB // source mat
Mat BGR_3[3]; 
split(RGB,RGB_3);  
BGR_3[0]//do some operation Blue channel
BGR_3[1]//do some operation Green Channel
BGR_3[2]//do some operation Red channel

//later merge
Mat dst
merge(BGR_3,3,dst);  
person Haris    schedule 02.04.2014
comment
разве cv::merge не выполняет внутренний цикл по всем пикселям? - person Micka; 02.04.2014
comment
Согласно документу, слияние создает многоканальный массив из нескольких одноканальных, и, как раз наоборот, слияние (), может быть, они делают это эффективно. - person Haris; 02.04.2014
comment
но действительно ли это более эффективно, чем зацикливание вручную по всем пикселям (и объединение вручную)? - person Micka; 02.04.2014
comment
Это можно сделать эффективным способом, например, docs.opencv.org/doc/tutorials/core/how_to_scan_images/ - person Haris; 02.04.2014