package com.github.axet.lookup;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorConvertOp;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;
import com.github.axet.lookup.proc.CannyEdgeDetector;
public static class NotFound extends RuntimeException {
private static final long serialVersionUID = 5393563026702192412L;
public BufferedImage convert(Image image) {
BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null),
BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = bufferedImage.createGraphics();
g2.drawImage(image, null, null);
static public BufferedImage edgeImageDouble(BufferedImage b) {
// b = Lookup.filterResizeDoubleCanvas(b);
b = Lookup.filterRemoveCanvas(b);
static public BufferedImage edgeImageCrop(BufferedImage b) {
b = filterDoubleCanvas(b);
b = Lookup.filterRemoveCanvas(b);
static public BufferedImage filterSimply(BufferedImage bi) {
BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType());
Kernel kernel = new Kernel(5, 5, new float[] { n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n,
ConvolveOp op = new ConvolveOp(kernel);
public BufferedImage filterResize(BufferedImage bi) {
int cx = bi.getWidth() / 7;
int cy = bi.getHeight() / 7;
BufferedImage resizedImage = new BufferedImage(cx, cy, bi.getType());
Graphics2D g = resizedImage.createGraphics();
g.drawImage(bi, 0, 0, cx, cy, null);
static public BufferedImage filterResizeDouble(BufferedImage bi) {
int cx = bi.getWidth() * 4;
int cy = bi.getHeight() * 4;
BufferedImage resizedImage = new BufferedImage(cx, cy, bi.getType());
Graphics2D g = resizedImage.createGraphics();
g.drawImage(bi, 0, 0, cx, cy, null);
static public BufferedImage scale(BufferedImage bi, double s, int blurKernel) {
bi = filterGausBlur(bi, blurKernel);
int cx = (int) (bi.getWidth() * s);
int cy = (int) (bi.getHeight() * s);
Image src = bi.getScaledInstance(cx, cy, Image.SCALE_SMOOTH);
BufferedImage resizedImage = new BufferedImage(cx, cy, bi.getType());
Graphics2D g = resizedImage.createGraphics();
g.drawImage(src, 0, 0, cx, cy, null);
static public BufferedImage scalePower(BufferedImage bi, double s) {
int cx = (int) (bi.getWidth() / m) + 1;
int cy = (int) (bi.getHeight() / m) + 1;
BufferedImage resizedImage = new BufferedImage(cx, cy, bi.getType());
for (int x = 0; x < bi.getWidth(); x += m) {
for (int y = 0; y < bi.getHeight(); y += m) {
resizedImage.setRGB((int) (x / m), (int) (y / m), bi.getRGB(x, y));
static public BufferedImage filterDoubleCanvas(BufferedImage bi) {
int cx = bi.getWidth() * 2;
int cy = bi.getHeight() * 2;
BufferedImage resizedImage = new BufferedImage(cx, cy, bi.getType());
Graphics g = resizedImage.getGraphics();
g.drawImage(bi, cx / 4, cy / 4, bi.getWidth(), bi.getHeight(), null);
static public BufferedImage filterRemoveDoubleCanvas(BufferedImage bi) {
int cx = bi.getWidth() / 2;
int cy = bi.getHeight() / 2;
BufferedImage resizedImage = new BufferedImage(cx, cy, bi.getType());
Graphics2D g = resizedImage.createGraphics();
g.drawImage(bi, 0, 0, cx, cy, cx / 2, cy / 2, cx / 2 + cx, cy / 2 + cy, null);
static public BufferedImage filterRemoveBorder(BufferedImage bi, int border) {
int cx = bi.getWidth() - border * 2;
int cy = bi.getHeight() - border * 2;
BufferedImage resizedImage = new BufferedImage(cx, cy, bi.getType());
Graphics2D g = resizedImage.createGraphics();
g.drawImage(bi, 0, 0, cx, cy, border, border, border + cx, border + cy, null);
static public BufferedImage filterRemoveCanvas(BufferedImage bi) {
for (int x = 0; x < bi.getWidth(); x++) {
for (int y = 0; y < bi.getHeight(); y++) {
if ((bi.getRGB(x, y) & 0xffffff) != 0) {
BufferedImage dest = new BufferedImage(cx, cy, bi.getType());
Graphics g = dest.getGraphics();
g.drawImage(bi, 0, 0, (int) dest.getWidth(), (int) dest.getHeight(), x1, y1, x1 + dest.getWidth(),
y1 + dest.getHeight(), null);
static public BufferedImage filterBlur(BufferedImage bi, int blurKernel) {
BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType());
float[] f = new float[blurKernel * blurKernel];
float n = 1 / (float) f.length;
for (int i = 0; i < f.length; i++)
Kernel kernel = new Kernel(blurKernel, blurKernel, f);
ConvolveOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
static public BufferedImage filterGausBlur(BufferedImage bi, int blurKernel) {
BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType());
GaussianFilter op = new GaussianFilter(blurKernel);
static public BufferedImage filterBlur3(BufferedImage bi) {
BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType());
Kernel kernel = new Kernel(3, 3, new float[] { n, n, n, n, n, n, n, n, n });
ConvolveOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
static public BufferedImage filterBlur5(BufferedImage bi) {
BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType());
Kernel kernel = new Kernel(5, 5, new float[] { n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n,
ConvolveOp op = new ConvolveOp(kernel);
static public BufferedImage filterBlur8(BufferedImage bi) {
BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType());
Kernel kernel = new Kernel(8, 8, new float[] { n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n,
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n,
n, n, n, n, n, n, n, n, n, });
ConvolveOp op = new ConvolveOp(kernel);
static public BufferedImage filterBlur10(BufferedImage bi) {
BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType());
Kernel kernel = new Kernel(10, 10, new float[] { n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n,
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n,
n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n,
n, n, n, n, n, n, n, n, n, n, n });
ConvolveOp op = new ConvolveOp(kernel);
static public BufferedImage toGray(BufferedImage bi) {
BufferedImage out = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
ColorConvertOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
static public BufferedImage edge(BufferedImage bi) {
CannyEdgeDetector detector = new CannyEdgeDetector();
detector.setLowThreshold(3f);
detector.setHighThreshold(3f);
detector.setGaussianKernelWidth(2);
detector.setGaussianKernelRadius(1f);
detector.setSourceImage(bi);
return detector.getEdgesImage();