我已经在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);
我不知道如何切断其他强度值。
答案 0 :(得分:1)
我怀疑这是因为JPG是一种有损格式。将JPG保存到磁盘时,它正在进行压缩。尝试使用位图来查看是否删除了这些相邻的灰色区域值。
答案 1 :(得分:0)
+1与jpg压缩问题。在图像处理中,我们使用PNG(最佳压缩格式而不丢失)或TIFF(最差场景)。
顺便说一下,setRGB / getRGB方法的表现非常糟糕。最快的是直接修改DataBuffer,但您必须为每种类型的图像编码执行此操作。另一种解决方案(但速度较慢)是使用Raster。然后你不必担心编码。