去除图片浅色背景(Java 实现)

完成与去除图片浅色背景(PIL实现)同样的任务,实现方式为 Java。不同的是,手写实现“加权法”灰度化,在灰度化的同时去除背景。

参考文章:《Java实现图像灰度化》

源码如下:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class ImageDemo {

    private static int colorToRGB(int alpha, int red, int green, int blue) {

        int newPixel = 0;
        newPixel += alpha;
        newPixel = newPixel << 8;
        newPixel += red;
        newPixel = newPixel << 8;
        newPixel += green;
        newPixel = newPixel << 8;
        newPixel += blue;

        return newPixel;

    }

    /**
     * 去除模版浅色背景
     *
     * @param inputPath 输入图片路径
     * @param outputPath 处理后图片的输出路径
     * @param outputFormat 输出格式(传入 ImageIO.write)
     * @param threshold 过滤阈值
     * @exception IOException if an error occurs during writing.
     */
    public static void convert(String inputPath, String outputPath, String outputFormat, int threshold) throws IOException{
        BufferedImage bufferedImage
                = ImageIO.read(new File(inputPath));
        BufferedImage grayImage =
                new BufferedImage(bufferedImage.getWidth(),
                        bufferedImage.getHeight(),
                        bufferedImage.getType());

        for (int i = 0; i < bufferedImage.getWidth(); i++) {
            for (int j = 0; j < bufferedImage.getHeight(); j++) {
                final int color = bufferedImage.getRGB(i, j);
                final int r = (color >> 16) & 0xff;
                final int g = (color >> 8) & 0xff;
                final int b = color & 0xff;
                int gray = (int) (0.3 * r + 0.59 * g + 0.11 * b);
                if (gray > threshold) {
                    gray = 255;
                }
                int newPixel = colorToRGB(255, gray, gray, gray);
                grayImage.setRGB(i, j, newPixel);
            }
        }
        File newFile = new File(outputPath);
        ImageIO.write(grayImage, outputFormat, newFile);
    }

    public static void main(String[] args) {
        try {
            convert("image/GettingStarted.png", "image/g1.png", "png", 175);
            convert("image/Balance.png", "image/b1.png", "png", 175);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

转换结果与 去除图片浅色背景(PIL实现) 一样,不赘述。