2016-04-21 174 views
0

首先,我对此感到陌生并且还进行了编码。我提前道歉任何有误导性的事情。Java-如何从图像中移除背景颜色

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

谢谢,

+0

考虑[ImageMagick](http://www.imagemagick.org/script/index.php)。这是一个免费的图像处理开源软件。有[Java桥实现](http://im4java.sourceforge.net/)从您的Java代码中调用ImageMagick命令。 [这里是im4java开发者指南](http://im4java.sourceforge.net/docs/dev-guide.html#imageCommands) – 2016-04-21 18:52:29

+0

请考虑提供一个代码示例,以便社区可以帮助你 – Entea

+0

还请检查以下链接:http:///www.imagemagick.org/discourse-server/viewtopic.php?t=23738和http://www.imagemagick.org/Usage/draw/#matte – 2016-04-21 18:54:00

回答

0

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

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

反正 - 你必须创建的检测逻辑,其(即)白像素是所述图像的一部分,并且其是背景的一部分。
我希望这至少能给你多一点知识。

+0

我正在考虑做你说的第一点要点。当我说图像是一只兔子时,我遇到了一个问题。耳朵之间的白色空间将成为背景,但如果它的毛发上有白色斑点,则不会是背景。 –

+0

我真的很喜欢你的第二个要点。我会对这个话题做更多的研究!非常感谢您的帮助! –

+0

@HunterZolomon总是允许将我的答案标记为最好的答案。 :D祝你好运_fights_ –

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 
     } 
    } 
} 

如果这并不能帮助您或您有任何其他问题,问我。

+0

我仍然不确定如何格式化我的代码时粘贴到文本框。我只想跳过背景计算。如果颜色与背景颜色相同,则不需要。这就是我遇到的麻烦。我知道如何从计算中忽略背景颜色,但它也包括不是背景的颜色(但与背景颜色相同)。 –

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); 
     } 
    } 
}