#java #image #image-processing #computer-vision
Вопрос:
Я пытаюсь реализовать простой фильтр в Java (я совсем новичок в Java (мои первые несколько дней), и я немного знаю C ). Мне дали задание написать код на фильтре на изображении, но я не уверен, что пошло не так. Значения выходной интенсивности стали темнее, чем в оригинале, но я не уверен, почему.
У меня есть два файла: blurImage.java и Img.java. Image.java должно быть все в порядке, но я совершенно уверен, что это что-то в blurImage.java. blurImage по сути просит пользователя ввести размер фильтра (в нечетном числе), а затем размыть изображение. Я написал свой в 2D-массиве для лучшего понимания. Также ABC.png представляет собой квадратное изображение.
blurImage.java:
import java.util.Scanner;
import java.time.Instant;
import java.time.Duration;
public class blurImage {
public blurImage() {
Img img = new Img("ABC.png");
System.out.print("Size: ");
Scanner in = new Scanner(System.in);
int size = in.nextInt();
Instant start = Instant.now();
boxFilter(img, size);
Instant stop = Instant.now();
System.out.println("Elapsed time: " Duration.between(start, stop).toMillis() "ms");
img.save();
}
public void boxFilter(Img i, int size) {
//Your code here
// prepare 2d img array
int pad_size = (int)(size 1)/2-1;
int new_height = i.height pad_size*2;
int new_width = i.width pad_size*2;
int[][] array2doutput = new int[new_height][new_width];
// 1. Padding at the top
for (int h=0; h<pad_size; h ) {
for (int w=0; w<new_width; w ) {
array2doutput[h][w]=0;
}
}
// 2. Padding Original image Padding
// Padding
for (int h=pad_size; h<i.height pad_size; h ) {
for (int w=0; w<pad_size; w ) {
array2doutput[h][w]=0;
}
}
// Original image
int count = 0;
for (int h=pad_size; h<i.height pad_size; h ) {
for (int w=pad_size; w<i.width pad_size; w ) {
array2doutput[h][w]=(int)(i.img[count]amp;0xFF);
count ;
}
}
// Padding
for (int h=pad_size; h<i.height pad_size; h ) {
for (int w=i.width pad_size; w<new_width; w ) {
array2doutput[h][w]=0;
}
}
// 3. Padding at the bottom
for (int h=i.height pad_size; h<new_height; h ) {
for (int w=0; w<new_width; w ) {
array2doutput[h][w]=0;
}
}
// print img
for (int h=0; h<new_height; h ) {
for (int w=0; w<new_width; w ) {
System.out.print(array2doutput[h][w]);
System.out.print(" ");
}
System.out.println("");
}
double filter_v = 1/(Math.pow(size,2));
System.out.println(filter_v);
// apply filter to image
int ind = 0;
for (int h=pad_size; h<i.height pad_size; h ) {
for (int w=pad_size; w<i.width pad_size; w ) {
// for each pixel (y,x) intensity
double sum_v = 0.0;
for (int h_i=h-pad_size; h_i<h pad_size; h_i ){
for (int w_i=w-pad_size; w_i<w pad_size; w_i ){
sum_v = (double)array2doutput[h_i][w_i]*filter_v;
}
}
i.img[ind]=(byte)Math.round(sum_v);
ind ;
}
}
}
public static void main(String[] args) {
new blurImage();
}
}
Img.java:
import java.io.File;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import java.awt.image.DataBufferByte;
import java.awt.image.Raster;
import java.awt.Graphics2D;
import java.awt.geom.Line2D;
public class Img {
public byte[] img;
public int width;
public int height;
public Img(String fileName) {
load(fileName);
}
private void load(String fileName) {
try {
BufferedImage bi = (ImageIO.read(new File(fileName)));
width = bi.getWidth();
height = bi.getHeight();
img = ((DataBufferByte)bi.getRaster().getDataBuffer()).getData();
} catch (Exception ee) {
ee.printStackTrace();
}
}
public void save(String fileName) {
try {
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
bi.setData(Raster.createRaster(bi.getSampleModel(), new DataBufferByte(img, img.length), null));
ImageIO.write(bi, "png", new File(fileName));
} catch (Exception ee) {
ee.printStackTrace();
}
}
public void saveHistogram(int[] h) {
try {
int width = 512;
int height = 256;
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY);
Graphics2D g2 = bi.createGraphics();
int max = 0;
for (int i=0;i<h.length;i ) if (h[i]>max) max = h[i];
for (int i=0;i<h.length;i ) {
g2.draw(new Line2D.Double(2*i, height, 2*i, height-rescale(h[i], max)));
g2.draw(new Line2D.Double(2*i 1, height, 2*i 1, height-rescale(h[i], max)));
}
ImageIO.write(bi, "png", new File("out.png"));
} catch (Exception ee) {
ee.printStackTrace();
}
}
private int rescale(int in, int max) {
return (int)(in*255.0/max);
}
}
Комментарии:
1. Да, вы правы! В нем не хватало только ‘