Я хочу преобразовать данные в оттенках серого в цветное изображение с помощью С#. Я пробую 2D и конвертирую данные 1D и показываю растровое изображение, но я хочу показать цветное изображение.
С# Преобразование данных в градациях серого в цветное изображение
comment
Это интересная проблема, на которую уже есть приемлемый ответ. Пожалуйста, перефразируйте вопрос и покажите, что вы уже пробовали.
- person Larry   schedule 09.12.2013
Ответы (1)
Встроенная функция графики и рисунков из платформы .NET не поддерживает работу с изображениями в градациях серого.
Я сделал то же самое, чтобы отобразить серое изображение как тепловую карту с искусственными цветами.
В моем случае я использовал библиотеку Emgu.CV
Это пример кода, который я использовал для своего проекта:
/*
* -----------------------------------------------------------------------------------
* Step 3: Resize the gray image by using smoothing on it.
* This makes the image-data more smooth for further processing
* -----------------------------------------------------------------------------------
* */
var width = Convert.ToInt32(this.Params["Width"]);
var smoothWidth = Convert.ToInt32(width / 150F);
grayShadeMatrix = grayShadeMatrix.Resize(width, Convert.ToInt32(width * (float)ySize / (float)xSize), Emgu.CV.CvEnum.INTER.CV_INTER_LINEAR);
grayShadeMatrix = grayShadeMatrix.SmoothBlur(smoothWidth, smoothWidth);
#endregion
#region Step 4: Create HeatMap by applying gradient color
/*
* -----------------------------------------------------------------------------------
* Step 4: Create the heatmap by using the value of the every point as hue-angle for the color
* This way the color can be calculated very quickly. Also applies a log-function
* on the value, to make the lower values visible too
* -----------------------------------------------------------------------------------
* */
this.MaxHueValuePerValuePoint = MAX_HUE_VALUE / this.MaxValue;
this.MaxHueValuePreCompiled = Math.Log(MAX_HUE_VALUE, ScalaLogBase);
var grayShadeMatrixConverted = grayShadeMatrix.Convert<byte>(GetHueValue);
// Create the hsv image
var heatMapHsv = new Image<Hsv, byte>(grayShadeMatrixConverted.Width, grayShadeMatrixConverted.Height, new Hsv());
heatMapHsv = heatMapHsv.Max(255); // Set each color-channel to 255 by default (hue: 255, sat: 255, val: 255)
heatMapHsv[0] = grayShadeMatrixConverted; // Now set the hue channel to the calculated hue values
// Convert hsv image back to rgb, for correct display
var heatMap = new Image<Rgba, byte>(grayShadeMatrixConverted.Width, grayShadeMatrixConverted.Height, new Rgba());
CvInvoke.cvCvtColor(heatMapHsv.Ptr, heatMap.Ptr, Emgu.CV.CvEnum.COLOR_CONVERSION.CV_HSV2RGB);
#endregion
Функция GetHueValue:
/// <summary>
/// Calculates the hue value by applying a logarithmic function to the values
/// </summary>
/// <param name="f"></param>
/// <returns></returns>
private byte GetHueValue(ushort f)
{
f = Convert.ToUInt16(f < 1 ? 0 : f);
var hue = (double)MAX_HUE_VALUE / Math.Log((double)UInt16.MaxValue, ScalaLogBase) * Math.Log(f, ScalaLogBase);
hue = hue == Double.NegativeInfinity ? 0 : hue;
return Convert.ToByte(hue);
}
Примечание. переменная grayShadeMatrix представляет собой изображение в оттенках серого только с одним цветовым каналом (значением серого).
Это приводит к таким изображениям (с примененной прозрачностью, где серое изображение имеет значение 0):
person
RononDex
schedule
09.12.2013