完成与去除图片浅色背景(PIL实现)同样的任务,实现方式为 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();
}
}
}