程序是一个关于图像中值滤波的。
这个是能编译通过的,没人用多线程的
想改成用多线程来实现对像素矩阵的中值滤波,也就是让一个线程来管一行像素的处理。
附件里是原程序,下边是我改的,可是错误的呀
谢谢各位大侠指教!!
//MultiMedianImage.java
/* 程序说明:用多线程实现对图像的中值滤波调用MedianThread.java
作 者:lai
*/
public  void jRun_ActionPerformed(ActionEvent e){
if(flag){
   //调用MedianThread.java进行多线程中值滤波
    //MedianThread mt=new MedianThread(iw,ih,im);
    for(int i=1;i<ih;i++)
{

MedianThread mt=new MedianThread(line);
Thread thread=new Thread(mt);
thread.start();
thread.join();
}
      
    //将数组中的象素产生一个图像
ImageProducer ip=new MemoryImageSource(iw,ih,pixels,0,iw);
tmp=createImage(ip);
flag=true;
repaint();
   }else
   {
   JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
                         "Alert",JOptionPane.WARNING_MESSAGE);
}
  
  }

}
  class MedianThread implements Runnable
{
public MedianThread(final int line)
{
this.i=line;
} public void run()
{

try{
PixelGrabber pg=new PixelGrabber(im,0,0,iw,ih,pixels,0,iw);
pg.grabPixels();
}catch (InterruptedException e3) {
e3.printStackTrace();
}
//对图像进行中值滤波,Alpha值保持不变
ColorModel cm=ColorModel.getRGBdefault();                               synchronized(this) 
{
for(int j=1;j<iw-1;j++)//??????????????????
{
int red,green,blue;
int alpha=cm.getAlpha(pixels[i*iw+j]);

int red2=cm.getRed(pixels[(i-1)*iw+j]);
int red4=cm.getRed(pixels[i*iw+j-1]);
int red5=cm.getRed(pixels[i*iw+j]);
int red6=cm.getRed(pixels[i*iw+j+1]);
int red8=cm.getRed(pixels[(i+1)*iw+j]);

//水平方向进行中值滤波
if(red4>=red5){
if(red5>=red6) {red=red5;}
else{
if(red4>=red6) {red=red6;}
else{red=red4;}
}}
else{
if(red4>red6) {red=red4;}
else{
if(red5>red6) {red=red6;}
else{red=red5;}
}}

int green2=cm.getGreen(pixels[(i-1)*iw+j]);
int green4=cm.getGreen(pixels[i*iw+j-1]);
int green5=cm.getGreen(pixels[i*iw+j]);
int green6=cm.getGreen(pixels[i*iw+j+1]);
int green8=cm.getGreen(pixels[(i+1)*iw+j]);

//水平方向进行中值滤波
if(green4>=green5){
if(green5>=green6) {green=green5;}
else{
if(green4>=green6) {green=green6;}
else{green=green4;}
}}
else{
if(green4>green6) {green=green4;}
else{
if(green5>green6) {green=green6;}
else{green=green5;}
}}


int blue2=cm.getBlue(pixels[(i-1)*iw+j]);
int blue4=cm.getBlue(pixels[i*iw+j-1]);
int blue5=cm.getBlue(pixels[i*iw+j]);
int blue6=cm.getBlue(pixels[i*iw+j+1]);
int blue8=cm.getBlue(pixels[(i+1)*iw+j]);

//水平方向进行中值滤波
if(blue4>=blue5){
if(blue5>=blue6) {blue=blue5;}
else{
if(blue4>=blue6) {blue=blue6;}
else{blue=blue4;}
}}
else{
if(blue4>blue6) {blue=blue4;}
else{
if(blue5>blue6) {blue=blue6;}
else{blue=blue5;}
}}


pixels[i*iw+j]=alpha<<24|red<<16|green<<8|blue;
}[/align]
}
}
}

解决方案 »

  1.   

    原程序没贴上!!!!//MedianImage.java
    /*
             对图像进行中值滤波.
    */import java.awt.*;
    import java.awt.event.*;
    import java.awt.image.*;
    import javax.swing.*;
    import java.io.*;public class MedianImage extends Frame {
    Image im,tmp,tmp2,im2;
    int iw,ih;
    int[] pixels;
    int[] pixels2;
    boolean flag=false;
    boolean flag2=false;

    //构造方法
    public MedianImage(){
    super("中值滤波");
    Panel pdown;
    Button load,run,save,quit;
    Button show,show2;
    //添加窗口监听事件
    addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);
    }
    });

    pdown = new Panel();
    pdown.setBackground(Color.lightGray);//yellow

    load=new Button("装载图像");
    run = new Button("中值滤波");
    save=new Button("保存");
    quit=new Button("退出");
    show=new Button("显示像素表");
    show2=new Button("滤波后的像素表");

    this.add(pdown,BorderLayout.SOUTH);

    pdown.add(load);
    pdown.add(show);
    pdown.add(run);
    pdown.add(save);
    pdown.add(show2);
    pdown.add(quit);

    load.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
    jLoad_ActionPerformed(e);
    }
    });

    run.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
    jRun_ActionPerformed(e);
    }
    });

    quit.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
    jQuit_ActionPerformed(e);
    }
    });
    save.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
    jSave_ActionPerformed(e);
    }
    });
    show.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e)
      { jShow_ActionPerformed(e);}
    });
    show2.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e)
    { jShow2_ActionPerformed(e);}
    });

    }
      

  2.   

    public void jLoad_ActionPerformed(ActionEvent e){
    //利用MediaTracker跟踪图像的加载
    MediaTracker tracker = new MediaTracker(this);
    im=Toolkit.getDefaultToolkit().getImage("001.jpg");
    tracker.addImage(im,0);

    //等待图像的完全加载
    try{
    tracker.waitForID(0);
    }catch(InterruptedException e2){ e2.printStackTrace();}



    //获取图像的宽度iw和高度ih
    iw=im.getWidth(this);
    ih=im.getHeight(this);
    pixels=new int[iw*ih];

    try{
    PixelGrabber pg=new PixelGrabber(im,0,0,iw,ih,pixels,0,iw);
    pg.grabPixels();
    }catch (InterruptedException e3) {
    e3.printStackTrace();
    }

    //将数组中的象素产生一个图像????????
    ImageProducer ip=new MemoryImageSource(iw,ih,pixels,0,iw);
    tmp=createImage(ip);
    flag=true;
    repaint();


    }

    public  void jRun_ActionPerformed(ActionEvent e){
    if(flag){
    try{
     PixelGrabber pg=new PixelGrabber(im,0,0,iw,ih,pixels,0,iw);
    pg.grabPixels();
    }catch (InterruptedException e3) {
    e3.printStackTrace();
    }

    //对图像进行中值滤波,Alpha值保持不变
    ColorModel cm=ColorModel.getRGBdefault();
    for(int i=1;i<ih-1;i++)
    {
    for(int j=1;j<iw-1;j++)
    {
    int red,green,blue;
    int alpha=cm.getAlpha(pixels[i*iw+j]);

    int red2=cm.getRed(pixels[(i-1)*iw+j]);
    int red4=cm.getRed(pixels[i*iw+j-1]);
    int red5=cm.getRed(pixels[i*iw+j]);
    int red6=cm.getRed(pixels[i*iw+j+1]);
    int red8=cm.getRed(pixels[(i+1)*iw+j]);

    //水平方向进行中值滤波

    if(red4>=red5){
    if(red5>=red6) {red=red5;}
    else{
    if(red4>=red6) {red=red6;}
    else{red=red4;}
    }}
    else{
    if(red4>red6) {red=red4;}
    else{
    if(red5>red6) {red=red6;}
    else{red=red5;}
    }}

    int green2=cm.getGreen(pixels[(i-1)*iw+j]);
    int green4=cm.getGreen(pixels[i*iw+j-1]);
    int green5=cm.getGreen(pixels[i*iw+j]);
    int green6=cm.getGreen(pixels[i*iw+j+1]);
    int green8=cm.getGreen(pixels[(i+1)*iw+j]);

    //水平方向进行中值滤波
    if(green4>=green5){
    if(green5>=green6) {green=green5;}
    else{
    if(green4>=green6) {green=green6;}
    else{green=green4;}
    }}
    else{
    if(green4>green6) {green=green4;}
    else{
    if(green5>green6) {green=green6;}
    else{green=green5;}
    }}




    int blue2=cm.getBlue(pixels[(i-1)*iw+j]);
    int blue4=cm.getBlue(pixels[i*iw+j-1]);
    int blue5=cm.getBlue(pixels[i*iw+j]);
    int blue6=cm.getBlue(pixels[i*iw+j+1]);
    int blue8=cm.getBlue(pixels[(i+1)*iw+j]);

    //水平方向进行中值滤波
    if(blue4>=blue5){
    if(blue5>=blue6) {blue=blue5;}
    else{
    if(blue4>=blue6) {blue=blue6;}
    else{blue=blue4;}
    }}
    else{
    if(blue4>blue6) {blue=blue4;}
    else{
    if(blue5>blue6) {blue=blue6;}
    else{blue=blue5;}
    }}
    pixels[i*iw+j]=alpha<<24|red<<16|green<<8|blue;//

    }
    }


    /*if(i==0) //||‖||=ih
    {
    for(j=0;j<iw;j++)
    {
    pixels2[i*iw+j]=pixels[i*iw+j];
    }
    }
    if(i==ih-1) //||‖||=ih||j=iw
    {
    for(j=0;j<iw;j++)
    {
    pixels2[i*iw+j]=pixels[i*iw+j];
    }
    }

    if(j==0)
    {
    for(i=0;i<ih;i++)
    {
      pixels2[i*iw+j]=pixels[i*iw+j];
    }
    }
    if(j==iw-1)
    {
    for(i=0;i<ih;i++)
    {
      pixels2[i*iw+j]=pixels[i*iw+j];
    }
    }*///第一行,第一列,最后一行,最后一列
    //????





    //将数组中的象素产生一个图像
    ImageProducer ip=new MemoryImageSource(iw,ih,pixels,0,iw);
    tmp=createImage(ip);
    flag=true;
    flag2=true;
    repaint();
    }else{
     JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
                             "Alert",JOptionPane.WARNING_MESSAGE);
    }
    }


    public void jSave_ActionPerformed(ActionEvent e){

    //Save Image
    if(flag2){

    final FileDialog fileDialog_save=new FileDialog(this,"保存对话框",FileDialog.SAVE);

    fileDialog_save.addWindowListener(new WindowAdapter()
    { public void windowClosing(WindowEvent e)
    {fileDialog_save.setVisible(false);}});

    //保存图像
    fileDialog_save.setVisible(true);

    if(fileDialog_save.getFile()!=null)
      {
    try
      {
    File file=new File("C:\\Documents and Settings\\DELL\\桌面\\002.jpg");//fileDialog_save.getDirectory(),fileDialog_save.getFile()
    FileWriter tofile=new FileWriter(file);
    BufferedWriter out=new BufferedWriter(tofile);
    out.write(pixels.getBytes());

     
    out.flush();
    out.close();


    }catch(IOException e2)
    {
    e2.printStackTrace();
    }
      }
    }//}
       
    else{
      JOptionPane.showMessageDialog(null,"请先进行滤波!",
                             "Alert",JOptionPane.WARNING_MESSAGE);
    }

    }

    public void jQuit_ActionPerformed(ActionEvent e)
    {
    //System.exit(0);
    JOptionPane op =new JOptionPane();
    int exit=op.showConfirmDialog(this,"你要退出吗? ? ?","退出",JOptionPane.YES_NO_OPTION);

    if(exit==JOptionPane.YES_OPTION)
    {
    System.exit(0);

    }else{ }
    }

    public void jShow_ActionPerformed(ActionEvent e)
    {
    if(flag){

    //获取图像的宽度iw和高度ih
    iw=im.getWidth(this);
    ih=im.getHeight(this);

    //提取图像的象素pixels
    pixels=new int[iw*ih];
    try{
    PixelGrabber pg=new PixelGrabber(im,0,0,iw,ih,pixels,0,iw);
    pg.grabPixels();
    }catch (InterruptedException eee) {
    eee.printStackTrace();
    }

    //调用PixelsShow.java进行显示
    PixelsShow ps=new PixelsShow(iw,ih);
    ps.setData(pixels);
    ps.showTable();
    ps.setVisible(true);
    repaint();
    }else{
      JOptionPane.showMessageDialog(null,"请先打开一幅图片!",
                     "Alert",JOptionPane.WARNING_MESSAGE);
                    }
    }

    public void jShow2_ActionPerformed(ActionEvent e)
    {
    if(flag2){

    //tmp2=tmp;
    //tmp2
    MediaTracker tracker2 = new MediaTracker(this);
    im2=Toolkit.getDefaultToolkit().getImage("001.jpg");
    tracker2.addImage(im2,1);
    /*//获取图像的宽度iw和高度ih
    iw=im.getWidth(this);
    ih=im.getHeight(this);
    */
    //提取图像的象素pixels
    pixels2=new int[iw*ih];
    try{
    PixelGrabber pg2=new PixelGrabber(im2,0,0,iw,ih,pixels2,0,iw);
    pg2.grabPixels();
    }catch (InterruptedException eee) {
    eee.printStackTrace();
    }

    //调用PixelsShow.java进行显示
    PixelsShow ps2=new PixelsShow(iw,ih);
    ps2.setData(pixels2);
    ps2.showTable();
    ps2.setVisible(true);
    repaint();
    }else{

      JOptionPane.showMessageDialog(null,"请滤波后再点击我!",
                      "Alert",JOptionPane.WARNING_MESSAGE);
                }
    }


    //调用paint()方法,显示图像信息。
    public void paint(Graphics g){
    if(flag){
    g.drawImage(tmp,10,20,this);
    }else { }
    }
    //定义main方法,设置窗口的大小,显示窗口
    public static void main(String[] args) {
    MedianImage mi = new MedianImage();
    mi.setLocation(200,250);
    mi.setSize(500,400);
    mi.setVisible(true);

    }