package cx.prutser.sudoku.ocr; import cx.prutser.sudoku.capture.CaptureUtils; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.MemoryImageSource; import java.awt.image.PixelGrabber; import java.util.List; /** * Implementation that applies Adaptive Thresholding to the input image before * passing it on. * * @author Erik van Zijst */ public class AdaptiveThresholdingExtractor implements TileExtractor { private final static int SIZE = 12; private final static int CONSTANT = 7; private final AdapThresh thresholder; private final TileExtractor extractor; public AdaptiveThresholdingExtractor(TileExtractor extractor) { this.extractor = extractor; this.thresholder = new AdapThresh(); } public List<BufferedImage> extractTiles(BufferedImage image) { int[] pixels = new int[image.getWidth() * image.getHeight()]; PixelGrabber grabber = new PixelGrabber(image, 0, 0, image.getWidth(), image.getHeight(), pixels, 0, image.getWidth()); try { grabber.grabPixels(); pixels = thresholder.mean_thresh(pixels, image.getWidth(), image.getHeight(), SIZE, CONSTANT); Toolkit toolkit = Toolkit.getDefaultToolkit(); BufferedImage processed = CaptureUtils.createBufferedImage( toolkit.createImage( new MemoryImageSource(image.getWidth(), image.getHeight(), pixels, 0, image.getWidth())), BufferedImage.TYPE_INT_RGB); return extractor.extractTiles(processed); } catch (InterruptedException e) { throw new RuntimeException("Interrupted while grabbing pixels."); } } }