0

赤、緑、青の各要素を処理してエッジ マップ (白黒形式のバイナリ イメージ) を取得し、それらを 1 つにして出力を表示する必要があるイメージ検出を行っています。赤、緑、青のそれぞれの要素を抽出し、しきい値を設定してバイナリ イメージを取得した後、バイナリ イメージが表示されません。代わりに、グレースケールの画像が表示されます。誰か私を助けてくれませんか?これまでの私のコードは次のとおりです。

Buffered Image buff_red;
int[] process_red;
int width = 256; 
int height = 256;

private void processActionPerformed(java.awt.event.ActionEvent evt) { 
width = inputimage.getWidth(null);
height = inputimage.getHeight(null);

buff_red = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics r = buff_red.getGraphics();
r.drawImage(inputimage, 0, 0, null);
r.dispose();

//get the red element
process_red = new int[width * height];
counter = 0;
 for(int i = 0; i < 256; i++) {
     for(int j = 0; j < 256; j++) {
         int clr = buff_red.getRGB(j, i);
         int red = (clr & 0x00ff0000) >> 16;
         red = (0xFF<<24)|(red<<16)|(red<<8)|red;
         process_red[counter] = red;
         counter++;
     }
}

//set threshold value for red element
int threshold = 100;
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
     int bin = (buff_red.getRGB(x, y) & 0x000000ff);
     if (bin < threshold)
               bin = 0;
     else
               bin = 255;
     buff_red.setRGB(x,y, 0xff000000 | bin << 16 | bin << 8 | bin);
     }
}

アップデート:

の初期化はbuff_red、次の「get red element」(最初のループ) の前に行われました。

buff_red = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics r = buff_red.getGraphics();
r.drawImage(inputimage, 0, 0, null);

process_redエッジマップを取得できるように、画像をバッファリングしてしきい値処理に使用する必要がありますか?

4

1 に答える 1

1

コードから疑わしいと思われることの 1 つは、「赤い要素を取得するステップ」(最初のループ) が に書き込みprocess_redますが、しきい値処理ステップ (2 番目のループ) が から読み取るbuf_redことです。これはどこにも初期化されていないようです。これはタイプミスですか、それともコードのバグですか?

あなたはエッジ検出について言及していますが、あなたが投稿したコードにはエッジ検出のようなものは見当たりません。あなたがしているように見えるのは、赤(緑、青)チャネルを抽出し、それらをしきい値処理してから結合することだけです。

問題へのアプローチがより分析的であると役立ちます。問題が発生する最も早い時期はいつですか? 画像からチャンネルを正しく抽出していますか? エッジ検出画像は正しく見えますか? しきい値処理の結果は期待どおりですか? これらすべての質問に自分で答えることができます -- デバッグ イメージを記述/表示します。

最後に、理想的には、そのような低レベルのありふれたタスク (fetch pixel、mask by0xffなど) を手動でコーディングする必要はありません (少なくとも Java では)。最初は楽しいですが、その後はバグや予期しない機能の別のソースになります. 私は現在 Java を使用していませんが、そのようなタスクを処理できる画像処理 API があることは確かです。

于 2011-01-08T14:46:01.220 に答える