图像裁剪,使用Java删除Image中不需要的白色部分。 我们如何使用Java删除不需要的Image部分?我有计划白色区域的图像,除了使用JAVA代码的有用的主图像之外,我想删除图像的未使用的白色部分。您可以在下面显示的图像中获得清晰的想法我需要使用Java代码执行此任务。
答案 0 :(得分:1)
这是一个非常简单的暴力方法示例。基本上,它会走动图像,直到颜色从所需的填充颜色变化
这非常低效。我曾考虑采用分而治之的方法,但我真的没有时间去充实它。
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
public class Test {
public static void main(String[] args) throws IOException {
BufferedImage img = ImageIO.read(new File("/Users/swhitehead/Downloads/47hb1.png"));
Rectangle bounds = getBounds(img, Color.WHITE);
System.out.println(bounds);
BufferedImage trimmed = img.getSubimage(bounds.x, bounds.y, bounds.width, bounds.height);
JOptionPane.showMessageDialog(null, new JLabel(new ImageIcon(trimmed)));
}
public static Rectangle getBounds(BufferedImage img, Color fillColor) {
int top = getYInset(img, 20, 0, 1, fillColor);
int bottom = getYInset(img, 20, img.getHeight() - 1, -1, fillColor);
int left = getXInset(img, 0, top, 1, fillColor);
int right = getXInset(img, img.getWidth() - 1, top, -1, fillColor);
return new Rectangle(left, top, right - left, bottom - top);
}
public static int getYInset(BufferedImage img, int x, int y, int step, Color fillColor) {
while (new Color(img.getRGB(x, y), true).equals(fillColor)) {
y += step;
}
return y;
}
public static int getXInset(BufferedImage img, int x, int y, int step, Color fillColor) {
while (new Color(img.getRGB(x, y), true).equals(fillColor)) {
x += step;
}
return x;
}
}
答案 1 :(得分:0)
您可以使用图像处理框架来更轻松地进行图像处理。
在下面的示例中,我使用了Marvin。我的方法:
<强>输入:强>
输出(board_cropped.png):
源代码:
import static marvin.MarvinPluginCollection.*;
import java.awt.Rectangle;
import marvin.image.MarvinImage;
import marvin.io.MarvinImageIO;
public class BoardSegmentation {
public BoardSegmentation() {
MarvinImage imageOriginal = MarvinImageIO.loadImage("./res/board.png");
MarvinImage image = imageOriginal.clone();
thresholding(image, 250);
Rectangle rect = getBoundingBox(image);
crop(imageOriginal, image, rect.x, rect.y, rect.width, rect.height);
MarvinImageIO.saveImage(image, "./res/board_cropped.png");
}
public Rectangle getBoundingBox(MarvinImage image) {
Rectangle r = new Rectangle();
r.x = -1; r.y = -1; r.width = -1; r.height = -1;
for(int y=0; y<image.getHeight(); y++) {
for(int x=0; x<image.getWidth(); x++) {
if(image.getIntColor(x, y) == 0xFF000000) {
if(r.x == -1 || x < r.x) { r.x = x; }
if(r.width == -1 || x > r.x + r.width) { r.width = x - r.x; }
if(r.y == -1 || x < r.y) { r.y = y; }
if(r.height == -1 || y > r.y + r.height) { r.height = y - r.y; }
}
}
}
return r;
}
public static void main(String[] args) {
new BoardSegmentation();
}
}