如何在Java中设置阈值和缓冲区映像

如何在Java中设置阈值和缓冲区映像,java,image,image-processing,threshold,Java,Image,Image Processing,Threshold,我用Java将原始图像读取为BuffereImage,然后执行一些操作,我试图将图像阈值设置为高(255)或低(0),但当我保存图像时,实际上我尝试用新值覆盖它,像素值不仅是0和255,还会出现一些相邻值,我不明白为什么 阅读我的图像 File input = new File("/../Screenshots/1.jpg"); BufferedImage image = ImageIO.read(input); for (int i = 0; i < image.getWidth();

我用Java将原始图像读取为BuffereImage,然后执行一些操作,我试图将图像阈值设置为高(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);

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

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

+1存在jpg压缩问题。在图像处理中,我们使用PNG(无丢失的最佳压缩格式)或TIFF(最坏情况)


顺便说一句,setRGB/getRGB方法的性能很差。最快的方法是直接修改DataBuffer,但必须针对每种类型的图像编码进行修改。另一种解决方案(但速度较慢)是使用光栅。然后您就不必担心编码了。

不确定ImageIO是否可以保存位图,但png文件也应该可以!马蒂亚斯让我好奇,所以我查了一下。ImageIO支持BMP、PNG、WBMP(无线位图,每个像素仅为黑色或白色)和GIF(以及JPG)。从大小的角度来看,GIF或PNG都是不错的选择。@JohnC很好用,非常感谢。我所做的只是ImageIO.write(图像,“bmp”,输出),但仍然将其保存为jpg。@PsiLambdaDelta,如果您正在执行我认为您正在执行的操作(将二进制内容为bmp格式的文件命名为“xyz.jpg”),您可能需要小心。我想不出这会导致什么具体问题,但这并不是一个很好的做法(你不会给一个.docx.txt命名,即使在表面上它们都包含文本)。是否有使用.jpg文件名的原因?