package HNF; import java.awt.Cursor; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import javax.swing.*; import javax.swing.border.BevelBorder; import javax.swing.event.*; /** * Dieses Applet veranschaulicht die Houghtransformation in * Hessischer Normalform. Es besteht die Moeglichkeit zur Auswahl * verschiedener Bilder,sowie eines frei-Hand-Modus. Ausserdem kann * eine vorher ausgewaehlte Anzahl von Maxima im Houghraum zurueck- * transformiert werden. * Bei der Houghtransformation in HNF wird von der Formel * x*sin(theta)+ y*cos(theta) ausgegangen. Soll also ein Punkt (x,y) * im Bildraum transformiert werden,so wird dieser auf eine Sinus- * foermige Kurve im Houghraum abgebildet(0<=theta<=360).Umgekehrt liegt * ein Punkt im Houghraum auf einer Geraden im Bildraum. Wird also ein * Punkt(theta,r) zuruecktransformiert,entsteht eine Gerade. * Wird die Maus ueber das Eingangsbild bewegt,so wird der Punkt gleich * transformiert und als rote Kurve im Houghraum angezeigt. * Befindet sich umgekehrt die Maus ueber dem Houghraum,wird die korres- * pondierende Gerade gruen im Bildraum angezeigt. * * @author Rene Iser, Behrang Karimibabak, Simon Winkelbach * */ public class GeneralHoughTransformation extends JApplet implements MouseInputListener { protected iRPImage inputImage,outputImage,inputCopy; protected ImageWindow input,output; protected JPanel operationPanel,dialogPanel,messagePanel; protected JDialog pictureDialog; protected GeneralHoughViewer viewer; protected JButton reset; protected JButton calculateMax,choosePicture,shapeButton; protected JButton pointButton,triangelButton,chaosButton,emptyButton; protected JButton[] pictureButtons; protected JLabel message1,message2; protected int picSize=256; protected double[][] maxArray=new double[10][2]; protected int[][] maxPosArray=new int[10][2]; protected final int xFromLeft=20; protected final int yFromTop=20; protected final int betweenThePics=10; protected int rangeofTheta,rMax,numberOfMax; protected boolean empty=true,copyInput=true,findMax=false,updateMaxCoordinates=false; protected final int ITresh=0; protected String[] pictures={"shape","points","triangel","caos","Empty"}; protected String[] max={"1","2","3","4","5","6","7","8","9"}; protected ImageIcon dialogIcon; protected String plaf,imageToLoad; protected DialogImageProvider imgProv; protected Image[] dialogImg; protected String[] dialogImgNames; public void init() { numberOfMax=1; Image dialogImage = Toolkit.getDefaultToolkit().getImage(getClass().getResource("dialogIcon.gif")); dialogIcon=new ImageIcon(dialogImage); imgProv = new DialogImageProvider(); dialogImg = imgProv.getImages(); dialogImgNames = imgProv.getImageNames(); this.initializeImages(); rMax=(int)Math.sqrt(inputImage.sizeX/2*inputImage.sizeX/2+inputImage.sizeY/2*inputImage.sizeY/2); viewer = new GeneralHoughViewer(input,output); this.initializeButtons(); this.initializeLabels(); pictureButtons=new JButton[dialogImg.length]; String buttonName; /* *Hier werden die Buttons zur Bildauswahl initialisiert. *In 'buttonName' wird der Name des zu ladenen Bildes gespeichert. */ for(int i=0;i0){ for (int k=x-10;k<=x+10;k++){ for(int j=y-10;j<=y+10;j++){ xPos=k;yPos=j; if(k<0)xPos=xPos+sizeX; else if(k>=sizeX)xPos=xPos%sizeX; if(j<0) yPos=yPos+sizeY; else if(j>=sizeY)yPos=yPos%sizeY; Max.SetPixel(xPos,yPos,0); } } r = (y-rMax)*-1; theta = Math.toRadians(x); maxArray[i][0]=theta; maxArray[i][1]=r; } } viewer.setMaxArray(maxArray); viewer.setMaxPosArray(maxPosArray); repaint(); } /** * Methode zur Houghtransformation in Hessischer Normalform * @param T Das zu transformierende Bild. */ public iRPImage GeneralTransform(iRPImage T) { int sizeX = T.GetSizeX(); int sizeY = T.GetSizeY(); int r; int thetaMax; int thetaMin; double theta; rMax = (int)(Math.sqrt((sizeX/2*sizeX/2) +(sizeY/2*sizeY/2)));///2); thetaMin = 0; thetaMax = 360; rangeofTheta = 360; iRPImage R = new iRPImage(rangeofTheta+1,(rMax+1)); for(int x=0; x ITresh) { for(int t=0; trMax)) { R.SetPixel(t,r,R.GetPixel(t,r)+1); } } } } } return R; } /** * Gibt 'true' zurueck,falls die Maus ueber dem Eingangsbild * ist,sonst 'false'. * @param x * @param y */ public boolean mouseOverInput(int x,int y){ if(x>=20 && x<276 && y>=80 && y<336) return true; else return false; } /** * Gibt 'true' zurueck,falls die Maus ueber dem Ausgangsbild * ist,sonst 'false'. * @param x * @param y */ public boolean mouseOverOutput(int x,int y){ if(x>=326 && x<326+outputImage.sizeX && y>=80 && y<80+outputImage.sizeY) return true; else return false; } /** * Die Methode setzt abhaengig von der Mausposition * die Grauwerte und die Mauskoordinaten fuer die Anzeige * unterhalb des Bildes neu. Die Koordinaten werden * dem viewer auch zur Hin-bzw. zur Ruecktransformation * uebergeben. */ public void mouseMoved(MouseEvent e) { int xPos=e.getX(); int yPos=e.getY(); int value; if(viewer.transform==true){ viewer.setTransform(false); repaint(); } if(viewer.backTransform==true){ viewer.setBackTransform(false); repaint(); } if(mouseOverInput(xPos,yPos)){ setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); value=inputImage.GetPixel(xPos-20,yPos-80); input.updateMousePosition(xPos-20,yPos-80,value); viewer.setTransform(true); viewer.setBackTransform(false); viewer.setTransformCoordinates(xPos-20,yPos-80); repaint(); } else if(mouseOverOutput(xPos,yPos)){ setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR)); int r; double theta; viewer.setTransform(false); viewer.setBackTransform(true); xPos=xPos-326; yPos=yPos-80; r=(yPos-rMax)*-1; theta=Math.toRadians(xPos); viewer.setBackTransformCoordinates(r,theta); value=outputImage.GetPixel(xPos,yPos); output.updateMousePosition(xPos,yPos,value); repaint(); } else setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /** * Ist die Maus ueber dem Eingangsbild und ist * empty gleich 'true' wird der Punkt transformiert. */ public void mousePressed(MouseEvent e) { int xPos=e.getX(); int yPos=e.getY(); if(mouseOverInput(xPos,yPos) && empty){ viewer.setTransform(false); inputImage.SetPixel(xPos-20,yPos-80,255); outputImage=GeneralTransform(inputImage); output.changeImage(outputImage); repaint(); } } /** * Ist der frei-Hand-Modus aktiviert(empty==true) * so wird der Punkt in den Houghraum transformiert,wenn die * Maus ueber dem Eingangsbild ist. */ public void mouseDragged(MouseEvent e) { int xPos=e.getX(); int yPos=e.getY(); if(mouseOverInput(xPos,yPos) && empty){ viewer.setTransform(false); inputImage.SetPixel(xPos-20,yPos-80,255); outputImage=GeneralTransform(inputImage); output.changeImage(outputImage); repaint(); } } /** * Die Anzeige der Maxima wird im viewer * deaktiviert. */ public void mouseClicked(MouseEvent e) { viewer.setFindMax(false); } public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} }