Преобразование одноканального изображения в 3-канальное изображение С++/OpenCV

Im, использующий openCV С++

Мне нужно преобразовать изображение одного канала в 3-канальное изображение. Поэтому я могу использовать это: cvCvtColor(result,gray,CV_BGR2GRAY);

Я не могу этого сделать, потому что результат img - это одноканальное изображение. Любые идеи?

Ответ 1

Вы должны использовать CV_GRAY2BGR вместо CV_BGR2GRAY.

Ответ 2

Попробуйте следующее:

CvSize dim = cvSize(int width, int height);
IplImage* dst = cvCreateImage( dim, 8, 3 );
IplImage* gray = cvCreateImage(dim, 8, 1);
// Load the gray scale image
cvMerge(gray , NULL, NULL, NULL, dst);
cvShowImage("gray",gray);
cvShowImage("dst",dst);
cvWaitKey(0);

Оба типа dst и gray должны иметь одинаковые типы данных. Вы не можете просто слить float в матрицу uint. Для этого вам нужно будет использовать cvScale.

Ответ 3

Я проверил cvtColor в справочнике OpenCV и нашел это:

С++: void cvtColor (InputArray src, OutputArray dst, int code, int dstCn= 0)

dstCn - количество каналов в целевом изображении. Если параметр равен 0, количество каналов выводится автоматически из src и кода.

Я использовал

cvtColor(src,gray,CV_BGR2GRAY,1);

чтобы преобразовать 3-канальный Mat в 1-канал, и он сработал. Поэтому изменение dstCn до 3 может работать для вас:)

Ответ 4

Попробуйте слить серый, серый, серый в BGR.

Ответ 5

ИМХО: Если вход серый, тогда выход будет серым. Лучшее, что вы можете получить, - это цветное распределенное изображение на основе данных пикселя, например (110, 110, 110) для пиксельных данных 110, а не истинное цветное изображение