2016-04-21 173 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); 
     } 
    } 
}