diff --git a/build/classes/image2d/AutoBalance.class b/build/classes/image2d/AutoBalance.class new file mode 100644 index 0000000..d94f79c Binary files /dev/null and b/build/classes/image2d/AutoBalance.class differ diff --git a/build/classes/image2d/Closing.class b/build/classes/image2d/Closing.class index 6e7fe82..b3eb6e4 100644 Binary files a/build/classes/image2d/Closing.class and b/build/classes/image2d/Closing.class differ diff --git a/build/classes/image2d/Dilation.class b/build/classes/image2d/Dilation.class index 2526d05..5f78465 100644 Binary files a/build/classes/image2d/Dilation.class and b/build/classes/image2d/Dilation.class differ diff --git a/build/classes/image2d/EdgeDetector.class b/build/classes/image2d/EdgeDetector.class index 196d3b7..0e8abfe 100644 Binary files a/build/classes/image2d/EdgeDetector.class and b/build/classes/image2d/EdgeDetector.class differ diff --git a/build/classes/image2d/EdgeOperator.class b/build/classes/image2d/EdgeOperator.class index 3e7ec23..c070cbc 100644 Binary files a/build/classes/image2d/EdgeOperator.class and b/build/classes/image2d/EdgeOperator.class differ diff --git a/build/classes/image2d/Erosion.class b/build/classes/image2d/Erosion.class index 513b5d7..963a624 100644 Binary files a/build/classes/image2d/Erosion.class and b/build/classes/image2d/Erosion.class differ diff --git a/build/classes/image2d/Gaussian.class b/build/classes/image2d/Gaussian.class index 46d5c23..9d7347a 100644 Binary files a/build/classes/image2d/Gaussian.class and b/build/classes/image2d/Gaussian.class differ diff --git a/build/classes/image2d/Grayscale.class b/build/classes/image2d/Grayscale.class index 87d6179..52bea22 100644 Binary files a/build/classes/image2d/Grayscale.class and b/build/classes/image2d/Grayscale.class differ diff --git a/build/classes/image2d/Histogram.class b/build/classes/image2d/Histogram.class new file mode 100644 index 0000000..288d56a Binary files /dev/null and b/build/classes/image2d/Histogram.class differ diff --git a/build/classes/image2d/Image2D.class b/build/classes/image2d/Image2D.class index 66be6b0..806a3b6 100644 Binary files a/build/classes/image2d/Image2D.class and b/build/classes/image2d/Image2D.class differ diff --git a/build/classes/image2d/ImageReader.class b/build/classes/image2d/ImageReader.class index 0910fb0..3beb664 100644 Binary files a/build/classes/image2d/ImageReader.class and b/build/classes/image2d/ImageReader.class differ diff --git a/build/classes/image2d/Opening.class b/build/classes/image2d/Opening.class index 3c55121..6e6c014 100644 Binary files a/build/classes/image2d/Opening.class and b/build/classes/image2d/Opening.class differ diff --git a/build/classes/image2d/RGB.class b/build/classes/image2d/RGB.class index 95c53d8..222be37 100644 Binary files a/build/classes/image2d/RGB.class and b/build/classes/image2d/RGB.class differ diff --git a/build/classes/image2d/Threshold.class b/build/classes/image2d/Threshold.class index cd2292b..dca917a 100644 Binary files a/build/classes/image2d/Threshold.class and b/build/classes/image2d/Threshold.class differ diff --git a/src/image2d/AutoBalance.java b/src/image2d/AutoBalance.java new file mode 100644 index 0000000..9194325 --- /dev/null +++ b/src/image2d/AutoBalance.java @@ -0,0 +1,59 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package image2d; + +import java.awt.image.BufferedImage; + +/** + * + * @author pratchaya + */ +public class AutoBalance { + + public static int[] balancing(BufferedImage _image) { + int _histogram[] =Histogram.histogtam(_image); + int _factor[] = new int[256]; + _factor = new Unitys().randArray(_factor, 0); + int sum = 0; + float scale = (float) (255.0 / (_image.getWidth() * _image.getHeight())); + + for (int i = 0; i < _factor.length; i++) { + sum += _histogram[i]; + int value = + (int) (sum * scale); + if (value > 255) { + _factor[i] = 255; + } else { + _factor[i] = value; + } + } + return _factor; + + } + + public static BufferedImage apply(BufferedImage _image) { + int new_Histogram[] = balancing(_image); + BufferedImage output = new BufferedImage(_image.getWidth(), _image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); + int r, g, b, rgb; + for (int i = 0; i < _image.getWidth(); i++) { + for (int j = 0; j < _image.getHeight(); j++) { + int p = RGB.getRGBW(_image, i, j); + r = (p >> 16) & 0xff; + g = (p >> 8) & 0xff; + b = (p & 0xff); + + r = new_Histogram[r]; + g = new_Histogram[g]; + b = new_Histogram[b]; + + output.setRGB(i, j, (r << 16) | (g << 8) | (b)); + } + + } + + return output; + + } +} diff --git a/src/image2d/Closing.java b/src/image2d/Closing.java index ddb323a..f6c2a7c 100644 --- a/src/image2d/Closing.java +++ b/src/image2d/Closing.java @@ -5,48 +5,16 @@ package image2d; import java.awt.image.BufferedImage; -import java.util.ArrayList; /** * * @author pratchaya */ -public final class Closing extends Filter { - - int radius; - ArrayList seq = new ArrayList(); - int index = 0; - - @Override - public BufferedImage apply(BufferedImage image) { - runningFlag = true; - - for (index = 0; index < seq.size() && cancelFlag == false; index++) { - image = seq.get(index).apply(image); - } - - cancelFlag = false; - runningFlag = false; - - return image; - } - - public void append(Filter filter) { - seq.add(filter); - } - - /** - * re-write for value correctness - */ - @Override - public int getProgress() { - return (100 * index + seq.get(index).getProgress()) / seq.size(); - } - - public Closing(int radius) { - this.radius = radius; - this.append(new Dilation(radius)); - this.append(new Erosion(radius)); +public class Closing { + public static BufferedImage apply(BufferedImage _image, int r) { + _image = Dilation.apply(_image, r); + _image = Erosion.apply(_image, r); + return _image; } } diff --git a/src/image2d/Dilation.java b/src/image2d/Dilation.java index 4c2e183..6e8331c 100644 --- a/src/image2d/Dilation.java +++ b/src/image2d/Dilation.java @@ -10,47 +10,40 @@ * * @author pratchaya */ -public class Dilation extends Filter { +public class Dilation { - int radius; - - public Dilation(int radius) { - this.radius = radius; - } - - private int maxAround(BufferedImage image, int row, int col) { + private static int maxPixel(BufferedImage _image, int _w, int _h, int r) { int maxR = 0; int maxG = 0; int maxB = 0; - int radius2 = radius * radius; - for (int i = -radius; i <= radius; i++) { - for (int j = -radius; j <= radius; j++) { - if (i * i + j * j <= radius2) { - int c = new Unitys().getRGBExtended(image, row + i, col + j); + int radiusPow = r * r; + int _r = r/2; + for (int i = -_r; i < _r; i++) { + for (int j = -_r; j < _r; j++) { + if (i * i + j * j < radiusPow) { + int c = RGB.getRGBW(_image, _w + i, _h + j); maxR = Math.max(maxR, (c >> 16) & 0xFF); maxG = Math.max(maxG, (c >> 8) & 0xFF); maxB = Math.max(maxB, c & 0xFF); - } - } - } + } // end if + } // end j + } // end i return (maxR << 16) | (maxG << 8) | maxB; } - @Override - public BufferedImage apply(BufferedImage image) { - - int width = image.getWidth(); - int height = image.getHeight(); + public static BufferedImage apply(BufferedImage _image, int _radius) { - BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + int width = _image.getWidth(); + int height = _image.getHeight(); + int radius = _radius; + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); - for (int i = 0; i < width && cancelFlag == false; i++) { - progress = 100 * i / width; - for (int j = 0; j < height && cancelFlag == false; j++) { - img.setRGB(i, j, maxAround(image, i, j)); + for (int i = 0; i < width; i++) { + for (int j = 0; j < height; j++) { + image.setRGB(i, j, maxPixel(_image, i, j, radius)); } } - return img; + return image; } } diff --git a/src/image2d/EdgeDetector.java b/src/image2d/EdgeDetector.java index 20de526..622d6ae 100644 --- a/src/image2d/EdgeDetector.java +++ b/src/image2d/EdgeDetector.java @@ -15,14 +15,11 @@ public class EdgeDetector { public static BufferedImage findEdgeSobel(BufferedImage _image) { // get kernel horizontal - double horizontal[][] = new EdgeOperator().edgeHorizontal(); + double horizontal[][] = EdgeOperator.edgeHorizontal(); // get kernel vertical - double vertical[][] = new EdgeOperator().edgeVertical(); - // copy image form original - BufferedImage imageOutput = Unitys.copyImage(_image); + double vertical[][] = EdgeOperator.edgeVertical(); // get result - return new EdgeOperator().sobelOperation(_image, horizontal, vertical); + return EdgeOperator.sobelOperation(_image, horizontal, vertical); } - } diff --git a/src/image2d/EdgeOperator.java b/src/image2d/EdgeOperator.java index b0c5015..1654ff2 100644 --- a/src/image2d/EdgeOperator.java +++ b/src/image2d/EdgeOperator.java @@ -15,7 +15,7 @@ public class EdgeOperator { // ---------------------------- sobel -------------------------------------- // ** this template for sobel ** - public double[][] edgeHorizontal() { + public static double[][] edgeHorizontal() { double sobel[][] = { {-1, -2, -1}, @@ -26,7 +26,7 @@ public double[][] edgeHorizontal() { return sobel; } - public double[][] edgeVertical() { + public static double[][] edgeVertical() { double sobel[][] = { {-1, 0, 1}, {-2, 0, 2}, @@ -37,8 +37,8 @@ public double[][] edgeVertical() { } // ----------------------------- end sobel --------------------------------- - public BufferedImage sobelOperation(BufferedImage _image, double horizon[][], double vertical[][]) { - BufferedImage imageOutput = Unitys.copyImage(_image); // Set initial BufferedImage + public static BufferedImage sobelOperation(BufferedImage _image, double horizon[][], double vertical[][]) { + BufferedImage imageOutput = new BufferedImage(_image.getWidth(), _image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); // Set initial BufferedImage int kernelXY = horizon.length / 2; // calculate image @@ -50,7 +50,7 @@ public BufferedImage sobelOperation(BufferedImage _image, double horizon[][], do // horizontal for (int k = -(kernelXY); k < kernelXY + 1; k++) { for (int l = -(kernelXY); l < kernelXY + 1; l++) { - int p = RGB.doGetRGB(_image, i + k, j + l); + int p = RGB.getRGBW(_image, i + k, j + l); // calculate a RGB by chip bit r += ((p >> 16) & 0xff) * horizon[k + kernelXY][l + kernelXY]; @@ -66,7 +66,7 @@ public BufferedImage sobelOperation(BufferedImage _image, double horizon[][], do // vertical for (int k = -(kernelXY); k < kernelXY + 1; k++) { for (int l = -(kernelXY); l < kernelXY + 1; l++) { - int p = RGB.doGetRGB(_image, i + k, j + l); + int p = RGB.getRGBW(_image, i + k, j + l); // calculate a RGB by chip bit r += ((p >> 16) & 0xff) * vertical[k + kernelXY][l + kernelXY]; diff --git a/src/image2d/Erosion.java b/src/image2d/Erosion.java index f69bd86..b88e831 100644 --- a/src/image2d/Erosion.java +++ b/src/image2d/Erosion.java @@ -10,47 +10,41 @@ * * @author pratchaya */ -public class Erosion extends Filter { +public class Erosion { - int radius; - - public Erosion(int radius) { - this.radius = radius; - } - - private int minAround(BufferedImage image, int row, int col) { + private static int minPixel(BufferedImage _image, int _w, int _h, int r) { int minR = 255; int minG = 255; int minB = 255; - int radius2 = radius * radius; - for (int i = -radius; i <= radius; i++) { - for (int j = -radius; j <= radius; j++) { - if (i * i + j * j <= radius2) { - int c = new Unitys().getRGBExtended(image, row + i, col + j); + int radiusPow = r * r; + int _r = r/2; + for (int i = -_r; i < _r; i++) { + for (int j = -_r; j < _r; j++) { + if (i * i + j * j < radiusPow) { + int c = RGB.getRGBW(_image, _w + i, _h + j); minR = Math.min(minR, (c >> 16) & 0xFF); minG = Math.min(minG, (c >> 8) & 0xFF); - minB = Math.min(minB, c & 0xFF); - } - } - } + minB = Math.min(minB, c & 0xFF); + } // end if + } // end j + } // end i + return (minR << 16) | (minG << 8) | minB; } - @Override - public BufferedImage apply(BufferedImage image) { - - int width = image.getWidth(); - int height = image.getHeight(); + public static BufferedImage apply(BufferedImage _image, int _radius) { - BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); + int width = _image.getWidth(); + int height = _image.getHeight(); + int radius = _radius; + BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR); for (int i = 0; i < width; i++) { - progress = 100 * i / width; - for (int j = 0; j < height && cancelFlag == false; j++) { - img.setRGB(i, j, minAround(image, i, j)); + for (int j = 0; j < height; j++) { + image.setRGB(i, j, minPixel(_image, i, j, radius)); } } - return img; + return image; } } diff --git a/src/image2d/Filter.java b/src/image2d/Filter.java deleted file mode 100644 index 2295de0..0000000 --- a/src/image2d/Filter.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package image2d; - -import java.awt.image.BufferedImage; - -/** - * - * @author pratchaya - */ -public abstract class Filter { - - /** - * Apply an filter to an image. The result image will be allocated. - * @param image Original image - * @return Processed image - */ - public abstract BufferedImage apply(BufferedImage image); - - protected boolean cancelFlag = false; - - protected boolean runningFlag = false; - - protected int progress = 0; - - public final void cancel() { - if (runningFlag == true) { - cancelFlag = true; - } - } - - public int getProgress() { - return progress; - } - - public final boolean isRunning() { - return runningFlag; - } - -} diff --git a/src/image2d/FilterSequence.java b/src/image2d/FilterSequence.java deleted file mode 100644 index 275893c..0000000 --- a/src/image2d/FilterSequence.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * To change this template, choose Tools | Templates - * and open the template in the editor. - */ -package image2d; - -import java.awt.image.BufferedImage; -import java.util.ArrayList; - -/** - * - * @author pratchaya - */ -public class FilterSequence extends Filter { - - ArrayList seq = new ArrayList(); - int index = 0; - - public FilterSequence() { - // do nothing - } - - @Override - public BufferedImage apply(BufferedImage image) { - runningFlag = true; - - for (index = 0; index < seq.size() && cancelFlag == false; index++) { - image = seq.get(index).apply(image); - } - - cancelFlag = false; - runningFlag = false; - - return image; - } - - public void append(Filter filter) { - seq.add(filter); - } - - /** - * re-write for value correctness - */ - @Override - public int getProgress() { - return (100 * index + seq.get(index).getProgress()) / seq.size(); - } -} diff --git a/src/image2d/Gaussian.java b/src/image2d/Gaussian.java index c40b5f4..2472bf6 100644 --- a/src/image2d/Gaussian.java +++ b/src/image2d/Gaussian.java @@ -10,20 +10,11 @@ * * @author pratchaya */ -public class Gaussian extends Filter { - - double sigma = 0; - int size = 3; - - public Gaussian(double sigma, int size) { - this.sigma = sigma; - this.size = size; - } +public class Gaussian { public static double[][] kernel(int _size, double sigma) { int size = _size; - int _height = 5; double gaussian[][] = new double[size][size]; for (int j = 0; j < size; j++) { for (int i = 0; i < size; i++) { @@ -47,15 +38,14 @@ public static double kernel_sum(double[][] kernel) { return kernel_sum; } - @Override - public BufferedImage apply(BufferedImage _image) { + public static BufferedImage apply(BufferedImage _image, int size, double sigma) { - BufferedImage imageOutput = Unitys.copyImage(_image); // Set initial BufferedImage + BufferedImage imageOutput = new BufferedImage(_image.getWidth(), _image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); // Set initial BufferedImage + // Set initial BufferedImage int c = 0; double gaussian[][] = Gaussian.kernel(size, sigma); double agv = Gaussian.kernel_sum(gaussian); - System.out.println(agv); int wight = _image.getWidth(); // image wight int heigth = _image.getHeight(); // image hight int kernelSize = gaussian.length; // size kernel @@ -67,21 +57,18 @@ public BufferedImage apply(BufferedImage _image) { for (int j = 0; j < heigth; j++) { int r = 0, g = 0, b = 0; // store RGB - for (int k = -(kernelXY); k < kernelXY + 1; k++) { - for (int l = -(kernelXY); l < kernelXY + 1; l++) { - int p = RGB.doGetRGB(_image, i + k, j + l); - // calculate a RGB by chip bit - r += ((p >> 16) & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; - g += ((p >> 8) & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; - b += (p & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; - - } //end k - }//end j - r = (int) (r / agv); - g = (int) (g / agv); - b = (int) (b / agv); - int rgb = (((int)(r /agv) & 0xff) << 16) | (((int)(g/agv) & 0xff) << 8) | ((int)(b/agv) & 0xff); - + for (int k = -kernelXY; k <= kernelXY; k++) { + for (int l = -kernelXY; l <= kernelXY; l++) { + if (k * k + l * l < gaussian.length * gaussian.length) { + int p = RGB.getRGBW(_image, i + k, j + l); + // calculate a RGB by chip bit + r += ((p >> 16) & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; + g += ((p >> 8) & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; + b += (p & 0xFF) * gaussian[k + kernelXY][l + kernelXY]; + } + } //end l + }//end k + int rgb = ((int) (r / agv) << 16) | ((int) (g / agv) << 8) | ((int) (b / agv)); //set RGB revert to image imageOutput.setRGB(i, j, rgb); }// end i diff --git a/src/image2d/Grayscale.java b/src/image2d/Grayscale.java index 1b3d57f..d4d68cf 100644 --- a/src/image2d/Grayscale.java +++ b/src/image2d/Grayscale.java @@ -10,28 +10,23 @@ * * @author pratchaya */ -public class Grayscale extends Filter { +public class Grayscale { + + public static BufferedImage apply(BufferedImage _image) { - @Override - public BufferedImage apply(BufferedImage _image) { - runningFlag = true; BufferedImage imageOutput = Unitys.copyImage(_image); int grayscale; for (int i = 0; i < _image.getWidth(); i++) { for (int j = 0; j < _image.getHeight(); j++) { int rgb; - int p = RGB.doGetRGB(_image, i, j); + int p = RGB.getRGBW(_image, i, j); rgb = (int) ((((p >> 16) & 0xFF) * 0.2125) + (((p >> 8) & 0xFF) * 0.7154) + ((p & 0xFF) * 0.0721)); rgb = (rgb << 16) | (rgb << 8) | (rgb); - grayscale = rgb; //sum RGB - imageOutput.setRGB(i, j, grayscale); + imageOutput.setRGB(i, j, rgb); } } - cancelFlag = false; - runningFlag = false; - return imageOutput; } } diff --git a/src/image2d/Histogram.java b/src/image2d/Histogram.java new file mode 100644 index 0000000..af47dfa --- /dev/null +++ b/src/image2d/Histogram.java @@ -0,0 +1,29 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package image2d; + +import java.awt.image.BufferedImage; + +/** + * + * @author pratchaya + */ +public class Histogram { + + public static int[] histogtam(BufferedImage _image) { + int interval[] = new int[256]; + for (int i = 0; i < _image.getWidth(); i++) { + for (int j = 0; j < _image.getHeight(); j++) { + int p = RGB.getRGBW(_image, i, j); + int r = (p >> 16) & 0xff; + interval[r]++; + } + + } + return interval; + + } + +} diff --git a/src/image2d/Image2D.java b/src/image2d/Image2D.java index 4e0f07d..fb88f30 100644 --- a/src/image2d/Image2D.java +++ b/src/image2d/Image2D.java @@ -18,11 +18,12 @@ public Image2D() { Dimension dim = toolkit.getScreenSize(); String url = "images/wl2.jpg"; // this program have 4 images : wr.png ,sh.jpg , ca.jpg , icon.jpg ,r1,r2,r3,r4.jpg BufferedImage image = ImageReader.load_image(url); - image = new Gaussian(0.84089642, 7).apply(image); //.94089642 - image = new Grayscale().apply(image); - image = new Threshold().apply(image); - image = new Opening(2).apply(image); - //image = new Closing(7).apply(image); + image = Gaussian.apply(image, 7, 0.84089642); //.94089642 + image = Grayscale.apply(image); + // image = AutoBalance.apply(image); + image = Threshold.apply(image); + image = Opening.apply(image, 3); + image = Opening.apply(image, 3); image = EdgeDetector.findEdgeSobel(image); JFrame frame = new JFrame("Display Image"); @@ -34,11 +35,12 @@ public Image2D() { frame.setSize(image.getWidth() + 8, image.getHeight() + 34); frame.setLocation((int) image.getWidth() / dim.width + 455, (int) image.getHeight() / dim.height); frame.setVisible(true); - + } public static void main(String[] args) { Image2D i = new Image2D(); + } } diff --git a/src/image2d/ImageReader.java b/src/image2d/ImageReader.java index 13733bc..13f4838 100644 --- a/src/image2d/ImageReader.java +++ b/src/image2d/ImageReader.java @@ -24,8 +24,7 @@ public static BufferedImage load_image(String url) { // read file form BufferedImage image = ImageIO.read(new File(url)); if (!image.equals(null)) { - System.out.println("Load data at URL:" + url + " done."); - + } } catch (Exception e) { diff --git a/src/image2d/Opening.java b/src/image2d/Opening.java index bfa3856..d7c2c3b 100644 --- a/src/image2d/Opening.java +++ b/src/image2d/Opening.java @@ -5,48 +5,16 @@ package image2d; import java.awt.image.BufferedImage; -import java.util.ArrayList; /** * * @author pratchaya */ -public final class Opening extends Filter { - - int radius; - ArrayList seq = new ArrayList(); - int index = 0; - - @Override - public BufferedImage apply(BufferedImage image) { - runningFlag = true; - - for (index = 0; index < seq.size() && cancelFlag == false; index++) { - image = seq.get(index).apply(image); - } - - cancelFlag = false; - runningFlag = false; - - return image; - } - - public void append(Filter filter) { - seq.add(filter); - } - - /** - * re-write for value correctness - */ - @Override - public int getProgress() { - return (100 * index + seq.get(index).getProgress()) / seq.size(); - } - - public Opening(int radius) { - this.radius = radius; - this.append(new Erosion(radius)); - this.append(new Dilation(radius)); +public class Opening { + public static BufferedImage apply(BufferedImage _image, int r) { + _image = Erosion.apply(_image, r); + _image = Dilation.apply(_image, r); + return _image; } } diff --git a/src/image2d/RGB.java b/src/image2d/RGB.java index 494ceb1..90203af 100644 --- a/src/image2d/RGB.java +++ b/src/image2d/RGB.java @@ -8,11 +8,20 @@ public class RGB { - public static int doGetRGB(BufferedImage image, int i, int j) { + public static int getRGBW(BufferedImage image, int i, int j) { int width = image.getWidth(); int height = image.getHeight(); i = Math.max(0, Math.min(width - 1, i)); j = Math.max(0, Math.min(height - 1, j)); return image.getRGB(i, j); } + + + public static int getRGBH(BufferedImage image, int i, int j) { + int width = image.getWidth(); + int height = image.getHeight(); + j = Math.max(0, Math.min(width - 1, j)); + i = Math.max(0, Math.min(height - 1, i)); + return image.getRGB(i, j); + } } diff --git a/src/image2d/Threshold.java b/src/image2d/Threshold.java index 4850eff..80d7b20 100644 --- a/src/image2d/Threshold.java +++ b/src/image2d/Threshold.java @@ -6,37 +6,30 @@ import java.awt.Color; import java.awt.image.BufferedImage; -import java.util.ArrayList; /** * * @author pratchaya */ -public class Threshold extends Filter { +public class Threshold { - @Override - public BufferedImage apply(BufferedImage _image) { + public static BufferedImage apply(BufferedImage _image) { int _r, p, r, g, b; double threshold = otsuTreshold(_image); - BufferedImage imageOutput = Unitys.copyImage(_image); + BufferedImage imageOutput = new BufferedImage(_image.getWidth(), _image.getHeight(), BufferedImage.TYPE_3BYTE_BGR); // Set initial BufferedImage for (int i = 0; i < _image.getWidth(); i++) { for (int j = 0; j < _image.getHeight(); j++) { // Get pixels - r = RGB.doGetRGB(_image, i, j); + r = RGB.getRGBW(_image, i, j); r = ((r >> 16) & 0xff); - int alpha = new Color(_image.getRGB(i, j)).getAlpha(); + if (r > threshold) { p = 255; } else { p = 0; } - alpha = (alpha << 24); - r = (p << 16); - g = (p << 8); - b = (p); - - p = alpha + r + g + b; + p = (p << 16) | (p << 8) | (p); imageOutput.setRGB(i, j, p); } @@ -46,7 +39,7 @@ public BufferedImage apply(BufferedImage _image) { } public static int otsuTreshold(BufferedImage _image) { - int _histogram[] = histogtam(_image); + int _histogram[] = Histogram.histogtam(_image); int total = _image.getWidth() * _image.getHeight(); float sum = 0; @@ -79,22 +72,6 @@ public static int otsuTreshold(BufferedImage _image) { threshold = i; } } - System.out.println(threshold); return threshold; } - - public static int[] histogtam(BufferedImage _image) { - int interval[] = new int[256]; - for (int i = 0; i < _image.getWidth(); i++) { - for (int j = 0; j < _image.getHeight(); j++) { - int p = RGB.doGetRGB(_image, i, j); - int r = (p >> 16) & 0xff; - interval[r]++; - } - - } - - return interval; - - } }