Преобразование 2D массива пикселей в изображение на основе меток пикселей

#java #multidimensional-array #rgb #pixel

#java #многомерный массив #rgb #пиксель

Вопрос:

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

У меня есть 2D-массив, newPixels [][] который содержит значения 0, which is the background color , и labels, which are values of 1, 4, 7, 10 теперь я хочу преобразовать пиксели, помеченные 1, 4, 7, 10 , в разные цвета (различный цвет для пикселей, помеченных 1, 4 и т.д.).

Что я думал сделать

 BufferedImage img = new BufferedImage(ewPixelsWidth,
            newPixelHeight, BufferedImage.TYPE_INT_RGB);

for(int i = 0; i < newPixelsWidth; i  ){
   for(int j = 0; j < newPixelHeight; j  }

       set img.setRGB(i,j, newPixel[i][i])
}
  

Однако при реализации приведенного выше кода изображение, которое я получил обратно, было просто черным. Это потому, что номера пикселей указаны в десятичной системе счисления и должны быть в шестнадцатеричной системе счисления? Или, может быть, номер метки 1, 4, 7, 10 не может быть преобразован в цвет?

Ответ №1:

Значения 1 10 на самом деле они представляют разные цвета: это разные оттенки синего, но настолько темные, что их почти не отличить от черного.

Пиксели в изображении типа BufferedImage.TYPE_INT_RGB представлены в виде int значений. Они состоят из 4 байт. Последние три байта определяют компоненты red, green и blue (R, G, B).

Обратите внимание, что для изображения типа BufferedImage.TYPE_INT_ARGB первым байтом будет альфа-компонент (непрозрачность). Для такого изображения вам также пришлось бы установить первый байт равным 255 — в противном случае пиксели оставались бы прозрачными.

Итак, это ваши цвета:

   RRGGBB
0x000001
0x000004
0x000007
0x000010
  

Значение, подобное

 0x0000FF
  

был бы полностью насыщенный синий.


Чтобы назначить цвета пикселям на основе этих значений, было бы полезно знать, сколько цветов вы ожидаете. Одним из подходов может быть просто заполнение массива случайными цветами и поиск их позже:

 int numColors = 10;
int colors[] = new int[numColors];
Random random = new Random(0);
for (int i=0; i<numColors; i  ) {
    colors[i] = 0xFF000000 | random.nextInt();
}

// In your loop:
img.setRGB(i,j, colors[newPixel[i][i]]);
  

Обратите внимание, что вы не можете быть уверены, что эти случайные цвета будут легко различимы. В качестве альтернативы вы можете использовать некоторую общую цветовую карту. Примеры можно найти в Интернете, например, по http://colorbrewer2.org/#type=qualitativeamp;scheme=Pairedamp;n=11 . Используя их, вы можете напрямую определить массив цветов следующим образом:

 int colors[] =
{
    0xffa6cee3,
    0xff1f78b4,
    0xffb2df8a,
    0xff33a02c,
    0xfffb9a99,
    0xffe31a1c,
    0xfffdbf6f,
    0xffff7f00,
    0xffcab2d6,
    0xff6a3d9a,
    0xffffff99
};