⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 图象分割.java

📁 图象分割的实现 实现简单
💻 JAVA
字号:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Toolkit;
import java.awt.image.*;
public class picture extends JFrame implements ActionListener
{
   Image im;
   static int[] pixels1;   //保存原图片的每一像素点的值
   static int[] p1;//一集合,与图片大小相同,若已被切割,令为1,否则为0,即初始化为0
   static int w,h;  //图片的长和宽
   public picture()
   {
  	 try
     {//以下是图形界面的处理和取图片
       JLabel lb1=new JLabel();
       Container con=this.getContentPane();
       Box basebox=Box.createVerticalBox();	
       con.add(basebox);
       im=Toolkit.getDefaultToolkit().getImage("tupian.jpg");
       lb1.setIcon(new ImageIcon("tupian.jpg"));
       MediaTracker t=new MediaTracker(this);
       t.addImage(im,0);
       t.waitForID(0);
       w=im.getWidth(null);
       h=im.getHeight(null);
       pixels1=new int[w*h];
       p1=new int[w*h+1];
       for(int i=0;i<w*h;i++)
	    {
    	   p1[i]=0;
    	}
       PixelGrabber pg1=new PixelGrabber(im,0,0,w,h,pixels1,0,w);
       pg1.grabPixels();  //这两个函数是取其原图片每一像素点并保存在pixels1中
       
       JButton c=new JButton("图象切割");
       basebox.add(c);
       basebox.add(lb1);
       
       incise() ;//切割函数的调用
       c.addActionListener(new ActionListener()
       { 
    	   public void actionPerformed(ActionEvent e)
            {//处理后的图像的图形界面
  	      JFrame f=new JFrame("处理后的图像");
              JLabel lb2=new JLabel();
              im=createImage(new MemoryImageSource(w,h,pixels1,0,w));
              lb2.setIcon(new ImageIcon(im));
              f.getContentPane().add(lb2);
              f.pack();
              f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              f.setVisible(true);}});
              this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      } catch(Exception e)
        {
            e.printStackTrace();	    	
        }
  }
    public static void incise() 
     { 	
     //先去边框外的背景,即下面的scanHead_to_End()函数scanEnd_to_Head()函数
     //再去其边框,即下面的scanLift_to_Right()函数和scanUp_to_Down()函数
     //最后去边框里的背景,即在调用scanHead_to_End()函数scanEnd_to_Head()函数即可
     scanHead_to_End();
	 scanEnd_to_Head();
	 scanLift_to_Right();
	 scanUp_to_Down();
	 scanEnd_to_Head();
	 scanHead_to_End();
	 scanLift_to_Right();
	 scanUp_to_Down();
	}
     public static void scanHead_to_End()
    {
     int i,m,n,t1=0,t2=0;	   
	 for(i=0;i<2000;i++)
	  { 
		 p1[i]=1;
		 pixels1[i]=2147483647;
	  }
	 for(i=2000;i<w*h;i++)
	  {
		   t1=0;t2=0;
		   m=i-w;//取上一点
		   n=i-1;//取左一点
		   if(pixels1[i]<=-13777216)
		  {
			  if(p1[m]==1)
			       t1=1;
			  if(p1[n]==1)
			       t2=1;
		  }
         if(t1==1||t2==1)  
		  {  p1[i]=1; 
		     pixels1[i]=2147483647 ;
		  }
		   else  if(pixels1[i]==2147483647) 
			   p1[i]=1;		   
	   } }  
 public static void scanEnd_to_Head()
 {    int i,m,n,t1=0,t2=0;
	  for(i=w*h-1;i>w*h-2000;i--)
	  {
		  p1[i]=1;
	  }
	   for(i=w*h-2000;i>0;i--)
	   {
		   t1=0;t2=0;
		   m=i+w;//取下点
		   n=i+1;//取右一点
	       if(pixels1[i]<=-13777216)
		   {
		       if(p1[n]==1)
				  t2=1;				     
			   if(p1[m]==1)
				  t1=1;			     
		   }
		   if(t1==1||t2==1)  
		   { 
			   p1[i]=1;  
			   pixels1[i]=2147483647 ;
		    }
	       else  if(pixels1[i]==2147483647) 
	    	   p1[i]=1;
	   } }
  public static void scanLift_to_Right()
 {
     int i,x,t1,t2;
	 for(i=2000;i<w*h;i++)
	 {
		 t1=0;t2=0;
		 x=i%w;
	     if(p1[i]!=1)
	    {
		   if(x<=256)
		   {
			   for(int j=1;j<5;j++)
				 if((x-j>0)&&(pixels1[i-j]==2147483647))
				 {
					 t1=1;
					 j=16;
				 }
			  for(int j=1;j<8;j++)
				 if((pixels1[i+j]<=-13777216))
				 {
					 t2=1;
					 j=16;
				 }
			 if(t1==1&&t2==1)
			 { 
				 p1[i]=1;
				 pixels1[i]=2147483647;
			 }
		   }
		   else
		   {
                for(int j=1;j<5;j++)
			    if((pixels1[i-j]==2147483647)||(pixels1[i-j]<=-13777216))
				 {  t1=1;
				    j=16;
				 }
				for(int j=1;j<5;j++)
				  if((x+j<512)&&(pixels1[i+j]==2147483647))
				   {  t2=1;
				      j=16;
				   }
				 if(t1==1&&t2==1)
				 { 
					 p1[i]=1;
					 pixels1[i]=2147483647;
				}	 }  }}}
 public static void scanUp_to_Down()
 {
	 int i,y,t1,t2;    
	 for(i=2000;i<w*h;i++)
	 {
		 t1=0;t2=0;
		 y=i/w+1;
		 if(p1[i]!=2147483647)
		 {
			 if(y<=256)
			 {
				 for(int j=1;j<5;j++)
					if(y-j>0&&pixels1[i-j*w]==2147483647)
					 {
						t1=1;
						j=16;
				     }
				 for(int j=1;j<5;j++)
				 if((pixels1[i+j*w]==2147483647)||(pixels1[i+j*w]<=-15777216))
					{ t2=1;
					  j=16;
					}
				 if(t1==1&&t2==1)
				 { p1[i]=1;	
				   pixels1[i]=2147483647;
				 }
			 }
			 else
			 {
				 for(int j=1;j<8;j++)
				 if((y+j<512)&&pixels1[i+j*w]==2147483647)
					 { t1=1;
					  j=16;
					 }
				 for(int j=1;j<8;j++)
				 if((pixels1[i-j*w]==2147483647)||(pixels1[i-j*w]<=-13777216))
				  {
					 t2=1;
					 j=16;
				  }
				 if(t1==1&&t2==1)
				 { p1[i]=1;	
				   pixels1[i]=2147483647; 
				 }
			 }
		 }
	 }}
  public static void main(String[] args)
  {
	picture fl=new picture();
    fl.pack(); 
    fl.setTitle("原图像");
    fl.setVisible(true); 
  }
  public void actionPerformed(ActionEvent e) 
  { }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -