学校の課題では、ノイズの多い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 件
関連記事
- sklearnパイプラインの列に複数の前処理ステップを適用します
- ミューテックスなしで、複数のスレッドを使用して共有メモリに書き込む
- Rで関数を複数回すばやく適用する
- ポッドで同じイメージの複数のコンテナーを実行するか、複数のポッドを実行するか、複数のノードで実行するか
- R:複数のデータフレームに関数を適用する
- AndroidでUIをブロックせずに複数のスレッドが終了するのを待つ方法は?
- パンダの複数の列にapply()関数を適用しますか?
- Androidのレトロフィットを使用して単一のPOSTメソッドでテキストデータ、単一の画像、複数の画像を投稿するにはどうすればよいですか?
- 複数の画像をフラッターで表示および更新する方法
- random_shear拡張を画像テンソルに適用します
これには、
applyMedian
から呼び出すことができる追加の関数を追加する必要があると思います 。追加の関数は、左上隅のピクセル位置(i, j)
を取ることができます スレッドが処理する高さと幅。次のように表示できます。そしてあなたの
applyMedian
次のように変更する必要があります。そして、新しい関数は、finalImageオブジェクト、左上隅の位置、heightPerThread、widthPerThreadを引数として受け取り、applyMedian自体で現在行っている処理を行う必要があります。
お役に立てれば !