package com.github.axet.lookup; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; 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 class Lookup { public static class NotFound extends RuntimeException { private static final long serialVersionUID = 5393563026702192412L; public NotFound() { super("NotFound"); } } // convert 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); return bufferedImage; } // filter static public BufferedImage edgeImageDouble(BufferedImage b) { // b = Lookup.filterResizeDoubleCanvas(b); b = Lookup.edge(b); b = Lookup.filterRemoveCanvas(b); return b; } static public BufferedImage edgeImageCrop(BufferedImage b) { b = filterDoubleCanvas(b); b = Lookup.filterRemoveCanvas(b); return b; } static public BufferedImage filterSimply(BufferedImage bi) { BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType()); float n = 1f / 25f; 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, n, n, n, n }); ConvolveOp op = new ConvolveOp(kernel); op.filter(bi, buff); return buff; } 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); g.dispose(); return resizedImage; } 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); g.dispose(); return resizedImage; } 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); g.dispose(); return resizedImage; } static public BufferedImage scalePower(BufferedImage bi, double s) { double m = 1 / 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)); } } return resizedImage; } 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); g.dispose(); return resizedImage; } 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); g.dispose(); return resizedImage; } 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); g.dispose(); return resizedImage; } static public BufferedImage filterRemoveCanvas(BufferedImage bi) { int x1 = bi.getWidth(); int x2 = 0; int y1 = bi.getHeight(); int y2 = 0; for (int x = 0; x < bi.getWidth(); x++) { for (int y = 0; y < bi.getHeight(); y++) { if ((bi.getRGB(x, y) & 0xffffff) != 0) { if (x1 > x) x1 = x; if (x2 < x) x2 = x; if (y1 > y) y1 = y; if (y2 < y) y2 = y; } } } int cx = x2 - x1; int cy = y2 - y1; 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); g.dispose(); return dest; } 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++) f[i] = n; Kernel kernel = new Kernel(blurKernel, blurKernel, f); ConvolveOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); op.filter(bi, buff); return buff; } static public BufferedImage filterGausBlur(BufferedImage bi, int blurKernel) { BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType()); GaussianFilter op = new GaussianFilter(blurKernel); op.filter(bi, buff); return buff; } static public BufferedImage filterBlur3(BufferedImage bi) { BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType()); float n = 1f / 9f; 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); op.filter(bi, buff); return buff; } static public BufferedImage filterBlur5(BufferedImage bi) { BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType()); float n = 1f / 25f; 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, n, n, n, n }); ConvolveOp op = new ConvolveOp(kernel); op.filter(bi, buff); return buff; } static public BufferedImage filterBlur8(BufferedImage bi) { BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType()); float n = 1f / 64f; 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); op.filter(bi, buff); return buff; } static public BufferedImage filterBlur10(BufferedImage bi) { BufferedImage buff = new BufferedImage(bi.getWidth(), bi.getHeight(), bi.getType()); float n = 1f / 100f; 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); op.filter(bi, buff); return buff; } 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); op.filter(bi, out); return out; } 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); detector.process(); return detector.getEdgesImage(); } }