[英]How to threshold and BufferedImage in Java
我已经在 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);
我不知道如何切断其他强度值。
我怀疑这是因为 JPG 是一种有损格式。 当您将 JPG 保存到磁盘时,它正在进行压缩。 尝试使用位图查看是否删除了这些相邻的灰色区域值。
+1 与 jpg 压缩问题。 在图像处理中,我们使用 PNG(无损失的最佳压缩格式)或 TIFF(最坏情况)。
顺便说一句,setRGB/getRGB 方法的性能很差。 最快的是直接修改DataBuffer,但是你必须对每种类型的图像编码都这样做。 另一种解决方案(但速度较慢)是使用 Raster。 然后你不必担心编码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.