Я пытаюсь преобразовать пиксель (4 канала) в значение в градациях серого.
Изображение выглядит как цветная карта струи:
и я пытаюсь преобразовать это в это:
Когда я его преобразую, я хочу установить прозрачность на оригинал по значению в градациях серого. Мое преобразование выглядит так:
uchar v = (inMat.at<cv::Vec4b>(i,j)[0]*0.07f) +
(inMat.at<cv::Vec4b>(i,j)[1]*0.72f) +
(inMat.at<cv::Vec4b>(i,j)[2]*0.21f);
Я думал эти ценности (0,07;0,72;0,21
) преобразует их, но преобразовывает пиксель во что-то похожее на это:
Какие значения я должен использовать, чтобы преобразовать это правильно?
Цветовая карта Jet, как и многие другие цветовые карты, отобразит значение оттенков серого на цвет, однако они не обязательно связаны с тем, что вы можете преобразовать его в оттенки серого и получить начальное значение.
Если вы хотите перевести отображение из карты цветов Jet в шкалу серого, вы можете сделать следующее:
cv::Mat a(255, 1, CV_8U), b;
for (int i = 0; i < 255; ++i)
{
a.at<uchar>(i) = i;
}
cv::applyColorMap(a,b,cv::COLORMAP_JET);
Теперь у вас есть соответствие между картой цветов Jet и значением оттенков серого … Вам просто нужно найти цвет в b
и позиция говорит вам эквивалент в a
, Не уверен, что это самый быстрый способ найти цвет, но, возможно, будет неплохо сопоставление, например, от цвета в шестнадцатеричном виде до значения в оттенках серого.
По сути, ваша картинка представляет собой скат оттенка от 0 до> 240 градусов (не полный круг, поскольку в нем нет фиолетового). Так что вам нужно найти формулу rgb -> hue. Например, попробуйте ответы этот вопрос из.
После того, как вы нашли значение оттенка, яркость составляет оттенок / 240,0;
И, возможно, вам нужно применить гамма-коррекцию к полученному изображению.
Я не знаю, открытое резюме, но для градаций серого вы просто средний R, G, B
Average = (R + G + B) / 3
R = Average
G = Average
B = Average