2011-01-20 3 views
0

これは、各RGBチャンネルのエッジを検出して最終的な出力として表示するエッジ検出を行っています。私はバイナリイメージを表示していないので、今は3つを組み合わせることに問題があります。代わりに、いくつかの色があります。私はRGBの各バイナリイメージをチェックして、それは白黒イメージを与えるうまく動作します。明確になるように、次のコードである:それは何も表示さdoesntのアルファ値を除去する際、しかしRGBバイナリ画像を結合する際の問題

int alpha = 0xff000000; 
int combine = alpha | (red <<16) | (green <<8)|blue; 

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

     inputbuff = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); 

     Graphics r = inputbuff.getGraphics(); 
     r.drawImage(inputimage, 0, 0, null); 
     r.dispose(); 

     process_red = new int[width * height]; 
     process_green = new int[width * height]; 
     process_blue = new int[width * height]; 
     process_grey = new int[width * height]; 
     process_rgb = new int[width * height]; 
     process_combine = new int[width * height]; 

     for (int i = 0; i < 256; i++) { 
      freq_red[i] = freq_green[i] = freq_blue[i] = freq_grey[i] = 0; 
     } 

     for (int x = 0; x < width; x++) { 
      for (int y = 0; y < height; y++) { 
       int clr = inputbuff.getRGB(y, x); 

       int red = (clr & 0x00ff0000) >> 16; 
       int green = (clr & 0x0000ff00) >> 8; 
       int blue = clr & 0x000000ff; 
       int grey = (11 * red + 16 * green + 5 * blue)/32; 

       freq_red[red] += 1; 
       freq_green[green] += 1; 
       freq_blue[blue] += 1; 
       freq_grey[grey] += 1; 
      } 
     } 

     int threshold = 150; 
     for (int i = 0; i < 256; i++) { 
      freq_red[i] = applyThreshold(threshold, freq_red[i]); 
      freq_green[i] = applyThreshold(threshold, freq_green[i]); 
      freq_blue[i] = applyThreshold(threshold, freq_blue[i]); 
      freq_grey[i] = applyThreshold(threshold, freq_grey[i]); 
     } 

     for (int x = 0; x < width; x++) { 
      for (int y = 0; y < height; y++) { 
       int clr = inputbuff.getRGB(y, x); 

       int red = (clr & 0x00ff0000) >> 16; 
       int green = (clr & 0x0000ff00) >> 8; 
       int blue = clr & 0x000000ff; 
       int grey = (11 * red + 16 * green + 5 * blue)/32; 

       red = freq_red[red]; 
       green = freq_green[green]; 
       blue = freq_blue[blue]; 
       grey = freq_grey[grey]; 


       int alpha = 0xff000000; 
      int combine = alpha | (red <<16) |(green <<8)|blue; 

       process_red[x * height + y] = (0xFF<<24)|(red<<16)|(red<<8)|red; 
       process_green[x * height + y] = (0xFF<<24)|(green<<16)|(green<<8)|green; 
       process_blue[x * height + y] = (0xFF<<24)|(blue<<16)|(blue<<8)|blue; 
       process_grey[x * height + y] = (0xFF<<24)|(grey<<16)|(grey<<8)|grey; 
       process_rgb[x * height + y] = clr; 
       process_combine[x * height + y] = combine; 

      } 
     } 

     image_red = new JFrame().createImage(new MemoryImageSource(width, height, process_red, 0, width)); 
     image_green = new JFrame().createImage(new MemoryImageSource(width, height, process_green, 0, width)); 
     image_blue = new JFrame().createImage(new MemoryImageSource(width, height, process_blue, 0, width)); 
     image_grey = new JFrame().createImage(new MemoryImageSource(width, height, process_grey, 0, width)); 
     image_rgb = new JFrame().createImage(new MemoryImageSource(width, height, process_rgb, 0, width)); 
     image_combine = new JFrame().createImage(new MemoryImageSource(width, height, process_combine, 0, width)); 

     buff_red = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB); 
     buff_green = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB); 
     buff_blue = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB); 
     buff_grey = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB); 
     buff_rgb = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB); 
     buff_combine = new BufferedImage(width,height, BufferedImage.TYPE_INT_RGB); 

     graph_red = buff_red.getGraphics(); 
     graph_green = buff_green.getGraphics(); 
     graph_blue = buff_blue.getGraphics(); 
     graph_grey = buff_grey.getGraphics(); 
     graph_rgb = buff_rgb.getGraphics(); 
     graph_combine = buff_combine.getGraphics(); 

     graph_red.drawImage(image_red, 0, 0, null); 
     graph_green.drawImage(image_green, 0, 0, null); 
     graph_blue.drawImage(image_blue, 0, 0, null); 
     graph_grey.drawImage(image_grey, 0, 0, null); 
     graph_rgb.drawImage(image_rgb, 0, 0, null); 
     graph_combine.drawImage(image_combine, 0, 0, null); 

     graph_red.dispose(); 
     graph_green.dispose(); 
     graph_blue.dispose(); 
     graph_grey.dispose(); 
     graph_rgb.dispose(); 
     graph_combine.dispose(); 


     repaint(); 
} 

私はこの問題は、アルファ値であることが疑われます。誰でも私を助けてくれますか?前もって感謝します!

+0

すべてのサンプル出力イメージ? –

+0

ここに画像をアップロードすることはできませんが、http://img593.imageshack.us/i/basicrgbsample.png/で感謝することができます。 –

答えて

0

私はfreq_redなどがバイト配列であると推測しています。もしそうなら、あなたはbyte sign extensionに噛まれています。

red = freq_red[red] & 0xFF; 
green = freq_green[green] & 0xFF; 
blue = freq_blue[blue] & 0xFF; 
grey = freq_grey[grey] & 0xFF; 

更新:あなたの方法は、もはやそれが原因など、すべての一時的な画像(graph_redで必要以上にある

はこれでこの

red = freq_red[red]; 
green = freq_green[green]; 
blue = freq_blue[blue]; 
grey = freq_grey[grey]; 

を交換してみてください)あなたは次のようなメソッドを定義することでそれらを避けることができます:

private BufferedImage wrapPixelArray(int width, 
            int height, 
            int[] process) { 
    DataBuffer db = new DataBufferInt(process, width * height); 
    SampleModel sm = 
     new SinglePixelPackedSampleModel(DataBuffer.TYPE_INT, width, height, MASK); 
    WritableRaster wr = 
     Raster.createWritableRaster(sm, db, null); 
    return new BufferedImage(RGB, wr, false, null); 
} 

private static final int[] MASK = {0xFF0000, 0xFF00, 0xFF}; 
private static final ColorModel RGB = 
    new DirectColorModel(32, MASK[0], MASK[1], MASK[2]); 
+0

こんにちは、応答のためのthx。私はそれを変更しようとしましたが、それでも出力画像に何らかの色が付いています。別の方法では、int結合をint combine = Math.max(blue、Math.max(red、green))に変更してみましたが、それはさらに悪く、何も表示されません。私は透明な色でアルファを使用することを考えていましたが、そこには何も透明な色がありますか? –

関連する問題