基于内容的图像检索实例
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());
}
}
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());
}
}
相关文章推荐
- 基于内容的图像检索 Database for Content-Based Image Retrieval
- 图像检索:几类基于内容的图像分类技术
- 基于内容的图像检索(颜色,直方图相交法,)java实现代码
- 图像检索:基于深度学习的CBIR(Content Based Image Retrieval)内容的图片检索论文
- 基于内容的图像检索引擎(以图搜图)
- 图像检索:几类基于内容的图像分类技术
- 基于内容的图像检索技(CBIR)术相术介绍
- CBIR: Colour Features 基于内容的图像检索:颜色特征
- 基于内容的图像检索-聚类分析
- 基于内容图像检索系统
- 基于内容图像检索
- 基于内容的图像检索系统(集成语义特征)
- 基于内容的图像检索 概述
- 图像检索:几类基于内容的图像分类技术
- 基于内容的图像检索引擎
- CBIR: Texture Features 基于内容的图像检索:纹理特征
- Matlab实现基于内容的图像检索系统
- Experimental CBIR Systems 基于内容的图像检索系统
- 基于内容的图像检索引擎(以图搜图)
- 图像检索:几类基于内容的图像分类技术