繁体   English   中英

如何删除图像的白色背景 - java

[英]How to remove white background of an image - java

我想删除图像的白色背景并将其另存为另一张图像。 我写了一个提取背景的代码,但它留下了一些像素值。 结帐原始图像: 在此处输入图片说明

结帐裁剪图像: 在此处输入图片说明

它仍然留下一些白色背景。

我也想删除它。

这是我的代码:

       int x1=0;
    int y1=0;
    boolean res = false;
    System.out.println("in formatImage");

//宽度去除...

  for (int x = 0; x <= w-1; x++) {
            for (int y = 0; y <= h-1; y++) {
                if(new Color(bi1.getRGB(x, y)).getRGB()==-1)
                {res=false;}
                else if (!new Color(bi1.getRGB(x, y)).equals(Color.WHITE)) {
                    res = true;
                }
                if (res) {
                    for (int p = y; p <= h-1; p++) {
                        b21.setRGB(x1,p,new Color(bi1.getRGB(x, p)).getRGB());                        
                    }
                    x1++;
                    res = false;
                    break;
                }
            }
        }
        b21=new BufferedImage(x1,h,BufferedImage.TYPE_INT_RGB);
        x1=0;
        for (int x = 0; x <= w-1; x++) {
            for (int y = 0; y <= h-1; y++) {
                if(new Color(bi1.getRGB(x, y)).getRGB()==-1)
                {res=false;}
                else if (!new Color(bi1.getRGB(x, y)).equals(Color.WHITE)) {
                    res = true;
                }
                if (res) {
                    for (int p = 0; p <= h-1; p++) {
                        b21.setRGB(x1,p,new Color(bi1.getRGB(x, p)).getRGB());
                    }
                    x1++;
                    res = false;
                    break;
                }
            }
        }

//高度去除

for (int y = 0; y <= h-1; y++) {
    System.out.println("Y = "+y);
    for (int x = 0; x <= x1-1; x++) {
        System.out.println("("+x+","+y+") : "+b21.getRGB(x, y));
        if (!new Color(b21.getRGB(x, y)).equals(Color.WHITE)) {
            res = true;
        }
        if (res) {
            for (int p = 0; p <= x1-1; p++) {
               b31.setRGB(p,y1,new Color(b21.getRGB(p, y)).getRGB());

            }
            y1++;
            res = false;
            break;
        }
    }
}
b31=new BufferedImage(x1,y1,BufferedImage.TYPE_INT_RGB);
int ty=y1;
y1=0;
for (int y = 0; y <= h-1; y++) {
    for (int x = 0; x <= x1-1; x++) {
        if (!new Color(b21.getRGB(x, y)).equals(Color.WHITE)) {
            res = true;
        }
        if (res) {
            for (int p = 0; p <= x1-1; p++) {
               b31.setRGB(p,y1,new Color(b21.getRGB(p, y)).getRGB());
            }
            y1++;
            res = false;
            break;
        }
    }
}

b31 有最终图像。

如果您使用任何合适的图像编辑器检查图像,您会发现模型头部、左手和右肘附近的像素不是纯白色 (0xFFFFFF)。

在此处输入图片说明

您需要调整您的算法以允许在所有 3 个通道上与全强度略有偏差。 由您决定允许多少回旋余地。

正如吉姆所说,身体附近的颜色不是纯白色。 因此,您修改了代码的以下语句,它将对您很有用。 替换以下命令行

if (!new Color(b21.getRGB(x, y)).equals(Color.WHITE)) 

经过

 if (new Color(b21.getRGB(x, y)).getRGB()<-1000000) 

这会给你你想要的输出。 您可以将白色和灰色的深浅从 -1000000 更改为 -2000000

我确实创建了一个将白色背景转换为透明的函数

    public Image makeWhiteBGToTransparent(final BufferedImage im) {
    final ImageFilter filter = new RGBImageFilter() {
        public int markerRGB = 0xFFFFFFFF;

        public final int filterRGB(final int x, final int y, final int rgb) {
            if ((rgb | 0xFF000000) == markerRGB) {
                return 0x00FFFFFF & rgb;
            } else {
                return rgb;
            }
        }
    };

    final ImageProducer ip = new FilteredImageSource(im.getSource(), filter);
    return Toolkit.getDefaultToolkit().createImage(ip);
}

现在,如果我们想将此Image转换为BufferedImage则使用此函数

public BufferedImage toBufferedImage(Image img) {
    if (img instanceof BufferedImage) {
        return (BufferedImage) img;
    }

    BufferedImage bImage = new BufferedImage(img.getWidth(null), img.getHeight(null),
            BufferedImage.TYPE_INT_ARGB);
    Graphics2D bGr = bImage.createGraphics();
    bGr.drawImage(img, 0, 0, null);
    bGr.dispose();
    return bImage;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM