25 Şubat 2012 Cumartesi

Gri-ölçekli görüntünün histogramı

Bu program gri ölçekli (grey-scale) bir görüntünün histogramını görüntülemektedir.Arayüz olarak Swing JFrame kullanılmıştır.Gri-ölçekli görüntüler dışındaki görüntülerde program hata verecektir.


Öncelikle görüntü JFileChooser ile seçilir.Seçilen görüntü Raster (ızgara) sınıfı ile görüntünün pikselleri alınır ve piksel dizisine atanır.Daha sonra görüntünün histogramı piksel dizisi kullanılarak histogram dizisine atanır.Histogram dizisindeki değerler çok yüksek çıkabileceği için, öncelikle histogram dizisinin en yüksek değerli elemanı (max) bulunur daha sonra histogram dizisindeki her eleman max elemanına bölünür ve 255 ile çarpılır.Bu sayede histogram dizisi 0-255 arası değerlere çekilmiş olur.Şimdi elimizdeki histogram dizisi 256 boyutlu bir tamsayı dizisi ve değerleri 0-255 arasında değişkenlik gösteriyor.Ben histogramı ekrana çizdirmek için Graphics sınıfının drawLine yöntemini kullandım.Ancak koordinat sistemi pencerenin sol üst köşesinden başladığı için çizdirirken ayarlama yapmak gerekiyor.a ve b adlı değişkenleri burada ayarlama yapmak için kullandık.Histogramımızı çizdikten sonra bunu JLabel değişkenimize aktarıyoruz ve bu sayede histogramı ekranda yazdırmış oluyoruz.













import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DirectColorModel;
import java.awt.image.Raster;
import java.io.File;
import java.io.IOException;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class GrayScale extends JFrame implements ActionListener {

    private BufferedImage goruntum;
    static int genislik,yukseklik;
    static JLabel hist;
    static int piksel[],histogram[];

    public GrayScale(){

        super("Histogram");
        JPanel main=new JPanel();
        main.setLayout(new BorderLayout());
        this.setContentPane(main);

        hist=new JLabel();
        main.add(hist,BorderLayout.CENTER);

        JButton dugme=new JButton("Resim Aç");
        main.add(dugme,BorderLayout.SOUTH);    
        dugme.addActionListener(this);

        this.setResizable(false);
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {


        String filename=File.separator+"tmp";
        JFileChooser fc=new JFileChooser(new File(filename));
        fc.showOpenDialog(fc);
        File file=fc.getSelectedFile();
        try {
            goruntum = javax.imageio.ImageIO.read(file);
        } catch (IOException ex) {

        }
        genislik=goruntum.getWidth();
        yukseklik=goruntum.getHeight();
        piksel=new int[genislik*yukseklik];
        histogram=new int[256];
        Raster raster = goruntum.getData();
        raster.getPixels(0, 0, genislik, yukseklik, piksel);
        for(int i=0;i<piksel.length;i++){
            ++histogram[piksel[i]];
        }
        int max=0;
        for(int i=0;i<histogram.length;i++){
            if(histogram[i]>max)
                max=histogram[i];
        }
        for(int i = 0;i < histogram.length;i++){
        histogram[i] = 255 * histogram[i]/max;
        }
       BufferedImage bi=new BufferedImage(320,360,BufferedImage.TYPE_INT_RGB);
       Graphics g=bi.getGraphics();
       g.setColor(Color.white);
       final int a = 300;
       final int b = 5;
       for(int i = 0; i < histogram.length ; i++){
       g.drawLine(i + b,a ,i + b, a - histogram[i]);
       ImageIcon im=new ImageIcon(bi);
       GrayScale.setLabel(im);
       }      
    }

    public static void setLabel(ImageIcon im){
        hist.setIcon(im);
    }

    public static void main(String []args){
        GrayScale gs=new GrayScale();
        gs.setBounds(20,20,330,370);
    }
}

Hiç yorum yok:

Yorum Gönder