2011-02-08 13 views
1

私は最後の1年間ですEngg.iは私の最終年度のプロジェクトのために少し修正してスケッチ生成アルゴリズムを実装したいと思います。これは私がアクセスして、 Matlabで提示されているように数字の点ではRGBのようになります)。アルゴリズムはmatlabでうまく動作しますが、プロジェクトの要件のために、私はJavaでそれを行うつもりです。インターネットやさまざまなJavaフォーラムを通って行くことは私を助けませんでした。
Matlabコードでは、次のスニペットを使用してピクセルにアクセスできます。
120,234のピクセル強度値は、Aが考慮中のイメージの名前である場合、 "A(120,234)"となります。
同様に私はJavaでイメージのピクセル強度値にアクセスし、アルゴリズムでそれらを変更したいと思います。
誰かが私を助けてくれたらとても嬉しいです。事前に
おかげ修正されたスケッチ生成をJavaで実装する

答えて

2

あなたはMATLABへのアクセス権を持っているので、私は自分のイメージのものが、私はそれがあると思うし、彼らは強度にRGBを変換する方法を見ていると、MATLABで書かれていると仮定すると、そのコードを掘り下げることをお勧めしたいです。彼らはHSL(Hue-Saturation-Luminance)を使用していますか?または他の色変換。それを知っているならば、たとえばRGBをHSLに変換するためのJavaコードを見つけることができます。

編集:
このコードのコメントによれば、このコードはうまくいくと思います。私はすべての操作をコピーして書き直さなかったので、それは完全ではありませんが、それはあなたに考えを与えるはずです。

import java.awt.image.BufferedImage; 
import java.io.File; 

import javax.imageio.ImageIO; 

public class Convolution { 
    public static void main(String[] args) throws Exception { 
     File inputFile = new File("apple.jpg"); 
     BufferedImage bufferedImage = ImageIO.read(inputFile); 
     int w = bufferedImage.getWidth(); 
     int h = bufferedImage.getHeight(); 

     System.out.println("w=" + w + ", h=" + h); 

     // Get Pixels 
     int[] image = new int[w * h]; 
     bufferedImage.getRGB(0, 0, w, h, image, 0, w); 

     // Convert to simple grayscale 
     for (int y = 0; y < h; y++) { 
      for (int x = 0; x < w; x++) { 
       int idx = (y * w) + x; 
       int p = image[idx]; 
       int r = p & 0x00FF0000 >> 16; 
       int g = p & 0x0000FF >> 8; 
       int b = p & 0x000000FF; 
       image[idx] = (int) ((r + g + b)/3.0); 
      } 
     } 

     int convolutionSize = 3; 
     int[][] convolution = { { 0, -1, 0 }, { -1, 4, -1 }, { 0, -1, 0 } }; 

     int[] newImage = new int[w * h]; 
     // Apply the convolution to the whole image, note that we start at 
     // 1 instead 0 zero to avoid out-of-bounds access 
     for (int y = 1; y + 1 < h; y++) { 
      for (int x = 1; x + 1 < w; x++) { 
       int idx = (y * w) + x; 

       // Apply the convolution 
       for (int cy = 0; cy < convolutionSize; cy++) { 
        for (int cx = 0; cx < convolutionSize; cx++) { 
         int cIdx = (((y - 1) + cy) * w) 
           + ((x - 1) + cx); 
         newImage[idx] += convolution[cy][cx] * image[cIdx]; 
        } 
       } 

       // pixel value rounding 
       if (newImage[idx] < 0) { 
        newImage[idx] = -newImage[idx]; 
       } else { 
        newImage[idx] = 0; 
       } 
       if (newImage[idx] > 0) { 
        newImage[idx] = 120 - newImage[idx]; 
       } else { 
        newImage[idx] = 255; 
       } 

      } 
     } 

     // Convert to "proper" grayscale 
     for (int y = 0; y < h; y++) { 
      for (int x = 0; x < w; x++) { 
       int idx = (y * w) + x; 
       int p = newImage[idx]; 
       newImage[idx] = 0xFF000000 | (p << 16) | (p << 8) | p; 
      } 
     } 

     // Set the image to have the new values; 
     bufferedImage.setRGB(0, 0, w, h, newImage, 0, w); 

     // Write the new image as a PNG to avoid lossey compression, 
     // and its eaiser than trying to display an image in Java. 
     ImageIO.write(bufferedImage, "png", new File("new_apple.png")); 
    } 
} 

編集:
は期待通りに動作するようにコードを修正しました。その高速ではないが、それは動作します。
前に:
Before

後:
After

+1

一部のコード:http://www.f4.fhtw-berlin.de/~barthel/ImageJ/ColorInspector//HTMLHelp/farbraumJava.htm –

+0

suggestion.iに感謝しましたが、私は言いましたが、強度値を取得する方法のMatlabsの適切な言及。 Javaでは、私が得る値は6から8桁の数字であり、それも負のnumber.iではJavaのさまざまなクラスをRasterクラスやColorクラスのように試しましたが、十分に役に立たなかった。 – jack1689

+0

これはカラー画像ですか、グレースケール画像ですか?どのフォーマットがJPEG、GIF、...ですか? matlabでイメージをロードするために使用しているコードを与えることができますか?私は 'A = imread(filename)'を実行していて、 'A'という行列を直接操作していると仮定します。これは正しいです? – troutinator

0

あなたが使用したいことは、あなたが/書き込み画素を読み取るために使用することができますwritableRaster得ることができ、そこからbufferedImage、であるように私には思えます値。

また、bufferedImageとやりとりする方法については、this tutorialも参照してください。

+0

私はbufferedImagesとRaster classes.butを使用しようとしましたが、彼らは十分な有用性を持っていませんでした。 – jack1689

関連する問題