На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Перевести температуру в цвет
    Доброго времени суток. Проблема нарисовалась. Получаю с тепловизора массив int16 значений температуры. Надо каждое значение температуры переконвертировать по цветовой шкале. Например я задаю шкалу от 20 градусов по Цельсию до 150 градусов по Цельсию, что будет соответствовать переходу цвета от синего к красному. Если не ошибаюсь, то в OpenCV это соответствует ColorMap_JET. Как перевести значение температуры в цвет не могу придумать, может кто что то дельное посоветует, ибо с Гуглом у меня не сложилось.

    Добавлено
    кстати, OpenCv.Sharp использовать можно, он у меня есть уже в проекте
      так, продолжим, вот до чего доковырял я:

      1. Я получаю массив int16 в размере 768 штук, каждое значение поделенное на 100 это температура точки с точностью 2 знака до запятой. Начальное разрешение матрицы 32х24 пикселя
      2. Далее я создаю массив картинки bgr_array длинной 32*24*3
      3. Далее я преобразую каждое значение температуры в цвет через HSV палитру. То есть маплю диапазон температуры от 10 до 150 градусов к hue от 260 до 0 (обратный диапазон чтобы синий был на низких температурах, красный на высоких), а сатурацию и насыщенность задаю в 1. А далее полученный цвет перевожу из HSV диапазона в RGB

      ExpandedWrap disabled
        public static int ThempToHue(decimal themp)
        {
            decimal value = themp/100;
            if (value > 260)
            {
                while (value>260)
                {
                    value-= 260;
                }
            }
            return (int)Map(value, 10, 150, 260, 0);
        }


      итоговый код получения массива следующий

      ExpandedWrap disabled
        var array_csharp = t_array.ToList<UInt16>();
        int width = 32;
        int height = 24;
        int bytesPerPixel = 3;
        int pixel_length = width * height * bytesPerPixel;
        byte[] bgr_array = new byte[pixel_length * bytesPerPixel];
         
        for (int i = 0; i < array_csharp.Count; i++)
        {
            int thempToHue = Utilites.ThempToHue(array_csharp[i]);
            var col = Utilites.ColorFromHSV(thempToHue, 1f, 1f);
         
                bgr_array[bytesPerPixel * i] = col.R;
                bgr_array[bytesPerPixel * i + 1] = col.G;
                bgr_array[bytesPerPixel * i + 2] = col.B;
        }



      Далее пытаюсь преобразовать это дело в картинку с помощью OpenCV

      ExpandedWrap disabled
         Mat src = new Mat(24, 32, MatType.CV_8UC3);
         src = Cv2.ImDecode(bgr_array.ToArray(), ImreadModes.AnyColor);
         var fName = $"\\images\\{x}.jpg";
         x++;
         src.SaveImage(fName, new ImageEncodingParam(ImwriteFlags.JpegProgressive, 255));


      и вот тут беда, при сохранении выдает ошибку что изображение пустое. В чем может быть дело ?
        Pit-Bul, сорян - не владею шарпомъ. Но умею запрягать ChatGPT. Зацени-затести ответ его, может быть поможет:

        ExpandedWrap disabled
          using OpenCvSharp;
          using System;
           
          class Program
          {
              static void Main(string[] args)
              {
                  // Задайте значения шкалы температур
                  double minTemp = 20;
                  double maxTemp = 150;
           
                  // Задайте массив значений температуры
                  short[] temperatureValues = { 50, 75, 100, 125 };
           
                  // Создайте матрицу для хранения значений температуры
                  Mat temperatureMatrix = new Mat(1, temperatureValues.Length, MatType.CV_16S, temperatureValues);
           
                  // Нормализуйте значения температуры в диапазон от 0 до 1
                  Mat normalizedMatrix = new Mat();
                  Cv2.Normalize(temperatureMatrix, normalizedMatrix, 0, 255, NormTypes.MinMax, MatType.CV_8U);
           
                  // Преобразуйте значения температуры в цвета с использованием ColorMap_JET
                  Mat coloredImage = new Mat();
                  Cv2.ApplyColorMap(normalizedMatrix, coloredImage, ColormapTypes.Jet);
           
                  // Выведите результат
                  Cv2.ImShow("Colored Image", coloredImage);
                  Cv2.WaitKey(0);
                  Cv2.DestroyAllWindows();
              }
          }

        Комментарий ChatGPT:

        В этом примере мы используем библиотеку OpenCvSharp для работы с OpenCV в C#. Мы создаем матрицу temperatureMatrix, содержащую значения температуры, затем нормализуем ее и применяем цветовую шкалу ColormapTypes.Jet с помощью функции ApplyColorMap. Результат будет отображен в окне.
          Majestio, спасибо большое. Вроде стало лучше, но картинки по прежнему нет, буду ковырять Ваш вариант.
            Цитата Pit-Bul @
            Majestio, спасибо большое. Вроде стало лучше, но картинки по прежнему нет, буду ковырять Ваш вариант.

            ChatGPT часто врет - и это нужно учитывать. Но наколки на варианты вычислений нужно "запоминать".
              ну по крайней мере мат теперь не пустой и с этим уже можно работать
                я наверное тупой, но что то не выходит аленький цветочек. Код от Majestio работает, но выдает линию а не изображение 24х32 пикселя
                пытаюсь сделать решапе не выходит

                ExpandedWrap disabled
                  ndarray t_array = np.frombuffer(data.Skip(8).ToArray(), dtype: np.Int16);
                  t_array.reshape(24, 32);


                Добавлено
                пошел дальше, преобразовал массив в двумерный, тоже не помогает

                ExpandedWrap disabled
                  ndarray t_array = np.frombuffer(data.Skip(8).ToArray(), dtype: np.Int16);
                  int index = 0;
                  Int16[,] twoDimensionalArray = new Int16[24, 32];
                  var tmp = t_array.ToList<Int16>();
                  for (int x = 0; x < 24; x++)
                  {
                      for (int y = 0; y < 32; y++)
                      {
                          twoDimensionalArray[x, y] = tmp[index];
                          index++;
                      }
                  }
                  Mat temperatureMatrix = new Mat(1, t_array.ToArray().Length, MatType.CV_16S, tmp.ToArray());
                   
                  Mat normalizedMatrix = new Mat();
                  Cv2.Normalize(temperatureMatrix, normalizedMatrix, 0, 255, NormTypes.MinMax, MatType.CV_8U);
                  Mat coloredImage = new Mat();
                  Cv2.ApplyColorMap(normalizedMatrix, coloredImage, ColormapTypes.Jet);
                  прошу прощения, я реально походу тупой, либо устал )))

                  ExpandedWrap disabled
                    Mat temperatureMatrix = new Mat(1, t_array.ToArray().Length, MatType.CV_16S, tmp.ToArray());


                  вот оно зло, должно быть

                  ExpandedWrap disabled
                    Mat temperatureMatrix = new Mat(24, 32, MatType.CV_16S, tmp.ToArray());
                    все заработало как и хотелось
                    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script execution time: 0,0348 ]   [ 16 queries used ]   [ Generated: 18.06.24, 09:37 GMT ]