图像裁剪,使用Java删除Image中不需要的白色部分

时间:2018-02-08 07:30:42

标签: java image image-processing

图像裁剪,使用Java删除Image中不需要的白色部分。 我们如何使用Java删除不需要的Image部分?我有计划白色区域的图像,除了使用JAVA代码的有用的主图像之外,我想删除图像的未使用的白色部分。您可以在下面显示的图像中获得清晰的想法我需要使用Java代码执行此任务。

Click here to view image

2 个答案:

答案 0 :(得分:1)

这是一个非常简单的暴力方法示例。基本上,它会走动图像,直到颜色从所需的填充颜色变化

Areas

这非常低效。我曾考虑采用分而治之的方法,但我真的没有时间去充实它。

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。我的方法:

  1. 使用灰度阈值将白色像素与图像的其余部分分开。
  2. 找到黑色部分的边界框
  3. 使用上一步中检测到的片段裁剪原始图像。
  4. <强>输入:

    enter image description here

    输出(board_cropped.png):

    enter image description here

    源代码:

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