您的位置:首页 > 其它

基于内容的图像检索实例

2013-09-02 23:01 615 查看
import java.awt.*;

import javax.swing.*;

import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;

import java.io.*;

/**

 * 基于欧式距离的简单图像检索

 * @author 徐伟彬

 * */

class CBIR

{

     private File f1;

  private BufferedImage b1;

  private int width;  //图像宽度

  private int height;  //图像高度

  private int minx;  //图像最小横坐标

  private int miny;  //图像最小纵坐标

  private int[]rgb1;  //图像rgb颜色值

  private int[]rgb2;

  private double[] rate1;  //图像频率数组

  private double[] rate2;

  private static final int N=65536;  //图像像素个数,256*256

  private static final int M=8;  //颜色级数

  private static final int IM=5;  //图像个数

  public CBIR()

  {

  f1=null;

  b1=null;

  width=0;

  height=0;

  minx=0;

  miny=0;

  rgb1=null;

  rgb2=null;

  rate1=null;

  rate2=null;

     rate1=rate2=null;

  }

   /**

    * 获得某个图像的RGB值

    * */

  private int[] getRGB(int k)

  {

      try{

         f1=new File(k+".gif");

         b1=ImageIO.read(f1);

       }catch(Exception e){e.printStackTrace();}

      width=b1.getWidth();

      height=b1.getHeight();

      minx=b1.getMinX();

      miny=b1.getMinY();

      int[] rgb=new int[width*height];

      int count=0;

            for(int i=minx;i<width;i++)

              for(int j=miny;j<height;j++)

              {

         int pixel=b1.getRGB(i,j);

         int r=(pixel&0xff0000)>>16;

         int g=(pixel&0xff00)>>8;

         int b=(pixel&0xff);

         rgb[count++]=(int)(r*0.299+g*0.586+b*0.114);//转化为亮度值

      }

      return rgb;

  }

   /**

    * 获得某个图像的频率数组

    * 这里级数M可以设计的更加智能,例如外部输入控制

    * */

    private  double[] getRATE(int rgb[])

    {

       int[] temp=new int[M];

       for(int i=0;i<M;i++)

       temp[i]=0;

       int sum=0;

       double[] rate=new double[M];

       for(int i=0;i<N;i++)

       {

     if(0<=rgb[i]&&rgb[i]<32)

     temp[0]++;

     else  if(32<=rgb[i]&&rgb[i]<64)

           temp[1]++;

           else if(64<=rgb[i]&&rgb[i]<96)

                temp[2]++;

                else if(96<=rgb[i]&&rgb[i]<128)

                     temp[3]++;

               else  if(128<=rgb[i]&&rgb[i]<160)

               temp[4]++;

               else if(160<=rgb[i]&&rgb[i]<192)

                    temp[5]++;

                    else if(192<=rgb[i]&&rgb[i]<234)

                                     temp[6]++;

                                     else if(234<=rgb[i]&&rgb[i]<=256)

                                          temp[7]++;

    sum++;

    }

    for(int i=0;i<M;i++)

    {

    rate[i]=temp[i]/(sum*1.0);

    }

    return rate;

 }

     public int testCBIR()

     {

  double pe=0,tpe;

  int flag=2;;

        CBIR c=new CBIR();

        rgb1=c.getRGB(1);

        rate1=c.getRATE(rgb1);

    //  for(int i=0;i<N;i++)

    //  System.out.println(rgb1[i]);

    //  for(int i=0;i<M;i++)

    //  System.out.println(rate1[i]);

        for(int i=2;i<=IM;i++)

        {

   tpe=0;

   rgb2=c.getRGB(i);

   rate2=c.getRATE(rgb2);

     //计算图像频率的欧式距离

   for(int j=0;j<M;j++)

   {

    tpe+=Math.pow((rate1[j]-rate2[j]),2);

   }

   tpe=Math.sqrt(tpe);

   System.out.println(tpe);

   if(i==2)

   {

      pe=tpe;

   flag=i;

      }

   else if(tpe<pe)

   {

     pe=tpe;

     flag=i;

   }

  }

  System.out.println(flag);

        return flag;

   }

}

/**

 * 简单的UI

 * */

class imageshow

{

 private Frame f;

 private JLabel bt1,bt2,bt3,bt4;

 private ImageIcon icon1,icon2;

    public void show(int param)

   {

  f = new Frame("XUNKANG");

  f.setLayout (new GridLayout (2, 2));

  bt1=new JLabel("",JLabel.CENTER);

  bt2=new JLabel("",JLabel.CENTER);

  icon1=new ImageIcon("1.gif");

  icon2=new ImageIcon(param+".gif");

  bt1.setIcon(icon1);

  bt2.setIcon(icon2);

  bt3=new JLabel("待检索图",JLabel.CENTER);

  bt4=new JLabel("检索结果",JLabel.CENTER);

  f.add(bt1);

        f.add(bt2);

        f.add(bt3);

        f.add(bt4);

  f.pack();

  f.setSize(600,500);

        f.setVisible(true);

       }

}

public class XunKang

{

 public static void main(String args[])

 {

       CBIR c=new CBIR();

       imageshow im=new imageshow();

       im.show( c.testCBIR());

    }

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息