首先,我是新手,也是编码。我提前为任何有误导性的事情道歉。
我目前正在编写一个使用图像作为输入的Java程序。我目前所拥有的是按图像的宽度和高度扫描每个像素,将HSB保存在一个数组中,然后输出图像中每种颜色的百分比。我现在想省略该计算的背景。首先,让我们说背景为白色。此外,图像中的像素也不是背景中的白色。
谢谢,
答案 0 :(得分:0)
我不确定你的意思。没有代码,所以我只能给你一个例子。根据我的理解,当颜色与背景相同时,您想跳过计算。这很简单。你可以这样做:
for(int x = 0; x < width; x++) {
for(int y = 0; y < height; y++) {
Color pixelColor = get pixel color at x and y;
Color backgroundColor = the background color;
if(pixelColor != backgroundColor) {
//Calculation will be done here
}
}
}
如果这对您没有帮助或您有任何其他问题,请问我。
答案 1 :(得分:0)
哦,这并不像你希望的那么简单。
您不能简单地逐个像素地检测背景是什么以及图像的一部分。这篇文章看看如何删除图像的一个颜色层。
但检测白色像素是背景的一部分还是图像?
有多种可能的方法:
无论如何 - 你必须创建一个逻辑来检测哪些(即)白色像素是图片的一部分,哪些是背景的一部分。
我希望这至少可以为你提供更多的知识。
答案 2 :(得分:0)
以下是完整工作代码的示例。
您可以添加光标以选择颜色和jslider以获取模糊或阈值。根据需要使用backColor和阈值。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Convert {
private static final Color backColor = new Color(255,255,255);
private static final int THRESHOLD = 35;
private static final int TRANSPARENT = 0; // 0x00000000;
static File base = new File("f://mortar1.png");
static File base2 = new File("f://outtrans.png");
public static void main(String[] args) throws IOException {
System.out.println("Convert.main()");
for (File file : base.listFiles())
{
BufferedImage initImage = ImageIO.read(base);
int width = initImage.getWidth(null),
height = initImage.getHeight(null);
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics g = image.getGraphics();
g.drawImage(initImage, 0, 0, null);
System.out.println("before: " + image.getRGB(0, 0));
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int pixel = image.getRGB(x, y);
Color color = new Color(pixel);
int dr = Math.abs(color.getRed() - backColor.getRed()),
dg = Math.abs(color.getGreen() - backColor.getGreen()),
db = Math.abs(color.getBlue() - backColor.getBlue());
if (dr < THRESHOLD && dg < THRESHOLD && db < THRESHOLD) {
image.setRGB(x, y, TRANSPARENT);
}
}
}
System.out.println(" after: " + image.getRGB(0, 0));
File file = new File("f://outtrans1.png");
ImageIO.write(image, "png", file);
}
}
}
答案 3 :(得分:0)
或者简单地将png文件设置为空填充。
这个主意对我来说很好。但是,如果您不同意,请告诉我原因)