2016-10-25 4 views
0

私の問題を説明しましょう。私はいくつかの数学的計算(非常に難しい)をするサービスを持っています。それはある種の統計計算です。このサービスは、ブール値の2次元配列を返します(boolean [] [] 400x400)。私は後にすることは、この配列に対応する画像を作成します。閉じた線を表す画像ピクセルを滑らかに処理する方法は?

BufferedImage im = new BufferedImage(area.length, area.length, BufferedImage.TYPE_INT_RGB); 
Graphics2D g2 = in.createGraphics(); 
g2.setColor(Color.BLACK); 
for (int i = 0; i < area.length; i++) { 
    for (int j = 0; j < area.length; j++) { 
     if (area[ i ][ j ]) { 
      g2.fillRect(j, i, 1, 1); 
     }    
    } 
} 
ImageIO.write(im, someformat, somefile); 

enter image description here

コードは非常に単純です。その結果、私はPic1を作成しています(添付ファイル参照)。黄色の境界線は、例えば、黄色の点(画像ピクセル)と同様に表示されます。 はまた、私はあなたにブール配列の一部のコンテンツを表示したい(それが唯一の例であり、私は0と1のように真と偽表示します):

{ 0,.0,............. .... ............0 } 
.................... ... 
{ 0,0,0,0,0,1,1,.... .... ............0 } 
{ 0,0,0,1,1,0,1,.... .... ............0 } 
{ 0,0,1,1,0,0,0,1,1, .... ............0 } 
{ 0,0,0,1,0,0,0,1,0, .... ............0 } 
.................................. 
{ 0,.0,............. .... ............0 } 

だから私はPIC1が言ったように私が持っている結果として。はい、私はこの絵がとても奇妙に見えることを知っています。実際にはどのような形状でも構いませんが、常に閉じられます。この画像は非常に醜いと思われる代わりに、私はいくつかの曲線のようにいくつかの幅と任意の粗さなしで描画したい。私はPic2に表示しようとしています(ええ.....それも醜いです...私の絵は悪いです)。

画像処理における私のスキルと知識は悪く、私は明らかに助けと説明が必要です。 Javaを使って私の目標を達成することは全く不可能かもしれません。知りません。私に助けてくれる図書館などがあるかもしれません。

お返事ありがとうございます。ありがとうございます。

+1

あなたはポイント(X = J、yと[I、J]に「1」を考慮することができます= i)、それを補間するために一連のベジェ曲線またはスプラインを使用します。 – loginpassword

+0

"-1"を押すのは簡単ですが、例を使って答えを少し拡張することはできますか?そして、私は配列の例を挙げています。なぜなら、値 "1"を持つ点の近くに値 "1"を持つ点があり、また問題は私が順序を知らなかったからです。これらの点のこの配列では、選択された[i、j]点の後にポイントがありません。私は自分の問題を解決しようとしていますが、私の評価を上げません。 –

答えて

0

私はこのテクニックMSGPR(またはsee here)と同じことをしたいと思います。これはマルチスケールスムージングマッチングコンターテクニックです。

基本的に、著者はパターン輪郭をparametric equationとみなします。次に、曲線x [t]とy [t]をガウスフィルタで別々に滑らかにします。滑らかになればなるほど、輪郭が簡単になります。

+0

あなたの答えをありがとう。とても助けてくれます。私のソリューションは以下の通りです。 –

0

答えによると、私は研究のために時間を費やし、最終的に解決策を見つけました。
私は2つの同様の質問first postsecond postを見つけました。どちらもopencvライブラリに関する。
OpenCVのドキュメントのいくつかを読んだ後、私は私の問題は私の上記のコードに次の行を追加し解決しています:

g2.dispose(); 
    BufferedImage result = new BufferedImage(im.getHeight(), im.getWidth(), TYPE_INT_RGB); 
    g2.createGraphics(); 

    Mat src = new Mat(im.getHeight(), im.getWidth(), CvType.CV_8UC1); 
    src.put(0, 0, ((DataBufferByte) im.getRaster().getDataBuffer()).getData()); 
    List<MatOfPoint> contours = new ArrayList<>(); 
    Imgproc.findContours(src, contours, new Mat(), Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE, new Point(0, 0)); 

    for (MatOfPoint point: contours) { 

      MatOfPoint2f source = new MatOfPoint2f(); 
      point.convertTo(source, CvType.CV_32F); 
      MatOfPoint2f gb= new MatOfPoint2f(); 
      Imgproc.GaussianBlur(source, gb, new Size(3, 3), 0, 0); 
      Polygon polygon = new Polygon(); 
      gb.toList().stream().forEach(p -> polygon.addPoint((int) p.x, (int) p.y)); 
      g2.setColor(Color.WHITE); 
      g2.drawPolygon(polygon); 
    } 

    ImageIO.write(result, format, file); 
関連する問題