none
Как создать градиент по цвету RRS feed

  • Вопрос

  • Добрый день!

    Прошу у Вас помощи в данном вопросе:

    Имеется черно-белая картинка, считывая по пикселю которую, я узнаю значение яркости в каждом пикселе (в моем случает потолок яркости 4095, а не 255). И заношу в двухмерный массив координаты пикселя и его значение яркости соответственно. Как мне сделать так, что бы в зависимости от значения яркости пиксель приобретал соответствующий цвет?

    Как пример:

    Color.Red - при значении яркости от 3500 до 4095
    Color.Orange - при значении яркости от 2500 до 3500
    Color.Yellow - при значении яркости от 1500 до 2500
    Color.Lime - при значении яркости от 500 до 1500
    Color.Blue - при значении яркости от 0 до 500

    Так же интересует сглаживание по цвету.

    Спасибо.

Ответы

  • Ваше первоначальное условие преобразования ч/б -> цвет
    можно сделать более витиеватым.
    Но нужно понимать,
    что преобразовывается ч/б линейный спектр ( Белое - Черное )
    в 3-х мерный цветной - ( Красный - Зеленый - Синий ).
    Т.е. нужно задать функцию преобразования,
    например, линейную по диагонали из одного угла куба цветности в другой -
    (0,0,0) - (1,1,1) - (2,2,2) - ... - (256,256,256) или
    выбрать какую-нибудь другую диагональ того же куба.
    А можно придумать 3-х мерную спираль или параболу,
    как фантазия подскажет...
    • Помечено в качестве ответа Alexander2106 14 мая 2013 г. 13:32

Все ответы

  • У Вас уже есть программа,
    которая считывает яркость и заносит ее в 2-мерный массив?
    Покажите ее.
  • 

    QazRdx, да, конечно.

    Вот эта часть кода:

    int offsetln = 110;
                    //переменные счетчиков
                    int i, i10, tempint0, tempint1;                
                    GLpixbrmax = 0;
                    //смещаем на 110 байт, именно отсюда начинаются значения яркости пикселей для файлов, полученных с конкретно нашей камеры
                    //возможно на других .tiff это смещение будет другим
                    tiffstream.Seek(offsetln, SeekOrigin.Begin);                
                    //так выглядит блок для построчного считывания значений яркости пикселей из файла по байтам
                    for (i10 = 0; i10 < GLtiffheight; i10++)
                    {
                        for (i = 0; i < GLtiffwidth; i++)
                        {
                            tiffstream.Read(temp0, 0, 1);
                            tiffstream.Read(temp1, 0, 1);
                            tempint0 = temp0[0];
                            tempint1 = temp1[0];
                            //некоторые - значения отрицательные, их нужно сместить на 256 - вычисленно опытным путем
                            if (tempint0 < 0) tempint0 = tempint0 + 256;
                            if (tempint1 < 0) tempint1 = tempint1 + 256;
                            GLpixbright = (tempint0 + 256 * tempint1) / 16;
                            if (GLpixbright > GLpixbrmax) GLpixbrmax = GLpixbright;
                            //запишем полученные данные в файл построчно для каждого пикселя (для проверки - все значения не должны превышать 12 бит, то есть 4096)
                            DATAtiff.WriteLine(Convert.ToString(GLpixbright));
                            //запишем двухмерный массив
                            Data.MainArray2D[i, i10] = GLpixbright;
                            //прочитанный пиксель заносим в картинку (нужна на стадии отладки)
                            //Color pixcol = new Color();
                            //pixcol = Color.FromArgb(GLpixbright / 16, GLpixbright / 16, GLpixbright / 16);
                            //pictiff.SetPixel(i, i10, pixcol);
                        }
                    }
    Полученный результат проверен и является верным...


  • Т.е. у Вас уже есть ч/б матрица,
    которую нужно преобразовать в цветную
    а затем сгладить ?
  • QazRdx, совершенно верно :)
  • Вернее даже сначала сгладить и
    только потом преобразовать в цвет!

    Существует множество методов сглаживания
    числовых рядов, линейных , двумерных и многомерных функций.
    Это отдельная тема.
    В Вашем случае, двумерная матрица,
    можно применить простое палеточное скользящее среднее.
    Размер палетки осреднения придется подбирать,
    исходя из качества получаемой картинки.
    Палетка - это маленькая матрица, например, 3х3 или 5х5...

    Для палетки (3х3)
    последовательно в каждой точке исходной матрицы (0-63) х (0-63),
    начиная с точки (1,1)
    расчитывается среднее арифметическое всех
    точек, входящих в пределы палетки - (0,0), (0,1), ..., (2,2).
    Это значение присваивается срединной точке палетки - (1,1) и
    записывается в соответствующую точку результативной матрицы.
    Затем палетка сдвигается в следующую точку исходной матрицы, (1,2),
    и повторяется тот же расчет.
    И так далее, до последней палеточной точки матрицы - (62,62).
    Это - осреднение или сглаживание.

    Преобразование в цвет,
    исходя из Вашего первоначального условия - процесс несложный.

    Color pix = 
    0<Bright && Bright <=500 ? Color.Blue:
    500<Bright && Bright <=1500 ? Color.Lime :
    1500<Bright && Bright <=2500 ? Color.Yelow :
    2500<Bright && Bright <=3500 ? Color.Orange:
    Red;

    Но вообще, если Вы занялись обработкой изображений,
    то Вам лучше покрутиться на форумах с этой тематикой.

    Там множество интересных задач.
    Часть из них решены и решения защищены копирайтами,
    комерческими тайнами и прочими финтами правовой системы.
    Но на какие-то простые вопросы можно будет получить
    простые и понятные ответы.

    Я так думаю...



    • Изменено QazRdx 14 мая 2013 г. 9:56
  • Ваше первоначальное условие преобразования ч/б -> цвет
    можно сделать более витиеватым.
    Но нужно понимать,
    что преобразовывается ч/б линейный спектр ( Белое - Черное )
    в 3-х мерный цветной - ( Красный - Зеленый - Синий ).
    Т.е. нужно задать функцию преобразования,
    например, линейную по диагонали из одного угла куба цветности в другой -
    (0,0,0) - (1,1,1) - (2,2,2) - ... - (256,256,256) или
    выбрать какую-нибудь другую диагональ того же куба.
    А можно придумать 3-х мерную спираль или параболу,
    как фантазия подскажет...
    • Помечено в качестве ответа Alexander2106 14 мая 2013 г. 13:32
  • Спасибо за ответы! Будем думать :)