Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 11.88 KB | None | 0 0
  1. import javax.swing.*;
  2. import javax.swing.border.TitledBorder;
  3. import javax.swing.event.ChangeEvent;
  4. import javax.swing.event.ChangeListener;
  5. import javax.swing.filechooser.FileNameExtensionFilter;
  6. import java.awt.event.*;
  7. import java.awt.*;
  8. import java.io.File;
  9. import java.util.Arrays;
  10.  
  11. public class Histo extends JPanel {
  12.    
  13.     // some constants
  14.     //
  15.     private static final long serialVersionUID = 1L;
  16.     private static final int histWidth = 256;
  17.     private static final int histHeight = 272;
  18.     private static final int layoutBorder = 10;
  19.     private static final int maxImageWidth = 600;
  20.     private static final int maxImageHeight = 600;
  21.    
  22.     // main frame
  23.     //
  24.     private static JFrame frame;
  25.    
  26.     // layout items
  27.     //
  28.     private ImageView imgView;                  // image view
  29.     private ImageView histoView;                // histogram view
  30.     private JLabel[]  label = new JLabel[12];   // text display
  31.    
  32.     // Image TitledBorder
  33.     //
  34.     private TitledBorder imgBorder;
  35.    
  36.     // Originalbild
  37.     //
  38.     private ImageView imgViewOriginal;
  39.    
  40.     // Dateiname
  41.     //
  42.     private String filename;
  43.    
  44.     // Slider
  45.     //
  46.     private JSlider brightnessSlider;
  47.     private JSlider contrastSlider;
  48.     private JSlider saturationSlider;
  49.    
  50.     // statistische Werte
  51.     //
  52.     private int minValue = 0;
  53.     private int maxValue = 0;
  54.     private double avgValue = 0.0; // Mittelwert, Durchschnitt
  55.     private int mdnValue = 0; // Median
  56.     private double varValue = 0.0; // Varianz
  57.     private double entValue = 0.0; // Entropie
  58.    
  59.     public Histo() {
  60.         super(new BorderLayout(layoutBorder, layoutBorder));
  61.        
  62.         // load the default image
  63.         File input = new File("mountains.png");
  64.         filename = input.getName();
  65.        
  66.         if(!input.canRead()) input = openFile(); // file not found, choose another image
  67.        
  68.         imgView = new ImageView(input);
  69.         imgView.setMaxSize(new Dimension(maxImageWidth, maxImageHeight));
  70.        
  71.         // save original image
  72.         imgViewOriginal = new ImageView(input);
  73.        
  74.         // create an empty histogram image
  75.         histoView = new ImageView(histWidth, histHeight);
  76.        
  77.         // load image button
  78.         JButton load = new JButton("Open Image");
  79.         load.addActionListener(new ActionListener() {
  80.             public void actionPerformed(ActionEvent e) {
  81.                 File input = openFile();
  82.                 if(input != null) {
  83.                     imgView.loadImage(input);
  84.                     imgView.setMaxSize(new Dimension(maxImageWidth, maxImageHeight));
  85.                     imgViewOriginal = new ImageView(input);
  86.                     filename = input.getName();
  87.                     frame.pack();
  88.                     resetImage();
  89.                 }
  90.             }          
  91.         });
  92.        
  93.         // south panel
  94.         JPanel southPanel = new JPanel(new BorderLayout());
  95.        
  96.         // text display        
  97.         JPanel statsPanel = new JPanel(new GridLayout(3, 2));
  98.         TitledBorder statsBorder = BorderFactory.createTitledBorder("Bildwerte");
  99.         statsPanel.setBorder(statsBorder);
  100.        
  101.         String[] string = {"", "", "", "", "", "", "", "", "", "", "", ""};
  102.  
  103.         for (int i = 0; i < 12; i++) {
  104.             label[i] = new JLabel(string[i]);
  105.             statsPanel.add(label[i]);
  106.         }
  107.        
  108.         southPanel.add(statsPanel, BorderLayout.NORTH);
  109.        
  110.         // control panel
  111.         JPanel controlPanel = new JPanel(new BorderLayout());
  112.        
  113.         // brightness slider
  114.         brightnessSlider = new JSlider(-128,128,0);
  115.         brightnessSlider.setMinorTickSpacing(16);
  116.         brightnessSlider.setPaintTicks(true);
  117.         TitledBorder brightnessBorder = BorderFactory.createTitledBorder("Helligkeit");
  118.         brightnessSlider.setBorder(brightnessBorder);
  119.         brightnessSlider.addChangeListener(new ChangeListener() {
  120.             public void stateChanged(ChangeEvent arg0) {
  121.                 changeImage();
  122.             }
  123.         });
  124.         controlPanel.add(brightnessSlider, BorderLayout.NORTH);
  125.        
  126.         // contrast slider
  127.         contrastSlider = new JSlider(0,80,20);
  128.         contrastSlider.setMinorTickSpacing(10);
  129.         contrastSlider.setPaintTicks(true);
  130.         TitledBorder contrastBorder = BorderFactory.createTitledBorder("Kontrast");
  131.         contrastSlider.setBorder(contrastBorder);
  132.         contrastSlider.addChangeListener(new ChangeListener() {
  133.             public void stateChanged(ChangeEvent arg0) {
  134.                 changeImage();
  135.             }
  136.         });
  137.         controlPanel.add(contrastSlider, BorderLayout.CENTER);
  138.        
  139.         // saturation slider
  140.         saturationSlider = new JSlider(0,80,20);
  141.         saturationSlider.setMinorTickSpacing(10);
  142.         saturationSlider.setPaintTicks(true);
  143.         TitledBorder saturationBorder = BorderFactory.createTitledBorder("Sättigung");
  144.         saturationSlider.setBorder(saturationBorder);
  145.         saturationSlider.addChangeListener(new ChangeListener() {
  146.             public void stateChanged(ChangeEvent arg0) {
  147.                 changeImage();
  148.             }
  149.         });
  150.         controlPanel.add(saturationSlider, BorderLayout.SOUTH);
  151.        
  152.         //
  153.         southPanel.add(controlPanel, BorderLayout.SOUTH);
  154.        
  155.         // Bild + Histogramm
  156.         JPanel imgPanel = new JPanel();
  157.         imgBorder = BorderFactory.createTitledBorder(filename);
  158.         imgPanel.setBorder(imgBorder);
  159.         imgPanel.add(imgView);
  160.        
  161.         JPanel histoPanel = new JPanel();
  162.         TitledBorder histoBorder = BorderFactory.createTitledBorder("Histogramm");
  163.         histoPanel.setBorder(histoBorder);
  164.         histoPanel.add(histoView);
  165.        
  166.         JPanel images = new JPanel(new FlowLayout());
  167.         images.add(imgPanel);
  168.         images.add(histoPanel);
  169.        
  170.         add(load, BorderLayout.NORTH);
  171.         add(images, BorderLayout.CENTER);
  172.         add(southPanel, BorderLayout.SOUTH);
  173.                
  174.         setBorder(BorderFactory.createEmptyBorder(layoutBorder,layoutBorder,layoutBorder,layoutBorder));
  175.        
  176.         // perform the initial scaling
  177.         resetImage();
  178.     }
  179.    
  180.     private File openFile() {
  181.         JFileChooser chooser = new JFileChooser();
  182.         FileNameExtensionFilter filter = new FileNameExtensionFilter("Images (*.jpg, *.png, *.gif)", "jpg", "png", "gif");
  183.         chooser.setFileFilter(filter);
  184.         int ret = chooser.showOpenDialog(this);
  185.         if(ret == JFileChooser.APPROVE_OPTION) return chooser.getSelectedFile();
  186.         return null;       
  187.     }
  188.        
  189.     private static void createAndShowGUI() {
  190.         // create and setup the window
  191.         frame = new JFrame("Bildanalyse");
  192.         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  193.        
  194.         JComponent newContentPane = new Histo();
  195.         newContentPane.setOpaque(true); //content panes must be opaque
  196.         frame.setContentPane(newContentPane);
  197.  
  198.         // display the window.
  199.         frame.pack();
  200.         Toolkit toolkit = Toolkit.getDefaultToolkit();
  201.         Dimension screenSize = toolkit.getScreenSize();
  202.         frame.setLocation((screenSize.width - frame.getWidth()) / 2, (screenSize.height - frame.getHeight()) / 2);
  203.         frame.setVisible(true);
  204.     }
  205.  
  206.     public static void main(String[] args) {
  207.         //Schedule a job for the event-dispatching thread:
  208.         //creating and showing this application's GUI.
  209.         javax.swing.SwingUtilities.invokeLater(new Runnable() {
  210.             public void run() {
  211.                 createAndShowGUI();
  212.             }
  213.         });
  214.     }
  215.    
  216.     private void resetImage() {
  217.         // a new image has been laoded
  218.         updateHistogram();
  219.     }
  220.    
  221.     private void changeImage() {
  222.        
  223.         int pixels[] = imgViewOriginal.getPixels().clone();
  224.        
  225.         int brightness = brightnessSlider.getValue();
  226.         double contrast = contrastSlider.getValue() / 20.0;
  227.         double saturation = saturationSlider.getValue() / 20.0;
  228.        
  229.         for (int pos = 0; pos < pixels.length; pos++) {
  230.            
  231.             // get pixel
  232.             int c = pixels[pos];
  233.            
  234.             // get RGB values
  235.             int r = (c & 0xff0000) >> 16;
  236.             int g = (c & 0x00ff00) >> 8;
  237.             int b = (c & 0x0000ff);
  238.            
  239.             // Farbtransformation von RGB zu YCbCr
  240.             double Y = 0.299 * r + 0.587 * g + 0.114 * b;
  241.             double Cb = -0.168736 * r - 0.331264 * g + 0.5 * b;
  242.             double Cr = 0.5 * r - 0.418688 * g - 0.081312 * b;
  243.            
  244.             // Kontrast
  245.             Y = contrast * (Y - 128) + 128;
  246.            
  247.             // Helligkeit
  248.             Y = Y + brightness;
  249.            
  250.             // Sättigung
  251.             Cb = Cb * saturation;
  252.             Cr = Cr * saturation;
  253.            
  254.             // Farbtransformation von YCbCr zu RGB
  255.             r = (int)(Y + 1.402 * Cr);
  256.             g = (int)(Y - 0.3441 * Cb - 0.7141 * Cr);
  257.             b = (int)(Y + 1.772 * Cb);
  258.            
  259.             // Überlauf verhindern
  260.             r = (r > 255) ? 255 : ((r < 0) ? 0 : r);
  261.             g = (g > 255) ? 255 : ((g < 0) ? 0 : g);
  262.             b = (b > 255) ? 255 : ((b < 0) ? 0 : b);
  263.            
  264.             // restore pixel
  265.             pixels[pos] = 0xFF000000 + ((r & 0xff) << 16) + ((g & 0xff) << 8) + (b & 0xff);        
  266.         }
  267.        
  268.         imgView.setPixels(pixels);
  269.        
  270.         updateHistogram();
  271.     }
  272.    
  273.     private void updateHistogram() {
  274.        
  275.         drawHistogram();
  276.        
  277.         updateText();
  278.     }
  279.    
  280.     private void updateText() {
  281.        
  282.         imgBorder.setTitle(filename);
  283.        
  284.         /*
  285.         label[0].setText("Maximum: " + maxValue);
  286.         label[1].setText("Mittelwert: " + format(avgValue, 2));
  287.         label[2].setText("Minimum: " + minValue);
  288.         label[3].setText("Varianz: " + format(varValue, 2));
  289.         label[4].setText("Median: " + mdnValue);
  290.         label[5].setText("Entropie: " + format(entValue, 2));
  291.         */
  292.         label[0].setText("Maxium:");
  293.         label[1].setText("" + maxValue);
  294.         label[2].setText("Mittelwert:");
  295.         label[3].setText(format(avgValue, 2));
  296.         label[4].setText("Minimum:");
  297.         label[5].setText("" + minValue);
  298.         label[6].setText("Varianz:");
  299.         label[7].setText(format(varValue, 2));
  300.         label[8].setText("Median:");
  301.         label[9].setText("" + mdnValue);
  302.         label[10].setText("Entropie:");
  303.         label[11].setText(format(entValue, 2));
  304.     }
  305.  
  306.     public String format(double x, int len) {
  307.         double d = 1;
  308.        
  309.         for (int i = 0; i < len; i++) d *= 10;
  310.        
  311.         x = Math.round(x * d) / d;
  312.        
  313.         return Double.toString(x).replace('.', ',');
  314.     }
  315.  
  316.     void drawHistogram() {
  317.        
  318.         // Statistische Größen initialisieren
  319.         minValue = 255;
  320.         maxValue = 0;
  321.         avgValue = 0;
  322.        
  323.         // Helligkeitswerte
  324.         int brightness[] = new int[256];
  325.        
  326.         // Anzahl aller Helligkeitswerte = 0 setzen
  327.         Arrays.fill(brightness, 0);
  328.        
  329.         // maximaler Helligkeitswert
  330.         int maxBrightness = 0;
  331.        
  332.         // Bild auslesen
  333.         int imgPixels[] = imgView.getPixels();
  334.        
  335.         // Anzahl der Helligkeitswerte zählen
  336.         for(int imgPos = 0; imgPos < imgPixels.length; imgPos++) {
  337.                
  338.             int argb = imgPixels[imgPos];
  339.            
  340.             int r = (argb >> 16) & 0xff;
  341.             int g = (argb >> 8) & 0xff;
  342.             int b = argb & 0xff;
  343.            
  344.             int color = (int)(0.299 * r + 0.587 * g + 0.114 * b);
  345.            
  346.             brightness[color]++;
  347.            
  348.             if(brightness[color] > maxBrightness) {
  349.                
  350.                 maxBrightness = brightness[color];
  351.             }
  352.            
  353.             if(color > maxValue) {
  354.                
  355.                 maxValue = color;
  356.             }
  357.             if(color < minValue) {
  358.                
  359.                 minValue = color;
  360.             }
  361.         }
  362.        
  363.         //
  364.         //histoView = new ImageView(histWidth, imgView.getHeight());
  365.        
  366.         // Histogramm auslesen
  367.         int histPixels[] = histoView.getPixels();
  368.        
  369.         // Histogramm initialisieren
  370.         Arrays.fill(histPixels, 0xffffffff);
  371.        
  372.         // Histogramm zeichnen
  373.         int histSize = 256;
  374.        
  375.         for(int x = 0; x < histSize; x++) {
  376.            
  377.             double factor = (double)brightness[x] / maxBrightness;
  378.            
  379.             avgValue += x * brightness[x];
  380.            
  381.             int maxY = (int)(histSize * factor);
  382.            
  383.             for(int y = 0; y < histSize; y++) {
  384.                
  385.                 if(y >= (histSize - maxY)) {
  386.                    
  387.                     int histPos = y * histSize + x;
  388.                    
  389.                     histPixels[histPos] = 0xff000000;
  390.                     //histPixels[histPos] = (0xff << 24) | (int)(Math.random() * 0xffffff);
  391.                 }
  392.             }
  393.         }
  394.        
  395.         // Statistische Größen berechnen
  396.         avgValue = avgValue / imgView.getPixels().length;
  397.        
  398.         // Median bestimmen
  399.         int mid = (int)(imgPixels.length / 2);
  400.        
  401.         for(int x = 0; x < histSize; x++) {
  402.            
  403.             for(int i = 0; i < brightness[x]; i++) {
  404.                
  405.                 if(mid == 0) {
  406.                    
  407.                     mdnValue = x;
  408.                    
  409.                     break;
  410.                 }
  411.                
  412.                 mid--;
  413.             }
  414.            
  415.             if(mid == 0) break;
  416.         }
  417.        
  418.         // Graukeil zeichnen
  419.         for (int x = 0; x < histSize; x++) {
  420.            
  421.             for(int y = 257; y < histHeight; y++) {
  422.                
  423.                 int color = (0xff << 24) | (x << 16) | (x << 8) | x;
  424.                
  425.                 histPixels[y * histSize + x] = color;
  426.             }
  427.         }
  428.        
  429.         // Histogramm aktualisieren
  430.         histoView.applyChanges();
  431.     }
  432. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement