📄 图象分割.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 + -