2016-05-11 6 views
1

このグレースケール画像に赤などの色を塗りつぶす必要があります。私はいくつかの特定の点を満たす必要があるので、Flood Fillアルゴリズムを使用すると考えました。アンチエイリアスグレースケールイメージのフラッドフィルアルゴリズムJava

私はこの方法を見つけました。しかし、画像の線のアンチエイリアシングのために、結果には醜い白い部分があります。

: カラーtargetColor =ホワイト、 色replacementColor =赤。

私は、白だけでなく、よりグレーの色に交換する必要があると思います。

私はこの方法に固執して少し変更する必要がありますか?または何か他のものを見つけるために? 「はい」の場合、変更するものは?

私もこのリンクを試してみましたが、それは動作しません:

noblemaster.com/public/download/FloodFill.java.htmlのイメージのため

リンク:

image without red color

image with filled red color

public void floodFill(BufferedImage image, Point node, Color targetColor, Color replacementColor) { 
     int width = image.getWidth(); 
     int height = image.getHeight(); 
     int target = targetColor.getRGB(); 
     int replacement = replacementColor.getRGB(); 
     if (target != replacement) { 
      Deque<Point> queue = new LinkedList<Point>(); 
      do { 
      int x = node.x; 
      int y = node.y; 
      while (x > 0 && image.getRGB(x - 1, y) == target) { 
       x--; 
      } 
      boolean spanUp = false; 
      boolean spanDown = false; 
      while (x < width && image.getRGB(x, y) == target) { 
       image.setRGB(x, y, replacement); 
       if (!spanUp && y > 0 && image.getRGB(x, y - 1) == target) { 
       queue.add(new Point(x, y - 1)); 
       spanUp = true; 
       } else if (spanUp && y > 0 && image.getRGB(x, y - 1) != target) { 
       spanUp = false; 
       } 
       if (!spanDown && y < height - 1 && image.getRGB(x, y + 1) == target) { 
       queue.add(new Point(x, y + 1)); 
       spanDown = true; 
       } else if (spanDown && y < height - 1 && image.getRGB(x, y + 1) != target) { 
       spanDown = false; 
       } 
       x++; 
      } 
      } while ((node = queue.pollFirst()) != null); 
     } 
     } 
+0

「正確な」白色と比較しないでください。白のピクセルの距離を計算してみてください。もしそれがいくつかの* X *値より小さければ赤く塗るべきです。 – raven

+0

これは助けることができます:http://stackoverflow.com/questions/2103368/color-logic-algorithm – raven

+0

それは動作しますが、まだ私は逃したものがまだあります。もし私が白から透明に変えたいなら。 rgbはアルファ成分を考慮しないので、色の距離はできません。しかし、私は別の質問のためだと思う.. –

答えて

1

これは私が最後にしたもので、thisは最終的な画像です。

distanceOfColorはパラメータですが、私の場合は300-400の間に良い数字があり、すべての灰色のアンチエイリアスが消去されています。

public void floodFill(BufferedImage image, Point node, Color targetColor, Color replacementColor) { 
     int width = image.getWidth(); 
     int height = image.getHeight(); 
     int target = targetColor.getRGB(); 
     int replacement = replacementColor.getRGB(); 
     int distanceOfColor=320; 
     if (target != replacement) { 
      Deque<Point> queue = new LinkedList<Point>(); 
      do { 
      int x = node.x; 
      int y = node.y; 
      while (x > 0 && ColorDistance(image.getRGB(x - 1, y), target)<=distanceOfColor) { 
       x--; 
      } 
      boolean spanUp = false; 
      boolean spanDown = false; 
      while (x < width && ColorDistance(image.getRGB(x, y), target) <=distanceOfColor) { 
       image.setRGB(x, y, replacement); 
       if (!spanUp && y > 0 && image.getRGB(x, y - 1) == target) { 
       queue.add(new Point(x, y - 1)); 
       spanUp = true; 
       } else if (spanUp && y > 0 && ColorDistance(image.getRGB(x, y - 1), target) >distanceOfColor) { 
       spanUp = false; 
       } 
       if (!spanDown && y < height - 1 && ColorDistance(image.getRGB(x, y + 1), target) <=distanceOfColor) { 
       queue.add(new Point(x, y + 1)); 
       spanDown = true; 
       } else if (spanDown && y < height - 1 && ColorDistance(image.getRGB(x, y + 1), target) >distanceOfColor) { 
       spanDown = false; 
       } 
       x++; 
      } 
      } while ((node = queue.pollFirst()) != null); 
     } 
     } 
関連する問題