不显示二进制图像

时间:2011-01-07 06:12:56

标签: java image image-processing edge-detection

我正在进行图像检测,我必须处理每个红色,绿色和蓝色元素以获得边缘图(黑白形式的二进制图像)并将它们组合成一个以显示输出。在我提取每个红色,绿色和蓝色的元素并设置阈值以获取二进制图像后,它不显示二进制图像。相反,它显示了灰度图像。有人愿意帮助我吗?到目前为止,这是我的代码。

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缓冲图像并将其用于阈值处理方法,以便我可以获得边缘图吗?

1 个答案:

答案 0 :(得分:1)

你的代码看起来很可疑的一件事是你的“获取红色元素步骤”(第一个循环)写入process_red,但你的阈值步骤(第二个循环)从buf_red读取,这不是似乎在任何地方都被初始化了。这是一个错字,还是代码中的错误?

您提到了边缘检测,但我在您发布的代码中看不到任何看起来像边缘检测的内容。你似乎正在做的就是提取红色(绿色,蓝色)通道,对它们进行阈值处理,然后将它们组合起来。

如果您在处理问题时更具分析性,那将会有所帮助。问题出现在你自己的最早点是什么?您是否正确地从图像中提取通道?您的边缘检测图像看起来正确吗?您的阈值结果是否能满足您的期望?您可以自己回答所有这些问题 - 编写/显示调试图像。

最后,理想情况下,您不必手动编写这样的低级普通任务(获取像素,按0xff掩码等),方法是自己编码,至少在Java中编码。第一次通过它很有趣,但之后它只是bug和意外功能的另一个来源。我目前不使用Java,但我确信它有一个可以为您处理此类任务的图像处理API。