首先,我对此感到陌生并且还进行了编码。我提前道歉任何有误导性的事情。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