我的任务是编写单色(黑白)雾过滤器来更改图像,使其看起来像是在大雾天拍摄的。要执行此操作,请将图像中的每个值更改为值本身的平均值,旁边的值(4或全部8)和0到255之间的随机值((short)(Math.random() * 256
)将获得随机数)。我的老师周末没有回复求助。
所以这就是我所在的地方: 我改进了我的代码,因为它使图像变黑了。但我认为它会更突出黑色和白色。我只是想确保我至少做了作业所要求的。
老师为这个作业设计了一些自己的课程和一个界面
提供图像的ImageProvider类(.jpg图片) java.lang.Object继承 扩展byjava.awt.Component 扩展了byimagelab.ImgProvider
所有已实施的接口: java.awt.image.ImageObserver,java.awt.MenuContainer,java.io.Serializable
ImageLab类 java.lang.Object继承 扩展了byimagelab.ImageLab
ImageLab是图像过滤器开发的平台。 ImageLab首先构建一个包含所有可用过滤器的菜单(那些实现ImageFilter接口的.class文件@see ImageFilter)。
接口ImageFilter
public interface ImageFilter
ImageFilter接口由各自的图像过滤器实现。
实施细节程序的格式 在编写过滤器时,您应该通过放置以下行来指示过滤器是过滤器包的成员: 包过滤器;在.java文件的顶部。
所以你的过滤器可以找到ImageFilter接口,你应该把这行: import imagelab。*;作为文件中的第二行。
要编译过滤器(假设其名为MyFilter.java),请转到父目录(具有imagelab和过滤器作为子目录的目录)并键入: javac过滤器/ MyFilter.java
要运行imageLab,您应该在同一目录中并键入: java imagelab.ImageLab
package filters;
import imagelab.*;
public class Monochrome implements ImageFilter {
ImgProvider filteredImage;
public void filter (ImgProvider ip) {
short[][] mono = ip.getBWImage();//Convert the picture to B&W
short[][] mono2 = new short[mono.length][mono[0].length];
/**Go through both arrays and change every value in the image to the average of the value itself, the values next to it (4 or all 8) and a random value from 0 to 255
*/
for (int r = 1; r<mono.length-1; r++) {
for (int c = 1; c < mono[0].length-1; c++) {
int val = mono[r][c];
val += ((short)Math.random()*256); //random number
val += mono[r-1][c];
val += mono[r+1][c];
val += mono[r][c-1];
val += mono[r][c+1];
val /= 5;
val = (val < 0) ? -val : val;
if (val > 255) val = 255;
mono2[r][c] = (short)((val < 0) ? -val : val);
}//for c
}//for r;
filteredImage = new ImgProvider(); //create the new .jpg image
filteredImage.setBWImage(mono2); //set it to B&W using the monochrome settings
filteredImage.showPix("Monochrome of original image"); //label the image
}//filter
public ImgProvider getImgProvider() {
return filteredImage;
}//getImgProvider
public String getMenuLabel() {
return "Monochrome";
} //getMenuLabel
}
答案 0 :(得分:0)
您声明需要"change every value in the image to the average of the value itself, the values next to it (4 or all 8) and a random value from 0 to 255"
你现在没有做那样的事;当您通过阵列时,您将随机选择的位置分配给当前位置。
你通过整个2D阵列的2个循环很好,但是你需要得到你当前所在的那些周围的值。
示例:如果您位于mono[0][0]
,那么您需要获得mono[0][1]
,mono[1][0]
和mono[1][1]
。将它们与您当前位置的值和随机数一起添加,然后除以5
以获得平均值。
你会注意到我为这个例子挑了一个角落。根据你在2D阵列中的位置,你可以有3个(你在一个角落里),5个(你在边界但不在一个角落里),或者8个(你在内部)周围的值;我不知道你的描述中4
来自哪里。