2016-04-18 11 views
0

Добрый день!OpenCV Recolorization

Я не могу найти правильные условия для того, что я хочу сделать в OpenCV. Вот ситуация:

У меня есть изображение и цвет в градациях серого (BGR).

Я хочу «применить» цвет к полутоновому изображению, но сохраняя яркость и сохраняя его впоследствии.

Мой первоначальный мыслительный процесс был:

  1. Преобразование BGR цвет Luv
  2. Заменить L из полутонового изображения
  3. Преобразование конечного изображения в 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); 

Я перебираю все y и x моего изображения в оттенках серого. Фактический цвет приходит в другом месте, но гарантированно BGR.

Мои вопросы: (1) Каков правильный термин для этого процесса? (2) где я иду не так?

+0

Как это работает/не работает? '(2)' спрашивает, где я ошибаюсь ", однако вы не можете указать, какие ошибки вы получаете. –

+0

не ошибки, а не весь цветной спектр правильно размещен. В моем конкретном случае я окрашиваю полутоновое изображение с использованием трех цветов. Критерии раскраски берутся из поля вероятностной меры, которое я уже вычислил. В зависимости от цветового пространства только 2 из 3 цветов правильно размещены, иногда детали теряются. Я не уверен, что –

ответ

0

Я полагаю, вы могли бы ссылаться на этот процесс как на обмен каналами или на замену канала? Вам не нужно явно перебирать пиксели в ваших изображениях.

Возможно, было бы проще разделить() ваше изображение LUV на вектор матов.

vector<Mat> channels; 
cv::split(LUVMAT,channels); 

Это дает вам 3, одноканальные маты L, U и V в вашем векторе.

Затем замените 'L' Mat в векторе полутоновой (одноканальной) матрицей, используя стандартные векторные операции. Наконец, объедините результат обратно в 3-канальный Mat.

Mat newLuma; 
cv::merge(temp,newLuma); 

Затем конвертировать "newLuma" обратно в BGR.

+0

Я постараюсь, что это кажется очень логичным. Причина, по которой я делаю это на пиксель, - это то, что я выбираю на основе поля вероятности (рассчитанного в предыдущем запуске). –

+0

он работает! благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^