Добавление цвета к изображению в оттенках серого

Я хочу добавить цвета к изображению в оттенках серого; это не обязательно должно быть точное представление цвета, но добавление цвета к другому оттенку серого, это просто для определения различных областей интереса в изображении. Например. участки растительности, вероятно, будут иметь аналогичный оттенок серого, добавив цвет к этому диапазону значений, должно быть ясно, какие участки являются растительностью, какие - водой и т. д.

У меня есть код для получения цветов из изображения и их сохранения как цветового объекта, но это не дает возможности изменить значения. Например. если значение серого меньше 85, цвет красный, если от 86 до 170 цвет зеленый и от 171 до 255 синий цвет. Я понятия не имею, как это будет выглядеть, но теоретически полученное изображение должно позволить пользователю идентифицировать различные области.

Текущий код, который у меня есть для получения значения пикселя, ниже.

int total_pixels = (h * w);
Color[] colors = new Color[total_pixels];

for (int x = 0; x < w; x++)
{
  for (int y = 0; y < h; y++)
  {
    colors[i] = new Color(image.getRGB(x, y));
    i++;
  }
}
for (int i = 0; i < total_pixels; i++)
{
  Color c = colors[i];
  int r = c.getRed();
  int g = c.getGreen();
  int b = c.getBlue();
  System.out.println("Red " + r + " | Green " + g + " | Blue " + b);
}

Я ценю любую помощь! Большое спасибо


person user2517280    schedule 13.11.2013    source источник
comment
И .. в чем конкретно ваш вопрос?   -  person Andrew Thompson    schedule 14.11.2013
comment
Как вы поймете, что пиксель принадлежит области растительности или области воды? просто любопытно..   -  person andrea.marangoni    schedule 14.11.2013


Ответы (2)


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

В приведенном вами примере вы можете сделать что-то вроде этого.

public Color newColorFor(int pixel) {
    Color c = colors[pixel];
    int r = c.getRed();  // Since this is grey, the G and B values should be the same
    if (r < 86) {
        return new Color(r * 3, 0, 0);  // return a red
    } else if (r < 172) {
        return new Color(0, (r - 86) * 3, 0); // return a green
    } else {
        return new Color(0, 0, (r - 172) * 3); // return a blue
    }
}

Возможно, вам придется немного поиграться, чтобы получить лучший алгоритм. Я подозреваю, что приведенный выше код действительно сделает ваше изображение довольно темным и тусклым. Вам лучше использовать более светлые тона. Например, вы можете изменить каждый 0 в приведенном выше коде на 255, что даст вам оттенки желтого, пурпурного и голубого. Это будет много проб и ошибок.

person Dawood ibn Kareem    schedule 13.11.2013

Я рекомендую вам взглянуть на Java2D. В нем много классов, которые могут значительно облегчить вашу жизнь. Вы можете в конечном итоге изобрести велосипед, если проигнорируете его.

Вот краткая демонстрация того, что вы можете сделать:

    int width = 100;
    int height = 100;
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    image.getRGB(x, y);
    Graphics2D g2d = (Graphics2D)image.getGraphics();
    g2d.setColor(Color.GREEN);
    g2d.fillRect(x, y, width, height);
person Akira    schedule 13.11.2013