Умножение матриц Matrix с использованием изменения формы, вопрос типа Mat в OpenCV

Я пытаюсь реализовать преобразование цветов из RGB-LMS и LMS-RGB назад и использую изменение формы для матрицы умножения, следуя ответу на этот вопрос: Самый быстрый способ применить цветовую матрицу к изображению RGB, используя OpenCV 3.0?

Мой объект ori Mat взят из изображения с 3 каналами (RGB), и мне нужно умножить их на матрицу из 1 канала (лм), похоже, у меня проблема с типом матрицы. я прочел изменить форму документов и вопросы, связанные с этой проблемой, такие как Проблемы умножения матриц матриц, и я считаю, что я следовал инструкциям.

Вот мой код: [ОБНОВЛЕНО : Преобразовать в плоское изображение]

void test(const Mat &forreshape, Mat &output, Mat &pic, int rows, int cols)
{
Mat lms(3, 3, CV_32FC3);
Mat rgb(3, 3, CV_32FC3);
Mat intolms(rows, cols, CV_32F);

lms = (Mat_<float>(3, 3) << 1.4671, 0.1843, 0.0030,
3.8671, 27.1554, 3.4557,
4.1194, 45.5161 , 17.884 );
/* switch the order of the matrix according to the BGR order of color on OpenCV */Mat transpose = (3, 3, CV_32F, lms).t();  // this will do transpose from matrix lms

pic     = forreshape.reshape(1, rows*cols);
Mat flatFloatImage;
pic.convertTo(flatFloatImage, CV_32F);

rgb         = flatFloatImag*transpose;
output      = rgb.reshape(3, cols);
}

Я определяю свой объект Mat, и я преобразовал его в float с помощью convertTo

Mat ori = imread("ori.png", CV_LOAD_IMAGE_COLOR);
int rows = ori.rows;
int cols = ori.cols;

Mat forreshape;
ori.convertTo(forreshape, CV_32F);

Mat pic(rows, cols, CV_32FC3);
Mat output(rows, cols, CV_32FC3);

Ошибка:

OpenCV Error: Assertion failed (type == B.type() && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32FC2 || type == CV_64FC2)) ,

так что это проблема типа.

Я пытался изменить все типы в 32FC3 из 32FC1, но, похоже, не работает. Любое предложение ?

0

Решение

Я считаю, что вам нужно преобразовать ваши входные данные в плоское изображение, а затем умножить их

float lms [] = {1.4671, 0.1843, 0.0030,
3.8671, 27.1554, 3.4557,
4.1194, 45.5161 , 17.884};
Mat lmsMat(3, 3, CV_32F, lms );

Mat flatImage = ori.reshape(1, ori.rows * ori.cols);
Mat flatFloatImage;
flatImage.convertTo(flatFloatImage, CV_32F);
Mat mixedImage = flatFloatImage * lmsMat;
Mat output = mixedImage.reshape(3, imData.rows);

Я мог там испортить матрицу lms, но, думаю, вы наверстаете упущенное.

Также см 3D матричное умножение в opencv для смешения цветов RGB

РЕДАКТИРОВАТЬ:
Проблема с искажением заключается в том, что вы получили переполнение после преобразования с плавающей запятой в 8U. Это бы сработало:

rgb         = flatFloatImage*transpose;
rgb.convertTo(pic, CV_32S);
output      = pic.reshape(3, rows)

Выход:
введите описание изображения здесь;

Также я не уверен, но быстрый поиск в Google дает мне другую матрицу для LMS посмотреть здесь. Также обратите внимание, что opencv хранит цвета в формате B-G-R вместо RGB, поэтому изменяйте микширование в записи.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]