bugfix> java > 投稿

学校の課題では、ノイズの多いPNG画像にメディアンフィルターを適用する必要があります。 私は次のものを持っています:

public static void main(String[] a) throws Throwable {
    final String extension = "png";
    final String input = "input1.png";
    final String output = "output1.png";
    final int threadsAmount = 4;
    long startTime = System.currentTimeMillis();
    final Image image = new Image(input, output, extension);
    image.applyMedian(threadsAmount);
    long duration = System.currentTimeMillis() - startTime;
    System.out.println("duration: " + duration);
}

画像にメディアンフィルターを適用し、バッファリングされた画像を作成し、それを読み取り、平均値を計算し、それらを新しい画像にエクスポートされる新しいbufferedImageに入れる方法。

public void applyMedian(int threadAmount) throws IOException, Exception {
    File imageFile = new File(this.input);
    BufferedImage bufferedImage = ImageIO.read(imageFile);
    int imageHeight = bufferedImage.getHeight();
    int imageWidth = bufferedImage.getWidth();
    BufferedImage finalImage = new BufferedImage(imageWidth, imageHeight, bufferedImage.getType());
    int heightPerThread = imageHeight / threadAmount;
    Color[] surroundedPixel = new Color[9];
    int[] R = new int[9];
    int[] B = new int[9];
    int[] G = new int[9];
    for (int j = 1; j < bufferedImage.getHeight() - 1; j++) {
        for (int i = 1; i < bufferedImage.getWidth() - 1; i++) {
            surroundedPixel[0] = new Color(bufferedImage.getRGB(i - 1, j - 1));
            surroundedPixel[1] = new Color(bufferedImage.getRGB(i - 1, j));
            surroundedPixel[2] = new Color(bufferedImage.getRGB(i - 1, j + 1));
            surroundedPixel[3] = new Color(bufferedImage.getRGB(i, j + 1));
            surroundedPixel[4] = new Color(bufferedImage.getRGB(i + 1, j + 1));
            surroundedPixel[5] = new Color(bufferedImage.getRGB(i + 1, j));
            surroundedPixel[6] = new Color(bufferedImage.getRGB(i + 1, j - 1));
            surroundedPixel[7] = new Color(bufferedImage.getRGB(i, j - 1));
            surroundedPixel[8] = new Color(bufferedImage.getRGB(i, j));
            for (int k = 0; k < 9; k++) {
                R[k] = surroundedPixel[k].getRed();
                B[k] = surroundedPixel[k].getBlue();
                G[k] = surroundedPixel[k].getGreen();
            }
            Arrays.sort(R);
            Arrays.sort(G);
            Arrays.sort(B);
            finalImage.setRGB(i, j, new Color(R[4], B[4], G[4]).getRGB());
        }
    }
    ImageIO.write(finalImage, this.getExtension(), new File(this.output));
}

メインには、スレッドの量を定義する整数があります。私たちのアイデアと割り当ては、画像全体の高さを部分的に分割し、複数のスレッドに中央値を計算させることです。

int heightPerThread = imageHeight / threadAmount;

ただし、スレッドの作成方法は学習しましたが、上記のメソッドにこれらすべてのスレッドを適用し、すべてのスレッドにイメージの独自の部分を処理させる方法はわかりません。

誰かが助けてくれることを願っています。

回答 1 件
  • これには、 applyMedian から呼び出すことができる追加の関数を追加する必要があると思います 。追加の関数は、左上隅のピクセル位置 (i, j) を取ることができます  スレッドが処理する高さと幅。次のように表示できます。

    public static void main(String[] a) throws Throwable {
        final String extension = "png";
        final String input = "input1.png";
        final String output = "output1.png";
        final int threadsAmount = 4;
        long startTime = System.currentTimeMillis();
        final Image image = new Image(input, output, extension);
        image.applyMedian(threadsAmount);
        long duration = System.currentTimeMillis() - startTime;
        System.out.println("duration: " + duration);
    }
    
    

    そしてあなたの applyMedian  次のように変更する必要があります。

    public void applyMedian(int threadAmount) throws IOException, Exception {
        File imageFile = new File(this.input);
        BufferedImage bufferedImage = ImageIO.read(imageFile);
        int imageHeight = bufferedImage.getHeight();
        int imageWidth = bufferedImage.getWidth();
        int heightPerThread = imageHeight / threadAmount;
        int widthPerThread = imageWidth / threadAmount
        BufferedImage finalImage = new BufferedImage(imageWidth, imageHeight, bufferedImage.getType());
        // create threads here
        // make all threads invoke the new function here
    }
    
    

    そして、新しい関数は、finalImageオブジェクト、左上隅の位置、heightPerThread、widthPerThreadを引数として受け取り、applyMedian自体で現在行っている処理を行う必要があります。

    public newFunction(Image finalImage, int i, int j, int heightPerThread, int widthPerThread) {
        // do all processing here
        // call finalImage.setRGB
    }
    
    

    お役に立てれば !

あなたの答え