程序是一个关于图像中值滤波的。
这个是能编译通过的,没人用多线程的
想改成用多线程来实现对像素矩阵的中值滤波,也就是让一个线程来管一行像素的处理。
附件里是原程序,下边是我改的,可是错误的呀
谢谢各位大侠指教!! //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]
}
}
}
这个是能编译通过的,没人用多线程的
想改成用多线程来实现对像素矩阵的中值滤波,也就是让一个线程来管一行像素的处理。
附件里是原程序,下边是我改的,可是错误的呀
谢谢各位大侠指教!! //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]
}
}
}
楼主【laihuahua】截止到2008-07-06 15:56:21的历史汇总数据(不包括此帖):
发帖的总数量:4 发帖的总分数:120
结贴的总数量:4 结贴的总分数:120
无满意结贴数:1 无满意结贴分:30
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:25.00 % 无满意结分率:25.00 %
敬礼!
line是什么意思啊??