Бинарное изображение не отображается

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

Buffered Image buff_red;
int[] process_red;
int width = 256; 
int height = 256;

private void processActionPerformed(java.awt.event.ActionEvent evt) { 
width = inputimage.getWidth(null);
height = inputimage.getHeight(null);

buff_red = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics r = buff_red.getGraphics();
r.drawImage(inputimage, 0, 0, null);
r.dispose();

//get the red element
process_red = new int[width * height];
counter = 0;
 for(int i = 0; i < 256; i++) {
     for(int j = 0; j < 256; j++) {
         int clr = buff_red.getRGB(j, i);
         int red = (clr & 0x00ff0000) >> 16;
         red = (0xFF<<24)|(red<<16)|(red<<8)|red;
         process_red[counter] = red;
         counter++;
     }
}

//set threshold value for red element
int threshold = 100;
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
     int bin = (buff_red.getRGB(x, y) & 0x000000ff);
     if (bin < threshold)
               bin = 0;
     else
               bin = 255;
     buff_red.setRGB(x,y, 0xff000000 | bin << 16 | bin << 8 | bin);
     }
}

Обновлять:

Инициализация buff_red была выполнена до "получения красного элемента" (первый цикл), а именно:

buff_red = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics r = buff_red.getGraphics();
r.drawImage(inputimage, 0, 0, null);

Должен ли я буферизовать изображение из process_red и использовать его для метода пороговой обработки, чтобы я мог получить карту границ?


person gerry chocolatos    schedule 07.01.2011    source источник
comment
Не могли бы вы показать мне свой код, я также работал над тем же процессом преобразования изображения RGB в изображение серого, а затем серого изображения в двоичное изображение.   -  person    schedule 26.02.2011
comment
Как далеко вы работали над этим? Вы можете показать нам, что вы сделали, и мы можем помочь вам с вашей проблемой.   -  person gerry chocolatos    schedule 23.03.2011


Ответы (1)


Одна вещь, которая выглядит подозрительной из вашего кода, заключается в том, что ваш «шаг получения красного элемента» (первый цикл) записывает в process_red, но ваш шаг порогового значения (второй цикл) читает из buf_red, который, похоже, нигде не инициализирован. Это опечатка или ошибка в коде?

Вы упомянули об обнаружении краев, но я не вижу ничего похожего на обнаружение краев в опубликованном вами коде. Все, что вы, кажется, делаете, это извлекаете красные (зеленые, синие) каналы, устанавливаете для них порог, а затем объединяете их.

Было бы полезно, если бы вы были более аналитическими в своем подходе к проблеме. Каков самый ранний момент, когда проблема проявляется? Вы правильно извлекаете каналы из изображения? Ваши изображения обнаружения краев выглядят правильно? Дает ли ваш пороговый результат то, что вы ожидаете? На все эти вопросы вы можете ответить сами - написать/показать отладочные изображения.

Наконец, в идеале вам не нужно вручную кодировать такие низкоуровневые рутинные задачи (извлечение пикселя, маска по 0xff и т. д.), кодируя их самостоятельно, по крайней мере, на Java. Это весело в первый раз, но после этого это просто еще один источник ошибок и неожиданных функций. В настоящее время я не использую Java, но я уверен, что у него есть API обработки изображений, который может справиться с такими задачами за вас.

person mpenkov    schedule 08.01.2011
comment
привет, спасибо за ваш ответ. на самом деле я повторяю тот же процесс, который я делал раньше, в котором исходное изображение преобразуется в изображение в градациях серого, и я порог его. в результате этого процесса я получил карту краев, поэтому я подумал, что выполнение того же процесса для каждого компонента RGB также даст карту краев. из того, что вы объяснили, я понял, что после первого цикла я должен установить порог из process_red, я прав? Пожалуйста, поправьте меня, если я ошибаюсь. спасибо еще раз. - person gerry chocolatos; 09.01.2011
comment
Я неправильно понял, что вы имели в виду под краевой картой. Это намекает на обнаружение краев, которое, как правило, немного сложнее, чем просто преобразование оттенков серого и пороговое значение. - person mpenkov; 09.01.2011
comment
да, после преобразования в оттенки серого я выполняю процесс пороговой обработки, в котором, если частота цвета меньше порогового значения, этот цвет будет установлен на черный, иначе установлен на белый (край). это приводит к черно-белому изображению (двоичному изображению), но это не сработало, когда я применяю его к каналам RGB. :/ - person gerry chocolatos; 09.01.2011