基于java的图像识别分析与特征图像提取
1.该图像识别⽅法,
(1)获取整个图⽚的所有rgb数量存储在list中
(2)统计每个list中R,g,b,各个在每个list中存储值对应的数量,存储到map中,存储中key的⼤⼩是乱序的,需要重新排序,(按照key的⼤⼩由⼩到⼤)
(3)把map中的特征图进⾏处理,对获取的map进⾏微分图像处理,形成更有特征的图像数据,提取特征数据存储数据库,形成了该图像的特征数据.
(4)识别图像与数据库中的数据进⾏⽐对,到对应的数据.
2,看看类
MainDemo
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import java.io.*;
import java.awt.image.*;
import javax.imageio.ImageIO;
SimpleDateFormat;
import org.jfree.chart.ChartPanel;
public class MainDemo implements ActionListener {
JFrame frame=null;
JLabel label=new JLabel();//⽤于显⽰图⽚
JLabel dealLabel=new JLabel();//⽤于显⽰处理后的图⽚
BufferedImage bi=null;//⽤于存储临时打开的图⽚流
//定义⽤于存储图⽚的数据,先获取r,g,b各个的数据,
//然后再每个数据内查指定r,g,b,出现的次数(0-255)出现的次数
ArrayList<Integer> rList=new ArrayList<Integer>();
ArrayList<Integer> gList=new ArrayList<Integer>();
ArrayList<Integer> bList=new ArrayList<Integer>();
//⽤于存储各个数据对应的值
LinkedHashMap<Integer,Integer> rMap=new LinkedHashMap<Integer,Integer>();
LinkedHashMap<Integer,Integer> gMap=new LinkedHashMap<Integer,Integer>();
LinkedHashMap<Integer,Integer> bMap=new LinkedHashMap<Integer,Integer>();
//⽤于返回进⾏处理后的数据,存储的对应的键和值
LinkedHashMap<Integer,Integer> dealRMap=new LinkedHashMap<Integer,Integer>();
LinkedHashMap<Integer,Integer> dealGMap=new LinkedHashMap<Integer,Integer>();
LinkedHashMap<Integer,Integer> dealBMap=new LinkedHashMap<Integer,Integer>();
private JPanel CenterJP=null;
private File f =null;
public void init(){
JButton openFile=new JButton("打开⽂件");
JButton DealPhoto1=new JButton("RGB绘图显⽰");
JButton DealPhoto3=new JButton("显⽰处理");
JButton DealPhoto2=new JButton("数据⼊库");
openFile.addActionListener(this);
DealPhoto1.addActionListener(this);
DealPhoto2.addActionListener(this);
DealPhoto3.addActionListener(this);
frame=new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(900,1000);
frame.setLayout(new BorderLayout());
frame.setLayout(new BorderLayout());
//操作数据按钮
JPanel OpearJP=new JPanel(new FlowLayout(FlowLayout.LEFT)); frame.add(OpearJP,BorderLayout.NORTH);
OpearJP.ateTitledBorder("操作"));
OpearJP.setPreferredSize(new Dimension(900,50));
OpearJP.add(DealPhoto1);
OpearJP.add(DealPhoto3);
OpearJP.add(DealPhoto2);
//⽤于显⽰图⽚的主⾯板
JPanel ShowJP=new JPanel(new BorderLayout());
ShowJP.ateTitledBorder("显⽰"));
ShowJP.setPreferredSize(new Dimension(900,950));
frame.add(ShowJP,BorderLayout.CENTER);
//⽤于显⽰打开⼀个⽂件的操作
JPanel NorthJP=new JPanel(new FlowLayout(FlowLayout.LEFT)); ShowJP.add(NorthJP,BorderLayout.NORTH);
NorthJP.setPreferredSize(new Dimension(900,50));
NorthJP.add(openFile);//打开⼀个⽂件
//⽤于显⽰被操作对象的和绘制的结果图⽚
CenterJP=new JPanel(new GridLayout(2,2,10,10));
CenterJP.setPreferredSize(new Dimension(900,900));
ShowJP.add(CenterJP,BorderLayout.CENTER);
//加⼊初始图⽚
//CenterJP.add(label);
frame.setVisible(true);
}
//实现按钮监听事件
public void actionPerformed(ActionEvent e){
String ActionCommand();
if(ButtonName.equals("打开⽂件")){
//paint();
System.out.println("打开⽂件:");
//每次打开⽂件夹后清除⼀下存储
rList.clear();
gList.clear();
bList.clear();
rMap.clear();
gMap.clear();
bMap.clear();
dealRMap.clear();
dealGMap.clear();
dealBMap.clear();
openFile();//打开⽂件
CenterJP.add(label);
CenterJP.updateUI();//更新组件不然不显⽰;
}else if(ButtonName.equals("RGB绘图显⽰")){
System.out.println("RGB绘制显⽰");
OpearDeal1(bi);//处理图⽚获取绘制图⽚的数据
/
/把map中的数据绘制出来,显⽰在JPanel上
System.out.println("开始绘制rgb的图形");
String flag="r";
ChartPanel rPanel=(new CountDeal()).getPanel(rMap,flag);
CenterJP.add(rPanel);
System.out.println("r绘制完成");
flag="g";
ChartPanel gPanel=(new CountDeal()).getPanel(gMap,flag);
CenterJP.add(gPanel);
System.out.println("g绘制完成");
flag="b";
ChartPanel bPanel=(new CountDeal()).getPanel(bMap,flag);
CenterJP.add(bPanel);
CenterJP.add(bPanel);
System.out.println("b绘制完成");
CenterJP.updateUI();
//对采集的数据进⾏绘制
}else if(ButtonName.equals("显⽰处理")){
System.out.println("显⽰处理");
dealRMap=new DealInsertMap().dealShowMap(rMap);
dealGMap=(new DealInsertMap()).dealShowMap(gMap);
dealBMap=(new DealInsertMap()).dealShowMap(bMap);
String flag="r";
ChartPanel rPanel=(new CountDeal()).getPanel(dealRMap,flag);
CenterJP.add(rPanel);
System.out.println("r绘制完成");
flag="g";
ChartPanel gPanel=(new CountDeal()).getPanel(dealGMap,flag);
CenterJP.add(gPanel);
System.out.println("g绘制完成");
flag="b";
ChartPanel bPanel=(new CountDeal()).getPanel(dealBMap,flag);
CenterJP.add(bPanel);
System.out.println("b绘制完成");
CenterJP.updateUI();
}else if(ButtonName.equals("数据⼊库")){
//int flag=400;//⽤于设置阈值
System.out.println("数据⼊库");
//获取当前⽂件的名称;
String Name();
String name=names.substring(0,names.lastIndexOf('.'));
System.out.println(name);
//(new SqlDate(name)).insertDate(rMap,gMap,bMap);
//(new SqlDate(name)).insertRGBDate(dealRMap,dealGMap,dealBMap);
}
}
//打开⽂件夹操作
public void openFile(){
JFileChooser chooser=new JFileChooser();
chooser.showOpenDialog(frame);//在某个容器上打开⼀个⽂件选择器
f = SelectedFile();
//String AbsolutePath();
//⽂件是否存在或者是否选择
if(f == null) {
return;
}
try {
bi = ad(f);
/*获取⽂件是否为图⽚,如果能够正常的获取到⼀张图⽚的宽⾼属性,
那肯定这是⼀张图⽚,因为⾮图⽚⽂件是获取不到它的宽⾼属性的*/
if(bi == null || bi.getHeight() <=0 || bi.getWidth() <=0){
label.setText("您选择的不是⼀张图⽚,请从新选择!");
return;
} else {
String path = f.getPath();
System.out.println(path);
ImageIcon image = new ImageIcon(path);
label.setIcon(image); //设置JLabel的显⽰图⽚
//frame.pack();//使此窗⼝的⼤⼩适合其⼦组件的⾸选⼤⼩和布局。
//frame.validate(); //验证此容器及其所有⼦组件。
}
} catch (IOException e) {
//e.printStackTrace();
return;
return;
}
}
/
/处理图⽚获取对应的RGB值并存储数据
public void OpearDeal1(BufferedImage bi){
int Width();
int Height();
int[][] gray=new int[w][h];
for(int x=0;x<w;x++){
for(int y=0;y<h;y++){
int RGB(x,y);
int r=(int)(pixel&0xff0000)>>16;
int g=(int)(pixel&0xff00)>>8;
int b=(int)(pixel&0xff);
if(r>=230&&g>=230&&b>=230){
}else{
rList.add(r);
gList.add(g);
bList.add(b);
}
}
}
System.out.println("数据存⼊成功");
//然后对数据进⾏处理,存储到map中,
rMap=new DealInsertMap().Deal(rList);
gMap=new DealInsertMap().Deal(gList);
bMap=new DealInsertMap().Deal(bList);
/*Set<Integer> key=rMap.keySet();
java.util.List<Integer> list=new ArrayList<>(key);
for(int i=0;i<key.size();i++){
System.out.println("键的数值为:"+((i)));
}*/
System.out.println("map中分析完成");
}
public static void main(String[] args){
(new MainDemo()).init();
}
}
DealInsertMap
import java.util.*;
public class DealInsertMap{
//⽤于处理采集的RGB数据
public LinkedHashMap<Integer,Integer> Deal(ArrayList<Integer> dealList){
LinkedHashMap<Integer,Integer> dealMap=new LinkedHashMap<Integer,Integer>(); for(int i=0;i<dealList.size();i++){
int (i);//返回指定的键
//如果不在就创建⼀个,如果在指定键的值加1
Set<Integer> mapSet=dealMap.keySet();//返回所有的键的集合
//System.out.println("长度⼤⼩"+mapSet.size());
ains(key)){//如果包含该元素,取出加1
int (key);
value++;
dealMap.put(key,value);
}else{//如果不存在该元素,创建⼀个新的元素
dealMap.put(key,1);
}
}
}
//返回的key是乱序的,需要对该key进⾏重新排序
LinkedHashMap<Integer,Integer> dealMaps=new LinkedHashMap<Integer,Integer>();
Set<Integer> keys=dealMap.keySet();
ArrayList<Integer> list=new ArrayList<Integer>(keys);
Collections.sort(list);//对list进⾏排序
for(int i=0;i<list.size();i++){
int ((i));
dealMaps.(i),value);
}
/*for(Iterator<Integer> it=dealMaps.keySet().iterator();it.hasNext();){
int ();
System.out.println("key"+key+",value="+(key));
htmlborder}*/
System.out.println("list的长度为:"+dealList.size());
System.out.println("map的长度为:"+dealMaps.size());
return dealMaps;
}
/*public static void main(String[] args){
LinkedHashMap<Integer,Integer> dealMap=new LinkedHashMap<Integer,Integer>();
dealMap.put(1,10);
dealMap.put(3,30);
new DealInsertMap().dealShowMap(dealMap);
}*/
/
/⽤于对map中的数据进⾏微分化处理
public LinkedHashMap<Integer,Integer> dealShowMap(LinkedHashMap<Integer,Integer> map){ LinkedHashMap<Integer,Integer> dealMap=new LinkedHashMap<Integer,Integer>();
Set<Integer> keys=map.keySet();
ArrayList<Integer> listKey=new ArrayList<Integer>(keys);
///Iterator<Integer> iterator=keys.iterator();
for(int j=0;j<listKey.size();j++){
int (j);
//System.out.println("键为:"+key);
int (key);
if((j==0)||(j==listKey.size()-1)){//处理第⼀个和最后⼀个元素
System.out.println("满⾜条件的可以"+key);
if(j==0){
dealMap.put(key,value);
}
}else{//满⾜的差值,把满⾜的加⼊,同时
int ((j-1));
int ((j+1));
if((value>(reValue+30))&&(value>(laValue+30))){
dealMap.put(key,value);
dealMap.put(((j+1)),0);//把下⼀点设为0,并加⼊
j++;//在移动⼀步
}
}
}
/*Set<Integer> keyss=dealMap.keySet();
System.out.println("keys:"+keyss);
Iterator<Integer> iterators=keyss.iterator();
while(iterators.hasNext()){
int ();
System.out.println("key:"+keysss+",value+"+(keysss));
}*/
return dealMap;
}
}
CountDeal
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论