基于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;
import java.text.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());
		//操作数据按钮
		JPanel OpearJP=new JPanel(new FlowLayout(FlowLayout.LEFT));
		frame.add(OpearJP,BorderLayout.NORTH);
		OpearJP.setBorder(BorderFactory.createTitledBorder("操作"));
		OpearJP.setPreferredSize(new Dimension(900,50));
		OpearJP.add(DealPhoto1);
		OpearJP.add(DealPhoto3);
		OpearJP.add(DealPhoto2);
		//用于显示图片的主面板
		JPanel ShowJP=new JPanel(new BorderLayout());
		ShowJP.setBorder(BorderFactory.createTitledBorder("显示"));
		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 ButtonName=e.getActionCommand();
		if(ButtonName.equals("打开文件")){
			CenterJP.removeAll();
			//CenterJP.repaint();
			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);
			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 names=f.getName();
			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 = chooser.getSelectedFile();
		//String FilePath=f.getAbsolutePath();
		//文件是否存在或者是否选择
		if(f == null) {
			return;
		}
		try {
			bi = ImageIO.read(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;
		}
	}
	//处理图片获取对应的RGB值并存储数据
	public void  OpearDeal1(BufferedImage bi){
		int w=bi.getWidth();
		int h=bi.getHeight();
		int[][] gray=new int[w][h];
		
		for(int x=0;x<w;x++){
			for(int y=0;y<h;y++){
				int pixel=bi.getRGB(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("键的数值为:"+rMap.get(list.get(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 key=dealList.get(i);//返回指定的键
			//如果不在就创建一个,如果在指定键的值加1
			Set<Integer> mapSet=dealMap.keySet();//返回所有的键的集合
			//System.out.println("长度大小"+mapSet.size());
			if(mapSet.contains(key)){//如果包含该元素,取出加1
				int value=dealMap.get(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 value=dealMap.get(list.get(i));
			dealMaps.put(list.get(i),value);
		}
		/*for(Iterator<Integer> it=dealMaps.keySet().iterator();it.hasNext();){
			int key=it.next();
			System.out.println("key"+key+",value="+dealMaps.get(key));
		}*/
		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 key=listKey.get(j);
			//System.out.println("键为:"+key);
			int value=map.get(key);
			if((j==0)||(j==listKey.size()-1)){//处理第一个和最后一个元素
				System.out.println("满足条件的可以"+key);
				if(j==0){
					dealMap.put(key,value);
				}
			}else{//找满足的差值,把满足的加入,同时
				int reValue=map.get(listKey.get(j-1));
				int laValue=map.get(listKey.get(j+1));
				if((value>(reValue+30))&&(value>(laValue+30))){
					dealMap.put(key,value);
					
					dealMap.put((listKey.get(j+1)),0);//把下一点设为0,并加入
					j++;//在移动一步
				}
			}
		}
		/*Set<Integer> keyss=dealMap.keySet();
		System.out.println("keys:"+keyss);
		Iterator<Integer> iterators=keyss.iterator();
		while(iterators.hasNext()){
			int keysss=iterators.next();
			System.out.println("key:"+keysss+",value+"+dealMap.get(keysss));
		}*/
		return dealMap;
	}	
}

CountDeal

import org.jfree.chart.ChartPanel;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;
import java.util.*;

public class CountDeal{

	public ChartPanel getPanel(LinkedHashMap<Integer,Integer> dealMap,String flag){
		String  chartTitle =null;
		String x="";
		String y="种类个数对于的数量";
		String name="";
		if(flag.equals("r")){
			chartTitle ="r的曲线";
			x="r存在的种类个数";
			name="r";
		}else if(flag.equals("g")){
			chartTitle="g的曲线";
			x="g存在的种类个数";
			name="g";
		}else if(flag.equals("b")){
			chartTitle="b的曲线";
			x="b存在的种类个数";
			name="b";
		}
		JFreeChart lineChart=ChartFactory.createLineChart(
			chartTitle,x,y,
			createDataset(dealMap,name),
			PlotOrientation.VERTICAL,
			true,true,false);
		ChartPanel chartPanel=new ChartPanel(lineChart);
		chartPanel.setPreferredSize(new java.awt.Dimension(400,400));
		return chartPanel;
	}
	//创建数据集
	private DefaultCategoryDataset createDataset(LinkedHashMap<Integer,Integer> dealMap,String name){
		 DefaultCategoryDataset dataset=new DefaultCategoryDataset();
		 Set<Integer> key=dealMap.keySet();
		 List<Integer> list=new ArrayList<>(key);
		 for(int i=0;i<key.size();i++){
			 dataset.addValue(dealMap.get(list.get(i)),name,list.get(i).toString());
			//if(dealMap.get(list.get(i))>100){
				//System.out.println("map的值:"+dealMap.get(list.get(i)));
			//}
		 }
		 return dataset;
	}


}

SqlDate

import java.sql.*;
import java.util.*;

public class SqlDate{

	private static String root="rootes";
	private static String password="123456";
	private static  String name="com.mysql.jdbc.Driver";
	private static String url="jdbc:mysql://192.168.65.99/test";
	private static Connection conn=null;
	private static Statement stat=null;
	private static String typename="";
	
	public SqlDate(String typename){
		this.typename=typename;
	}
	public static  Connection getConnection(){
		try{
			Class.forName(name);
			conn=DriverManager.getConnection(url,root,password);
		}catch(Exception  e){
			System.out.println("连接数据库失败");
			e.printStackTrace();
		}
		return conn;
	}
	/*public static void main(String[] args){
		LinkedHashMap<Integer,Integer> hash=new LinkedHashMap<Integer,Integer>();
		hash.put(1,10);
		hash.put(2,15);
		hash.put(3,50);
		hash.put(4,100);
		hash.put(5,20);
		hash.put(6,80);
		insertDate(hash,hash,hash);
	}
	public static  void insertRGBDate(LinkedHashMap<Integer,Integer> rMap,
		LinkedHashMap<Integer,Integer> gMap,LinkedHashMap<Integer,Integer> bMap){
		int countR=dealHashMap(rMap);
		int countG=dealHashMap(gMap);
		int countB=dealHashMap(bMap);
		//对获取的数据进行插入处理;
		try{
			conn=getConnection();
			stat=conn.createStatement();
			String sql="insert into tb_rgbcount(type,rcount,gcount,bcount)"+
				" values('"+typename+"',"+countR+","+countG+","+countB+")";
			stat.execute(sql);
			System.out.println("数据插入完成");
		}catch(Exception e){
			System.out.println("数据库连接失败");
			e.printStackTrace();
		}	
	}*/
	public static  void insertDate(LinkedHashMap<Integer,Integer> rMap,
		LinkedHashMap<Integer,Integer> gMap,LinkedHashMap<Integer,Integer> bMap){
		int countR=dealHashMap(rMap);
		int countG=dealHashMap(gMap);
		int countB=dealHashMap(bMap);
		//对获取的数据进行插入处理;
		try{
			conn=getConnection();
			stat=conn.createStatement();
			String sql="insert into tb_rgbcount(type,rcount,gcount,bcount)"+
				" values('"+typename+"',"+countR+","+countG+","+countB+")";
			stat.execute(sql);
			System.out.println("数据插入完成");
		}catch(Exception e){
			System.out.println("数据库连接失败");
			e.printStackTrace();
		}	
	}
	public static int dealHashMap(LinkedHashMap<Integer,Integer> rgbMap){
		int flag=0;
		int center=0;
		int count=0;
		Collection<Integer> c=rgbMap.values();
		Object[] obj=c.toArray();
		Arrays.sort(obj);//对获取的值内容进行由小到大排序
		center=((int)obj[0]+(int)obj[obj.length-1])/2;
		Set<Integer> keys=rgbMap.keySet();
		Iterator<Integer> iterator=keys.iterator();
		while(iterator.hasNext()){
			int key=iterator.next();
			int value=rgbMap.get(key);
			if(value>=center){
				count=count+(value-center);
			}
		}
		return count;
	}
}

以上思路只是部分,如果后期还做,会不断升化,这里的阈值在提取微分图像的时候,可以根据需求设置,形成不同的效果.

  • 1
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值