程序是一个关于图像中值滤波的。 
这个是能编译通过的,没人用多线程的 
想改成用多线程来实现对像素矩阵的中值滤波,也就是让一个线程来管一行像素的处理。 
附件里是原程序,下边是我改的,可是错误的呀 
谢谢各位大侠指教!! //MedianImage.java 是原程序
//MultiMedianImage.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.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【laihuahua】截止到2008-07-06 15:56:21的历史汇总数据(不包括此帖):
    发帖的总数量:4                        发帖的总分数:120                      
    结贴的总数量:4                        结贴的总分数:120                      
    无满意结贴数:1                        无满意结贴分:30                       
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:25.00 %               无满意结分率:25.00 %                  
    敬礼!
      

  2.   

     感觉你新建一个线程之后为什么要join()呢,这样上一个线程就会发生阻塞啊。直到当前线程运行完毕上一个线程才会运行,起不到同时管理一行像素的目的啊
      

  3.   

    sleep一下不行啊  时间设置 短一点行不行
      

  4.   

    直接把thread.join(); 去掉~~~
      

  5.   

    MedianThread mt=new MedianThread(iw,ih,im); 
      

  6.   

    就是那个线程类里的run()方法内部,所有的变量,都说找不到符号。
      

  7.   

    MedianThread mt=new MedianThread(line); 
    line是什么意思啊??