首先,我對此感到陌生並且還進行了編碼。我提前道歉任何有誤導性的事情。Java-如何從圖像中移除背景顏色
我目前正在編寫一個使用圖像作爲輸入的Java程序。我目前正在掃描每個像素的圖像的寬度和高度,將HSB保存在一個數組中,然後輸出圖像中每種顏色的百分比。我現在想從這個計算中省略背景。首先讓我們說背景是白色的。圖像中也有不在背景中的像素,但它們是白色的。
謝謝,
首先,我對此感到陌生並且還進行了編碼。我提前道歉任何有誤導性的事情。Java-如何從圖像中移除背景顏色
我目前正在編寫一個使用圖像作爲輸入的Java程序。我目前正在掃描每個像素的圖像的寬度和高度,將HSB保存在一個數組中,然後輸出圖像中每種顏色的百分比。我現在想從這個計算中省略背景。首先讓我們說背景是白色的。圖像中也有不在背景中的像素,但它們是白色的。
謝謝,
哦,這不像你希望的那麼簡單。
您不能簡單地檢測背景是什麼以及像素的像素是什麼。這篇文章看看如何去除圖像的一個顏色層。 但檢測是否白色像素是背景的一部分或已經是圖像?
有多種可能的方式:
反正 - 你必須創建的檢測邏輯,其(即)白像素是所述圖像的一部分,並且其是背景的一部分。
我希望這至少能給你多一點知識。
我正在考慮做你說的第一點要點。當我說圖像是一隻兔子時,我遇到了一個問題。耳朵之間的白色空間將成爲背景,但如果它的毛髮上有白色斑點,則不會是背景。 –
我真的很喜歡你的第二個要點。我會對這個話題做更多的研究!非常感謝您的幫助! –
@HunterZolomon總是允許將我的答案標記爲最好的答案。 :D祝你好運_fights_ –
我不確定你的意思。沒有代碼,所以我只能給你一個例子。根據我所理解的,當顏色與背景相同時,您希望跳過計算。這很簡單。你可以做這樣的事情:
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
}
}
}
如果這並不能幫助您或您有任何其他問題,問我。
我仍然不確定如何格式化我的代碼時粘貼到文本框。我只想跳過背景計算。如果顏色與背景顏色相同,則不需要。這就是我遇到的麻煩。我知道如何從計算中忽略背景顏色,但它也包括不是背景的顏色(但與背景顏色相同)。 –
以下是完整工作代碼的示例。
您可以添加一個光標來選擇顏色和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);
}
}
}
考慮[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
請考慮提供一個代碼示例,以便社區可以幫助你 – Entea
還請檢查以下鏈接:http:///www.imagemagick.org/discourse-server/viewtopic.php?t=23738和http://www.imagemagick.org/Usage/draw/#matte – 2016-04-21 18:54:00