このグレースケール画像に赤などの色を塗りつぶす必要があります。私はいくつかの特定の点を満たす必要があるので、Flood Fillアルゴリズムを使用すると考えました。アンチエイリアスグレースケールイメージのフラッドフィルアルゴリズムJava
私はこの方法を見つけました。しかし、画像の線のアンチエイリアシングのために、結果には醜い白い部分があります。
: カラーtargetColor =ホワイト、 色replacementColor =赤。
私は、白だけでなく、よりグレーの色に交換する必要があると思います。
私はこの方法に固執して少し変更する必要がありますか?または何か他のものを見つけるために? 「はい」の場合、変更するものは?
私もこのリンクを試してみましたが、それは動作しません:
noblemaster.com/public/download/FloodFill.java.htmlのイメージのため
リンク:
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);
}
}
「正確な」白色と比較しないでください。白のピクセルの距離を計算してみてください。もしそれがいくつかの* X *値より小さければ赤く塗るべきです。 – raven
これは助けることができます:http://stackoverflow.com/questions/2103368/color-logic-algorithm – raven
それは動作しますが、まだ私は逃したものがまだあります。もし私が白から透明に変えたいなら。 rgbはアルファ成分を考慮しないので、色の距離はできません。しかし、私は別の質問のためだと思う.. –