package Convolution; import javax.swing.*; import javax.swing.border.BevelBorder; import javax.swing.event.MouseInputListener; import java.awt.*; import java.awt.event.*; import java.util.Random; /** * Diese Klasse realisiert verschiedene Faltungsoperationen,wie * den Sobel-,Roberts-und LaPlace-Operator.Ausserdem besteht die * Moeglichkeit einen eigenen Faltungskern zu definieren.Das Eingangs- * bild kann beliebig mit gausschem Rauschen oder 'Salt and Pepper' versehen * werden. * Die Oberflaeche ist durch zwei Panels aufgebaut. Das erste ist das * Operationpanel,in dem die Faltungsoperationen und die Bilder ausge- * waehlt werden koennen. Das zweite Panel beinhaltet die Bilder selbst, * also Eingangs-und Ausgangsbild. * * @author Rene Iser, Behrang Karimibabak, Simon Winkelbach * */ public class ConvolutionApplet extends JApplet implements MouseInputListener{ protected iRPImage inputImage,outputImage; //Eingangs-und Ausgangsbild protected ImageWindow input,output; protected ConvolutionViewer viewer; //Panel zur Darstellung der Bilder protected JPanel operationPanel,messagePanel; protected JPanel[] toolMainPanel,toolSubPanel; protected JDialog pictureDialog,toolDialog; protected boolean sobel,roberts,laPlace,userDef; //Definiert welcher Operator aktiv ist protected JLabel sobelLabel; protected JLabel message1,message2,robertsLabel,laPlaceLabel,userDefLabel; protected JButton choosePicture,chooseTool; protected JButton convolve; //Start der eigens definierten Faltung protected JButton addGaus;//Hinzufuegen von Gausschem Rauschen protected JButton saltPepper;//Hinzufuegen von salt & Pepper protected JButton sobelButton,robertsButton,laPlaceButton,userDefButton; protected JButton[] pictureButtons; protected String[] tools={"Sobel","Roberts","LaPlace","User defined"}; protected int gausStrength; protected String plaf; protected ImageIcon dialogIcon; protected DialogImageProvider imgProv; protected Image[] dialogImg; protected String[] dialogImgNames; protected String imageToLoad; /** * Initialisierung der Oberflaeche.Standardoperator * ist der Sobeloperator. */ public void init() { sobel=true; roberts=false; laPlace=false; userDef=false; imgProv = new DialogImageProvider(); dialogImg = imgProv.getImages(); dialogImgNames = imgProv.getImageNames(); this.initializeButtons(); this.initializeLabels(); this.initializeDialog(); Image dialogImage = Toolkit.getDefaultToolkit().getImage(getClass().getResource("dialogIcon.gif")); dialogIcon=new ImageIcon(dialogImage); gausStrength=25; inputImage=new iRPImage(); inputImage.LoadImage(dialogImgNames[0]); outputImage=Sobel(inputImage); input=new ImageWindow(inputImage,10,20); output=new ImageWindow(outputImage,500,20); viewer=new ConvolutionViewer(input,output); messagePanel=new JPanel(); messagePanel.setPreferredSize(new Dimension(230,50)); messagePanel.setBorder(BorderFactory.createEtchedBorder()); messagePanel.add(message1); messagePanel.add(message2); Dimension d = new Dimension(this.getWidth(),70); operationPanel = new JPanel(); operationPanel.setLayout(new FlowLayout(FlowLayout.LEFT,10,10)); operationPanel.setPreferredSize(d); operationPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY)); operationPanel.add(choosePicture); operationPanel.add(chooseTool); operationPanel.add(convolve); operationPanel.add(addGaus); operationPanel.add(saltPepper); operationPanel.add(messagePanel); getContentPane().add("North",operationPanel); getContentPane().add(viewer); this.initializeActionListeners(); this.changeLookAndFeel(); addMouseListener(this); addMouseMotionListener(this); } /** * Initialisierung der Dialogboxen,welche aufgerufen werden, * wenn man das Bild oder das Tool wechselt. */ public void initializeDialog(){ pictureDialog=new JDialog(); 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;isum2){ B.SetPixel(c1, sum1); } else { B.SetPixel(c1,sum2); } } return B; } /** * Realisiert den LaPlace-Operator. * Bei einem 3*3 Operatorfenster * ABC * DEF * GHI * ist dieser definiert durch * GLaPlace=|B+D+H+F-4*E| * @param A das Eingangsbild */ protected iRPImage Laplace(iRPImage A){ int SizeX = A.GetSizeX(); int SizeY = A.GetSizeY(); iRPImage B = new iRPImage(SizeX, SizeY); int sum; for(int c1=0, c2=1, c3=3, c4 = SizeX, c5= SizeX+1,c6=SizeX+2, c7=SizeX*2, c8=(SizeX*2)+1, c9=(SizeX*2)+2 ; c1 < SizeX*(SizeY-2)-3 ; c1++,c2++,c3++,c4++,c5++,c6++,c7++,c8++,c9++) { sum = A.GetPixel(c2) + A.GetPixel(c4) + A.GetPixel(c8) + A.GetPixel(c6) - 4 * A.GetPixel(c5); if(sum < 0) sum = -(sum); B.SetPixel(c5, sum); } return B; } /** * Diese Methode faltet ein Eingangsbild A mit einem * selbst definiertem Faltungskern. Dieser ist in dem * Bild B kodiert. Bei einem 3*3 Operatorfenster haette B * dementsprechend 9 Pixel; * @param A das Eingangsbild * @param B der Faltungskern als Bild dargestellt */ protected iRPImage Convolve(iRPImage A, iRPImage B) { int a, newX, newY; int n, m; n = B.GetSizeX()/2; m = B.GetSizeY()/2; // iRPImage c wird erstellt iRPImage C = new iRPImage(); C.SetSize(A.GetSizeX(), A.GetSizeY()); for(int y = 0; y < A.GetSizeY() ; y++) { for(int x = 0; x < A.GetSizeX() ; x++){ a = A.GetPixel(x, y); for (int j=0; j < B.GetSizeY() ; j++) { for(int i=0; i < B.GetSizeX(); i++){ newX = x - n + i; newY = y - m + j; if( (newX > 0) && (newY > 0) && (newX < A.GetSizeX()) && (newY < A.GetSizeY()) ) C.SetPixel(newX, newY, (B.GetPixel(i,j) * a) + C.GetPixel(newX,newY)); else; } // j-Schleife } //i Schleife } // y-for zu ende } // x-for zu ende return C; } /** * Die Methode setzt abhaengig von der Mausposition * die Grauwerte und die Mauskoordinaten fuer die Anzeige * unterhalb des Bildes neu. */ public void mouseMoved(MouseEvent e) { int xPos=e.getX(); int yPos=e.getY(); int value; if(xPos>=10 && xPos<266 && yPos>=90 && yPos<346){ value=inputImage.GetPixel(xPos-10,yPos-90); input.updateMousePosition(xPos-10,yPos-90,value); } else if(xPos>=500 && xPos<756 && yPos>=90 && yPos<346){ value=outputImage.GetPixel(xPos-500,yPos-90); output.updateMousePosition(xPos-500,yPos-90,value); } repaint(); } public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub } public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub } public void mouseDragged(MouseEvent e) { // TODO Auto-generated method stub } }