KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > ImageTransform


1 import java.awt.*;
2 import java.awt.image.*;
3 import java.awt.event.*;
4 import java.applet.*;
5 import java.io.*;
6 import JSci.maths.wavelet.symmlet8.*;
7
8 /**
9 * This applet is meant to illustrate the FWT classes in JSci.
10 * It is both speedy and convenient for some
11 * intensive applications such as image processing.
12 *
13 * @author Daniel Lemire
14 */

15 public final class ImageTransform extends Applet {
16   final int W=256;
17   final FastSymmlet8 fwt=new FastSymmlet8();
18   final float[][] mY=new float[W][W];
19   final float[][] mI=new float[W][W];
20   final float[][] mQ=new float[W][W];
21   Image lena;
22   Image lenaTransformed;
23
24   public void init() {
25     System.err.println("(C) 1999 Daniel Lemire, Ph.D.");
26     setSize(2*W,W);
27     System.err.println("Loading image...");
28     MediaTracker mt=new MediaTracker(this);
29     Class JavaDoc thisclass=this.getClass();
30     InputStream is=thisclass.getResourceAsStream("lena.gif");
31     if(is!=null)
32       System.err.println("Image found...");
33     else
34       System.err.println("Image cannot be found!");
35     int b;
36     ByteArrayOutputStream bais=new ByteArrayOutputStream();
37     try {
38       while((b=is.read())!=-1) {
39         bais.write(b);
40       }
41     } catch(IOException ioe) {
42       ioe.printStackTrace();
43     }
44     System.err.println("Image read...");
45     lena=Toolkit.getDefaultToolkit().createImage(bais.toByteArray());
46     mt.addImage(lena,0,W,W);
47     try {
48       mt.waitForAll();
49     } catch (InterruptedException JavaDoc ie) {
50       ie.printStackTrace();
51     }
52     System.err.println("Image loaded...");
53     int[] pixels = new int[W * W];
54       PixelGrabber pg = new PixelGrabber(lena, 0, 0, W, W, pixels, 0, W);
55     try {
56     pg.grabPixels();
57     } catch (InterruptedException JavaDoc ie) {
58       ie.printStackTrace();
59     }
60     byte red,green,blue;
61     for(int k=0;k<W;k++) {
62       for(int l=0;l<W;l++) {
63         red = (byte)( ((pixels[k*W+l]>>16) & 0xFF) -128);
64                 green = (byte)( ((pixels[k*W+l]>>8) & 0xFF) - 128);
65                 blue = (byte)( (pixels[k*W+l] & 0xFF) - 128);
66         mY[k][l] = ( red*.299f+green*.587f+blue*.114f);
67       }
68     }
69         transform();
70         quantize();
71    final int two24 = twoPower(24);
72    final int two16 = twoPower(16);
73    final int two8 = twoPower(8);
74     for(int k=0;k<W;k++) {
75       for(int l=0;l<W;l++) {
76         pixels[k*W+l]=(int)mY[k][l]*two16 +(int)mY[k][l]*two8 + (int)mY[k][l] -two24;
77       }
78     }
79     MemoryImageSource topmis=new MemoryImageSource(W, W, pixels, 0, W);
80     lenaTransformed=createImage(topmis);
81     mt.addImage(lenaTransformed,1,W,W);
82     try {
83       mt.waitForAll();
84     } catch (InterruptedException JavaDoc ie) {
85       ie.printStackTrace();
86     }
87         this.setFont(new Font("Default",Font.BOLD,12));
88   }
89
90   private static int twoPower(int exp)
91     {
92        int result = 1;
93        for(int k = 0; k < exp; ++k)
94           result = 2*result;
95         return result;
96      }
97
98   public String JavaDoc getAppletInfo() {
99     return "This applet is meant to illustrate the FWT classes in JSci";
100   }
101
102   private void transform() {
103     transformColumns();
104     transformRows();
105   }
106   private void transformColumns() {
107         float[] ColumnVector=new float[W];
108         for(int col = 0; col <W; ++col) {
109                 for(int row = 0; row < W; ++row)
110                         ColumnVector[row] = mY[row][col];
111                 fwt.transform(ColumnVector);
112                 for(int row = 0; row < W; ++row)
113                         mY[row][col] = ColumnVector[row];
114         }
115   }
116   private void transformRows() {
117      for(int row = 0; row < W; ++row) {
118        fwt.transform(mY[row]);
119      }
120   }
121
122   private void quantize() {
123     float max=mY[0][0];
124     float min=mY[0][0];
125     for(int k=0;k<W;k++) {
126       for(int l=0;l<W;l++) {
127         max=Math.max(mY[k][l],max);
128         min=Math.min(mY[k][l],min);
129       }
130     }
131     for(int k=0;k<W;k++) {
132       for(int l=0;l<W;l++) {
133         mY[k][l]=Math.round((mY[k][l]-min)/(max-min)*255.0);
134       }
135     }
136   }
137
138   public void paint(Graphics g) {
139       FontMetrics fm=this.getFontMetrics(this.getFont());
140       int fontheight=fm.getHeight();
141     g.setColor(Color.white);
142     g.drawImage(lena,0,0,this);
143     g.drawImage(lenaTransformed,256,0,this);
144     g.drawString("Real time computation of the Fast Wavelet Transform in Java",10,W-4*fontheight);
145     g.drawString("using "+(int)(Math.log(W)/Math.log(2)-3)+" iterations and Symmlet8 wavelets.",10,W-3*fontheight);
146     g.drawString ("(Only the Y channel is shown.)",10,W-2*fontheight);
147     g.drawString("Notice how economical the FWT representation is!",10,W-fontheight);
148   }
149 }
150
151
152
Popular Tags