java - 不显示二值图像

标签 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 的图像并将其用于阈值方法,以便获得边缘图吗?

最佳答案

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

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

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

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

关于java - 不显示二值图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4622959/

相关文章:

html - 在 HTML/CSS 中显示类似图表的 png 图像

image - 在 matlab 中逐像素检查图像的特定 RGB 值

java - 使用 ArrayList 中的数据填充 Android ListView 是将每个项目设置为与第一个项目相同

java - 在窗口关闭时销毁存储在数据库中的用户 session

javascript - 显示带有 canvas 标签问题的图像

PHP - 获取站点的图标并在必要时将其转换为 png

image-processing - PVRTC 压缩增加了 PNG 的文件大小

java - 非法参数异常 readExceptionFromParcel

java - 在 libgdx 中批处理多维数据集时出现问题

python - PyTorch NotImplementedError 转发