【问题标题】:Binary image is not displayed不显示二进制图像
【发布时间】:2011-01-07 06:12:55
【问题描述】:

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

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的初始化是在“get red element”(第一个循环)之前完成的,即:

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

我是否应该缓冲来自process_red 的图像并将其用于阈值方法以便我可以获得边缘图?

【问题讨论】:

  • 你能告诉我你的代码吗?我也在做同样的过程,将 RGB 图像转换为灰度图像,然后将灰度图像转换为二进制图像。
  • 您在这方面工作了多长时间?您可以向我们展示您所做的工作,我们可以帮助您解决问题。

标签: java image image-processing edge-detection


【解决方案1】:

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

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

如果您在解决问题的方法中更具分析性,那将会有所帮助。问题出现的最早点是什么?您是否正确地从图像中提取通道?您的边缘检测图像看起来正确吗?您的阈值化结果是否符合您的预期?您可以自己回答所有这些问题——编写/显示调试图像。

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

【讨论】:

  • 嗨,谢谢您的回复。实际上,我重复了我之前完成的相同过程,其中将原始图像转换为灰度图像并对其进行阈值处理。从那个过程中我得到了边缘图,所以我认为通过对每个 RGB 组件执行相同的过程也会给出边缘图。根据你的解释,我知道在第一个循环之后我必须从 process_red 中对其进行阈值处理,对吗?如果我错了,请纠正我。再次感谢。
  • 我误解了您所说的“边缘图”是什么意思。它暗示了边缘检测,这通常比灰度转换和阈值处理更复杂。
  • 是的,转换为灰度后,我进行阈值处理,如果颜色的频率小于阈值,则该颜色将设置为黑色,否则设置为白色(边缘) .它会产生黑白图像(二进制图像),但是当我将其应用于 RGB 通道时,它并没有那样工作。 ://
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-01
  • 2014-12-11
  • 2016-03-04
  • 2014-08-09
  • 2015-01-08
  • 2013-04-03
相关资源
最近更新 更多