如何在Java中使用阈值和BufferedImage

时间:2015-09-01 20:43:33

标签: java image image-processing threshold

我已经在Java中读取了我的原始图像BufferedImage,然后执行了一些操作,我试图将图像阈值设置为高(255)或低(0),但是当我保存图像时,实际上我尝试覆盖它使用新值时,像素值不仅为0和255,还会出现一些相邻值,我不明白为什么。

阅读我的图片

File input = new File("/../Screenshots/1.jpg");
BufferedImage image = ImageIO.read(input);
for (int i = 0; i < image.getWidth(); i++) {
        for (int j = 0; j < image.getHeight(); j++) {
            Color c = new Color(image.getRGB(i, j));
            powerspectrum[i][j] = (int) ((c.getRed() * 0.299)
                    + (c.getGreen() * 0.587) + (c.getBlue() * 0.114));
        }
    }

阈值我的影像

for (int i = 0; i < image.getWidth(); i++) {
        for (int j = 0; j < image.getHeight(); j++) {
            if (gradient[i][j] <= upperthreshold
                    && gradient[i][j] >= lowerthreshold)
                spaces[i][j] = 255;
            else
                spaces[i][j] = 0;
            Color gradColor = new Color(spaces[i][j], spaces[i][j],
                    spaces[i][j]);
            image.setRGB(i, j, gradColor.getRGB());
        }
    }

保存我的图片

File gradoutput = new File("/../Screenshots/3_GradThresh.jpg");
    ImageIO.write(image, "jpg", gradoutput);

我不知道如何切断其他强度值。

2 个答案:

答案 0 :(得分:1)

我怀疑这是因为JPG是一种有损格式。将JPG保存到磁盘时,它正在进行压缩。尝试使用位图来查看是否删除了这些相邻的灰色区域值。

答案 1 :(得分:0)

+1与jpg压缩问题。在图像处理中,我们使用PNG(最佳压缩格式而不丢失)或TIFF(最差场景)。

顺便说一下,setRGB / getRGB方法的表现非常糟糕。最快的是直接修改DataBuffer,但您必须为每种类型的图像编码执行此操作。另一种解决方案(但速度较慢)是使用Raster。然后你不必担心编码。