Java-如何从图像中删除背景颜色

时间:2016-04-21 18:38:38

标签: java

首先,我是新手,也是编码。我提前为任何有误导性的事情道歉。

我目前正在编写一个使用图像作为输入的Java程序。我目前所拥有的是按图像的宽度和高度扫描每个像素,将HSB保存在一个数组中,然后输出图像中每种颜色的百分比。我现在想省略该计算的背景。首先,让我们说背景为白色。此外,图像中的像素也不是背景中的白色。

谢谢,

4 个答案:

答案 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)

哦,这并不像你希望的那么简单
您不能简单地逐个像素地检测背景是什么以及图像的一部分。这篇文章看看如何删除图像的一个颜色层。 但检测白色像素是背景的一部分还是图像?
有多种可能的方法

  • 假设背景就在周围和何时(从任何地方看) 一边到中心)颜色变化,就是结束了 “背景”。您可以从一侧到另一个中心检查每一行和每列 并记录“背景”颜色的结束位置。
  • 或类似方法 - 如果至少在一个(四个)方向从像素到侧面看,没有颜色变化(它一直变为白色),而不是背景的一部分。
  • 或者只是看看another post。从这里你可以尝试自己的方式。

无论如何 - 你必须创建一个逻辑来检测哪些(即)白色像素是图片的一部分,哪些是背景的一部分。
我希望这至少可以为你提供更多的知识。

答案 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文件设置为空填充。

这个主意对我来说很好。但是,如果您不同意,请告诉我原因)