Advertisement
Guest User

Untitled

a guest
Aug 17th, 2017
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.01 KB | None | 0 0
  1. import ij.IJ;
  2. import ij.ImageJ;
  3. import ij.ImagePlus;
  4. import ij.WindowManager;
  5. import ij.gui.ImageCanvas;
  6. import ij.gui.ImageWindow;
  7. import ij.plugin.PlugIn;
  8. import ij.process.ImageProcessor;
  9.  
  10. import java.awt.Color;
  11. import java.awt.Dimension;
  12. import java.awt.Font;
  13. import java.awt.GridLayout;
  14. import java.awt.Panel;
  15.  
  16. import javax.swing.BorderFactory;
  17. import javax.swing.JPanel;
  18. import javax.swing.JSlider;
  19. import javax.swing.border.TitledBorder;
  20. import javax.swing.event.ChangeEvent;
  21. import javax.swing.event.ChangeListener;
  22.  
  23. /**
  24.  * Opens an image window and adds a panel below the image
  25.  */
  26. public class GRDM_U2_S0531722 implements PlugIn {
  27.  
  28.     ImagePlus imp; // ImagePlus object
  29.     private int[] origPixels;
  30.     private int width;
  31.     private int height;
  32.  
  33.     public static void main(String args[]) {
  34.         //new ImageJ();
  35.         IJ.open("D:/Downloads/ij144/ImageJ/plugins/Pictures/orchid.jpg");
  36.         //IJ.open("Z:/Pictures/Beispielbilder/orchid.jpg");
  37.  
  38.         GRDM_U2_S0531722 pw = new GRDM_U2_S0531722();
  39.         pw.imp = IJ.getImage();
  40.         pw.run("");
  41.     }
  42.  
  43.     public void run(String arg) {
  44.         if (imp == null)
  45.             imp = WindowManager.getCurrentImage();
  46.         if (imp == null) {
  47.             return;
  48.         }
  49.         CustomCanvas cc = new CustomCanvas(imp);
  50.  
  51.         storePixelValues(imp.getProcessor());
  52.  
  53.         new CustomWindow(imp, cc);
  54.     }
  55.  
  56.     private void storePixelValues(ImageProcessor ip) {
  57.         width = ip.getWidth();
  58.         height = ip.getHeight();
  59.  
  60.         origPixels = ((int[]) ip.getPixels()).clone();
  61.     }
  62.  
  63.     class CustomCanvas extends ImageCanvas {
  64.  
  65.         CustomCanvas(ImagePlus imp) {
  66.             super(imp);
  67.         }
  68.  
  69.     } // CustomCanvas inner class
  70.  
  71.     class CustomWindow extends ImageWindow implements ChangeListener {
  72.  
  73.         private JSlider jSliderBrightness;
  74.         private JSlider jSlider2;
  75.         private JSlider jSlider3;
  76.         private JSlider jSlider4;
  77.         private double brightness;
  78.         private double kontrast=1.0d;
  79.         private double sättigung=1.0d;
  80.         private double hue;
  81.  
  82.         CustomWindow(ImagePlus imp, ImageCanvas ic) {
  83.             super(imp, ic);
  84.             addPanel();
  85.         }
  86.  
  87.         void addPanel() {
  88.             // JPanel panel = new JPanel();
  89.             Panel panel = new Panel();
  90.  
  91.             panel.setLayout(new GridLayout(4, 1));
  92.             jSliderBrightness = makeTitledSilder("Helligkeit", -28, 228, 64); // (str,minValue,MaxValue,default-Wert
  93.             jSlider2 = makeTitledSilder("Kontrast", 0, 100, 0);
  94.             jSlider3 = makeTitledSilder("Sättigungt", 0, 50, 0);
  95.             jSlider4 = makeTitledSilder("Hue", 0, 360, 0);
  96.             panel.add(jSliderBrightness);
  97.             panel.add(jSlider2);
  98.             panel.add(jSlider3);
  99.             panel.add(jSlider4);
  100.  
  101.             add(panel);
  102.  
  103.             pack();
  104.         }
  105.  
  106.         private JSlider makeTitledSilder(String string, int minVal, int maxVal,
  107.                 int val) {
  108.  
  109.             JSlider slider = new JSlider(JSlider.HORIZONTAL, minVal, maxVal,
  110.                     val);
  111.             Dimension preferredSize = new Dimension(width, 50);
  112.             slider.setPreferredSize(preferredSize);
  113.             TitledBorder tb = new TitledBorder(
  114.                     BorderFactory.createEtchedBorder(), string,
  115.                     TitledBorder.LEFT, TitledBorder.ABOVE_BOTTOM, new Font(
  116.                             "Sans", Font.PLAIN, 11));
  117.             slider.setBorder(tb);
  118.             slider.setMajorTickSpacing((maxVal - minVal) / 10);
  119.             slider.setPaintTicks(true);
  120.             slider.addChangeListener(this);
  121.  
  122.             return slider;
  123.         }
  124.  
  125.         private void setSliderTitle(JSlider slider, String str) {
  126.             TitledBorder tb = new TitledBorder(
  127.                     BorderFactory.createEtchedBorder(), str, TitledBorder.LEFT,
  128.                     TitledBorder.ABOVE_BOTTOM, new Font("Sans", Font.PLAIN, 11));
  129.             slider.setBorder(tb);
  130.         }
  131.  
  132.         // stellt die Intervalle der jeweiligen Slider dar
  133.  
  134.         public void stateChanged(ChangeEvent e) {
  135.             JSlider slider = (JSlider) e.getSource();
  136.  
  137.             // Slider : helligkeit
  138.  
  139.             if (slider == jSliderBrightness) {
  140.                 brightness = slider.getValue() - 100;
  141.                 String str = "Helligkeit :" + brightness;
  142.                 setSliderTitle(jSliderBrightness, str);
  143.             }
  144.  
  145.             // Slider : Kontrast
  146.  
  147.             if (slider == jSlider2) {
  148.                 kontrast =(slider.getValue() / 10.0d);
  149.                 String str = "Kontrast :" + kontrast;
  150.                 setSliderTitle(jSlider2, str);
  151.             }
  152.  
  153.             // Slider Sättigung
  154.  
  155.             if (slider == jSlider3) {
  156.                 sättigung = slider.getValue()/10.0d; // casten zu
  157.                                                                 // float und                                                // weden
  158.                 String str = "Sättigung :" + sättigung;
  159.                 setSliderTitle(jSlider3, str);
  160.             }
  161.  
  162.             // Slider : Hue bzw Farbton
  163.  
  164.             if (slider == jSlider4) {
  165.                 hue = slider.getValue();
  166.                 String str = "Hue :" + hue+"°";
  167.                 setSliderTitle(jSlider4, str);
  168.             }
  169.  
  170.             changePixelValues(imp.getProcessor());
  171.  
  172.             imp.updateAndDraw();
  173.         }
  174.  
  175.         // Methode zur Farbtransformation bzw inversen Transformation
  176.  
  177.         private void changePixelValues(ImageProcessor ip) {
  178.  
  179.             // Array fuer den Zugriff auf die Pixelwerte
  180.             int[] pixels = (int[]) ip.getPixels();
  181.  
  182.             for (int y = 0; y < height; y++) {
  183.                 for (int x = 0; x < width; x++) {
  184.                     int pos = y * width + x;
  185.                     int argb = origPixels[pos]; // Lesen der Originalwerte
  186.  
  187.                     int r = (argb >> 16) & 0xff;
  188.                     int g = (argb >> 8) & 0xff;
  189.                     int b = argb & 0xff;
  190.  
  191.             // Transformation von RGB -> YCbCr
  192.                    
  193.             double Y = (0.299 * r + 0.587 * g + 0.114 * b);
  194.             double Cb = (-0.168736 * r - 0.331264 * g + 0.5 * b);
  195.             double Cr = (0.5 * r - 0.418688 * g - 0.081312 * b);
  196.            
  197.             /* Kontrast und  Brightness:
  198.             Kontrast und Hellugkeit werden zusammen berechnet. Die Formel ergibt sich
  199.             aus den beiden jeweiligen Geradengleichungen für Kontrast und Helligkeit:
  200.             f(x) = (x-128) und f(x)= 128 + h. X ist hierbei die Pixelintensität,also die
  201.             Luminanz.Der Wert 128 beschreibt den Mittelwert der Intensität des Bildes.
  202.             Der Kontrast beschreibt den Unterschied zwischen Hell-und Dunkelbereichen. Demnach
  203.             ist der Kontrast größer, je höher der Abstand zwischen den Bereichen wird.
  204.            
  205.             Hue und Sättigung:
  206.             Mithilfer der Fabrdrehung lässt sich die Sättigung und der Farbton(hue) errechnen.
  207.             Hierbei bleibt der Winkel konstant. Die Formel der Farbdrehung lautet :
  208.             [CbNeu] = [ cos(Alpha) + sin(Alpha)] * [ Cb]
  209.             [CrNeu] = [ -sin(Alpha) + cos(Alpha)] * [Cr]
  210.             Wenn man die beiden Vektoren nun miteinander ausmultipliziert, ergibt sich die
  211.             Formel, wie im Code. Der Winkel ist hierbei der Farbton(hue).
  212.             Wir multiplizieren anschließend mit der Sättigung, um die Sättigung zu erhöhen. */
  213.            
  214.             double Yneu = kontrast * ( Y - 128) + 128 + brightness;
  215.             double Cbneu = ((Math.cos(hue)* Cb) + (Math.sin(hue)* Cr)*sättigung);
  216.             double Crneu = ((-Math.sin(hue)*Cb)+ (Math.cos(hue)*Cr)*sättigung);
  217.            
  218.             // Rücktransformation von YCbCr -> RGB
  219.             double rn = (Yneu + 1.402 * Crneu);
  220.             double gn = (Yneu - 0.3441*Cbneu - 0.7141*Crneu);
  221.             double bn = (Yneu + 1.772*Cbneu);
  222.            
  223.                    
  224.  
  225.                     // für R
  226.                     if (r > 255) {
  227.                         r = 255;
  228.                     }
  229.                     if (r < 0) {
  230.                         r = 0;
  231.                     }
  232.                    
  233.  
  234.                     // für G
  235.                     if (g > 255) {
  236.                         g = 255;
  237.                     }
  238.                     if (g < 0) {
  239.                         g = 0;
  240.                     }
  241.                
  242.  
  243.                     // für B
  244.                     if (b > 255) {
  245.                         b = 255;
  246.                     }
  247.                     if (b < 0) {
  248.                         b = 0;
  249.                     }
  250.                    
  251.  
  252.                     pixels[pos] = (0xFF << 24) | (r << 16) | (g << 8) | b;
  253.                 }
  254.             }
  255.         }
  256.  
  257.     } // CustomWindow inner class
  258. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement