Хорошего дня!
Я не могу найти правильные условия для того, что я хочу сделать в OpenCV. Вот ситуация:
У меня есть изображение в градациях серого и цвет (BGR).
Я хочу «применить» цвет к изображению в градациях серого, но сохранить яркость и сохранить ее потом.
Мой оригинальный мыслительный процесс был:
Это то, что я сделал до сих пор:
cv::Mat pixelColor(1, 1, CV_8UC3, cv::Scalar(0));
pixelColor.at<cv::Vec3b>(1, 1) = cv::Vec3b(128, 255, 0); // currently hard-coded but it actually comes from another source
cv::cvtColor(pixelColor, pixelColor, CV_BGR2Luv);
pixelColor.at<cv::Vec3b>(1, 1)[0] = image.at<unsigned char>(y, x);
cv::cvtColor(pixelColor, pixelColor, CV_Luv2BGR);
Я перебираю все у и х моего изображения в градациях серого. Фактический цвет появляется в другом месте, но он гарантированно будет BGR.
Мои вопросы: (1) каков правильный термин для этого процесса? (2) где я иду не так?
Я полагаю, вы могли бы назвать этот процесс заменой канала или заменой канала? Вам не нужно явно перебирать пиксели в ваших изображениях.
Вероятно, было бы проще всего разделить () ваше LUV-изображение на вектор Mats.
vector<Mat> channels;
cv::split(LUVMAT,channels);
Это дает вам 3 одиночных канала Mats L, U и V в вашем векторе.
Затем замените ‘L’ Mat в векторе на Mat (одноканальный) в оттенках серого, используя стандартные векторные операции. Наконец, объедините результат обратно в 3-канальный мат.
Mat newLuma;
cv::merge(temp,newLuma);
Затем преобразуйте «newLuma» обратно в BGR.
Других решений пока нет …