Изменение двумерного массива пикселей на изображение на основе меток пикселей - PullRequest
0 голосов
/ 28 марта 2019

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

У меня есть двумерный массив 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 Ответ

0 голосов
/ 28 марта 2019

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

Пиксели на изображении типа BufferedImage.TYPE_INT_RGB представлены как int значения. Они состоят из 4 байтов. Последние три байта определяют красный, зеленый и синий (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=qualitative&scheme=Paired&n=11. Используя их, вы можете напрямую определить массив цветов следующим образом:

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