1

私は2Dフィルタリングを行っており、グレースケールのBufferedImagesで要素ごとに追加したいと考えています。私のためにこれを完了する既存の関数はありますか、それとも最初から作成する必要がありますか?

この問題を単純化するためにラスターをマトリックスに変換するある種のマトリックスクラスはありますか?

編集:ここにそれの一般的な要点があります

    BufferedImageOp opX = new ConvolveOp(new Kernel(3,3, kernelX));
    BufferedImageOp opY = new ConvolveOp(new Kernel(3,3, kernelY));
    BufferedImage filtImageX = opX.filter(sourceImage, null);
    BufferedImage filtImageY = opY.filter(sourceImage, null);
    BufferedImage outputImage = addBufferedImages(filtImageX, filtImageY);

グレースケール変換:

public void toGrayscale() { 
     BufferedImageOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null); 
     sourceImage = op.filter(sourceImage, null); 
}
4

2 に答える 2

1

私はあなたのためにそれを行うJavaライブラリに精通していません。

[i、j]でピクセルを取得するには、次のようにします。image.getRGB(i, j);

BufferedImage image = ...;
BufferedImage resultImage = ...

int rgb= image.getRGB(i, j);
resultImage.setRGB(i, j, rgb);

バッファリングされた画像をバイト配列に変換することもできます[ https://stackoverflow.com/a/7388025/1007845 ]。
このスレッドを参照してください: Javaで画像をバイト配列に変換する方法は? 取得するにはWritableRaster

編集:

この場合、WritableRasterが役立つようです:http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/image/WritableRaster.html

WritableRaster raster = image.getRaster();

for(int h=0;h<height;h++) {
    for(int w=0;w<width;w++) {
        int colour = 127;
      raster.setSample(w,h,0,colour); 
   }
}
于 2012-03-12T15:40:53.203 に答える
1

これを行う直接的な方法はわかりません。

しかし、私は少し手に負えないアプローチを提案することができます. まず、2 つの画像を取得し、それらを 2 つのバンドを持つ 1 つの画像に結合します。これを行う方法の詳細については、ぼんやりしています。BandedSampleModelを使用してRasterを作成し、他の 2 つの画像の内容をそのDataBufferにブリットすると思います。ソース イメージの (1 バンクの) DataBuffer の配列をバンクとして使用する 2 バンクの DataBuffer を作成できるように見えますが、これによりコピーが回避されます。

2 バンドの画像ができたら、バンドを合計するBandCombineOpを適用するだけです。総和を行列として表現する必要がありますが、それは難しいことではありません。結果を再スケーリングしたい場合は、[1.0、1.0]、または[0.5、0.5]になると思います。

于 2012-03-12T18:08:47.777 に答える