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