Java 不显示二进制图像

Java 不显示二进制图像,java,image,image-processing,edge-detection,Java,Image,Image Processing,Edge Detection,我正在做一个图像检测,我必须对每个红色、绿色和蓝色元素进行处理,以获得边缘贴图(黑白形式的二值图像),并将它们组合成一个来显示输出。在提取每个红、绿、蓝元素并设置阈值以获得二值图像后,它不会显示二值图像。相反,它显示的是灰度图像。谁能帮我一下吗?这是到目前为止我的代码 Buffered Image buff_red; int[] process_red; int width = 256; int height = 256; private void processActionPerforme

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

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);
     }
}

我是否应该缓冲来自
process\u red
的图像,并将其用于阈值方法,以便获得边缘贴图?

从您的代码中可以看出,您的“get red element step”(第一个循环)写入
process\u red
,但阈值步骤(第二个循环)从
buf\u red
读取,似乎在任何地方都没有初始化。这是打字错误还是代码中的错误

你提到了边缘检测,但我在你发布的代码中看不到任何类似边缘检测的东西。您所要做的就是提取红色(绿色、蓝色)通道,对它们设置阈值,然后组合它们

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


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

hi,thx for ur response。实际上,我重复了我以前做过的相同的过程,在这个过程中,原始图像被转换成灰度图像,然后我对其设置阈值。从这个过程中,我得到了边缘贴图,所以我认为通过对每个RGB组件执行相同的过程,也会得到边缘贴图。根据你的解释,在第一次循环后,我必须从过程中设置阈值,对吗?如果我错了,请纠正我。再次谢谢。我误解了你所说的“边缘地图”的意思。它暗示了边缘检测,这通常比灰度转换和阈值更复杂。是的,在转换为灰度后,我进行阈值处理,如果颜色的频率小于阈值,则该颜色将设置为黑色,否则设置为白色(边缘)。它会产生一个黑白图像(二进制图像),但当我将其应用于RGB通道时,它不是这样工作的:/你能给我看看你的代码吗?我也在做同样的工作,把RGB图像转换成灰度图像,然后再把灰度图像转换成二值图像。你做了多少?你可以告诉我们你做了什么,我们可以帮助你解决你的问题。
buff_red = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics r = buff_red.getGraphics();
r.drawImage(inputimage, 0, 0, null);