Фильтр коробки в Java с нуля сделал выходное изображение более темным проблема

#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. Да, вы правы! В нем не хватало только ‘