package MedianAveraging; import javax.swing.*; import javax.swing.border.BevelBorder; import javax.swing.event.*; import java.awt.*; import java.awt.event.*; import java.util.Arrays; import java.util.Random; /** * Dieses Applet zeigt den Median-und Averagefilter bei Fotos. Zur Auswahl * stehen verschiedene Bilder und Filtergroessen. Ausserdem kann gaussches * Rauschen hinzugefuegt werden,bzw. das Eingangsbild kann gesalzen werden. * Beim Medianfilter werden p Elemente innerhalb eines lokalen Operator- * fensters der Groesse nach geordnet.Das Ausgangsbildelement ist der * (p+1)/2 groesste Wert der Reihe.Beim Averaging wird der Durchschnittswert * genommen. * * * @author Rene Iser, Behrang Karmimibabak, Simon Winkelbach * */ public class MedianAndAveraging extends JApplet implements MouseInputListener { protected JPanel operationPanel,messagePanel; protected Dialog pictureDialog; protected filterViewer viewer; protected iRPImage inputImage,MedianImage,AveragingImage; protected zoomediRPImage zoomedMedianImage,zoomedAveragingImage; protected ImageWindow input,median,averaging,zoomedMedian,zoomedAveraging; protected JButton addGaus,addSalt,choosePicture,chooseMask; protected JButton[] pictureButtons; protected boolean mouseOverMedian=false,mouseOverInput=false,mouseOverAverage=false; protected int sizeOfWindow=5; protected int gausStrength=25; protected final String[] pictures={"Face","Fonts","Boxes"}; protected final String[] mask={"3x3", "5x5", "7x7", "9x9"}; protected String plaf; protected ImageIcon dialogIcon; protected JLabel message1,message2; protected DialogImageProvider imgProv; protected Image[] dialogImg; protected String[] dialogImgNames; protected String imageToLoad; public void init() { Image dialogImage = Toolkit.getDefaultToolkit().getImage(getClass().getResource("dialogIcon.gif")); dialogIcon=new ImageIcon(dialogImage); Dimension d = new Dimension(240,120); operationPanel = new JPanel(); operationPanel.setLayout(new FlowLayout(FlowLayout.LEFT,10,10)); operationPanel.setPreferredSize(d); operationPanel.setBorder(BorderFactory.createLineBorder(Color.GRAY)); imgProv = new DialogImageProvider(); dialogImg = imgProv.getImages(); dialogImgNames = imgProv.getImageNames(); this.initializeImages(); this.initializeButtons(); this.initializeDialog(); message1 = new JLabel("Select filter size or add some"); message2 = new JLabel(" noise to the input image"); messagePanel=new JPanel(); messagePanel.setPreferredSize(new Dimension(220,50)); messagePanel.setBorder(BorderFactory.createEtchedBorder()); //messagePanel.setLayout(new FlowLayout(FlowLayout.LEFT,3,3)); messagePanel.add(message1); messagePanel.add(message2); operationPanel.add(choosePicture); operationPanel.add(chooseMask); operationPanel.add(addGaus); operationPanel.add(addSalt); operationPanel.add(messagePanel); viewer= new filterViewer(input,median,averaging,zoomedMedianImage,zoomedAveragingImage); viewer.setLayout(new FlowLayout(FlowLayout.LEFT,10,15)); viewer.add(operationPanel); //getContentPane().add("North",operationPanel); getContentPane().add(viewer); this.initializeActionListeners(); this.changeLookAndFeel(); addMouseListener(this); addMouseMotionListener(this); } /** * Initialisierung der Dialogbox,welche aufgerufen wird, * wenn man das Bild wechselt. */ public void initializeDialog(){ 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;i4) && (x<(inputImage.GetSizeX()-4)) && (y>4) && (y<(inputImage.GetSizeY()-4))) { int[][] values = new int[10][10]; int[][] avvalues = new int[10][10]; for(int i = -4; i<=4; i++) { for(int j=-4; j<=4; j++) { values[i+4][j+4] = MedianImage.GetPixel(x+i, y+j); avvalues[i+4][j+4] = AveragingImage.GetPixel(x+i,y+j); //System.out.println(values[i+4][j+4]); for(int k=(i+4)*10 ; k <(i+6)*10 ; k++)//for(int k = ((i+2)*10); k<(((i+3)*10)+50);k++) { for(int l=(j+4)*10 ; l <(j+6)*10 ; l++)//for(int l = ((j+2)*10); l<(((j+3)*10)+50); l++) { zoomedMedianImage.SetPixel(k,l,values[i+4][j+4]); zoomedAveragingImage.SetPixel(k,l,avvalues[i+4][j+4]); } } } } } } /** * Gibt 'true' zurueck,falls die Maus ueber dem Eingangsbild * ist,sonst 'false'. * @param x * @param y */ public boolean mouseOverInputImage(int x,int y){ if(x>=10 && x<266 && y>=180 && y<180+inputImage.sizeY) return true; else return false; } /** * Gibt 'true' zurueck,falls die Maus ueber dem median- * gefilteretem Bild ist,sonst 'false'. * @param x * @param y */ public boolean mouseOverMedianImage(int x,int y){ if(x>=460 && x<716 && y>=20 && y<20+MedianImage.sizeY) return true; else return false; } /** * Gibt 'true' zurueck,falls die Maus ueber dem average- * gefilteretem Bild ist,sonst 'false'. * @param x * @param y */ public boolean mouseOverAverageImage(int x,int y){ if(x>=460 && x<716 && y>=320 && y<320+AveragingImage.sizeY) return true; else return false; } /** * Befindet sich die Maus ueber dem Median-oder Averagebild,so * wird das gezoomte Bild an der (x,y)-Position der Maus neu berechnet. * Desweiteren wird der Grauwert,sowie (x,y)-Position auf der Oberflaeche * mit ausgegeben. */ public void mouseMoved(MouseEvent e) { int xPos=e.getX(); int yPos=e.getY(); int value; mouseOverInput=mouseOverInputImage(xPos,yPos); mouseOverMedian=mouseOverMedianImage(xPos,yPos); mouseOverAverage=mouseOverAverageImage(xPos,yPos); if(mouseOverInput){ value=inputImage.GetPixel(xPos-10,yPos-180); input.updateMousePosition(xPos-10,yPos-180,value); repaint(); } if(mouseOverMedian){ value=MedianImage.GetPixel(xPos-460,yPos-20); median.updateMousePosition(xPos-460,yPos-20,value); this.ChangeZoomPics(xPos-460,yPos-20); repaint(); } if(mouseOverAverage){ value=AveragingImage.GetPixel(xPos-460,yPos-320); averaging.updateMousePosition(xPos-460,yPos-320,value); this.ChangeZoomPics(xPos-460,yPos-320); repaint(); } } public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public void mouseDragged(MouseEvent e) {} }