-2

3 つのグレースケール画像 (それぞれ赤、緑、青を表す) を取得し、それらをマージ/平坦化する Java アプリケーションを作成しようとしています。1つのカラー画像を作成するために、私が使用できる既存のアルゴリズムまたは方法があるかどうか誰かが知っているかどうか疑問に思っていましたか? 私が以前に使用した ImageJ というプログラムがあることを理解しています。3 つの画像を選択すると、それらから RGB 画像を作成できます。これはルックアップ テーブルを使用して Java で行われることを知っています。

誰かがそれにアプローチするための最良の方法、既存のアルゴリズム、自分で作成できる方法などのアイデアを持っているなら、それは素晴らしいことです. 私は正しい方向に私を導くためだけに、私のためにコードを書いてくれる人を探しているわけではありません。R、G、B グレースケール画像ごとにすべてのピクセルを繰り返すという私の理論はうまくいかないのでしょうか?

事前に助けてくれてありがとう

4

1 に答える 1

3

sRGB 色空間で作業すると、これを行うメソッドを簡単に実装できます。

次の方法を検討してください。

private static BufferedImage createColorFromGrayscale(BufferedImage red, BufferedImage green, BufferedImage blue){
    BufferedImage base = new BufferedImage(red.getWidth(), red.getHeight(), BufferedImage.TYPE_INT_ARGB);

    for(int x = 0;x < red.getWidth();x++){
        for(int y = 0; y < red.getHeight(); y++){
            int rgb = (red.getRGB(x, y) & 0x00FF0000) | (green.getRGB(x, y) & 0x0000FF00) | (blue.getRGB(x, y) & 0x000000FF);

            base.setRGB(x, y, (rgb | 0xFF000000));
        }
    }

    return base;
}

新しいベース イメージを作成し、ビットごとの AND と OR を使用してカラー コンポーネントを作成し、ベース イメージに割り当てられる ARGB 形式の 4 バイトの整数色を作成します。for ループを使用して画像全体を反復処理することで、結果のベース画像の各ピクセルを各チャネルの色にそれぞれ設定できます。

この方法は、3 つのイメージのサイズがすべて等しいことを前提としています。画像のサイズが等しくない場合は、個別に処理する必要があります (たとえば、入力前に画像を引き伸ばすか、異なるサイズの画像を受け入れるようにメソッドを変更することにより)。

PS:大きな画像を扱う場合は、bufferedimage インスタンスの 1 つをベース画像として直接使用してメモリを節約する方が効率的かもしれません...

于 2013-10-20T12:28:45.587 に答える