use*_*496 1 php algorithm background colors imagemagick
我正在编写一个用透明颜色删除背景颜色的脚本。
脚本是这样的,给出的结果还可以,可以区分紫红色。
$val = 65535/40;
//divide by fuzz dilution, 1 is none
$val = floatval($val/0.9);
//create white border
$image->borderImage ( "rgb(255,255,255)" , 1 , 1 );
//make all white fill fuchsia
$image->floodFillPaintImage ( "rgb(255, 0, 255)" ,$val*3, "rgb(255,255,255)", 0 , 0, false);
//make fuchsia transparent
$image->paintTransparentImage("rgb(255,0,255)", 0.0, 0.5);
//remove border 1px that was added above
$image->shaveImage ( 1 , 1 );
Run Code Online (Sandbox Code Playgroud)
然而,它会在图像周围留下颜色的痕迹。这是我尝试删除白色背景手机周围边框的示例 - 您可以清楚地看到边缘上的白色痕迹。
问题是 - 当对像素 0,0 进行洪水填充时,背景颜色颜色错误,我需要一个“模糊”桶填充函数。Imagemagic为floodFillPaintImage提供了“模糊”算法,但“模糊”部分的参数仅起到像素选择的作用,并不能起到模糊着色的作用。
例如,我有一个 100% 白色 - 算法正确地选择了完美的白色背景,并用新的、完美的紫红色图像填充它。当您设置“模糊”参数时,算法会正确选择80% 白色像素(例如),但会再次使用 100% 紫红色对其进行着色。这就是丑角问题出现的地方。
ImageMagic 是否支持“真正的”模糊洪水填充和“真正的”模糊paintTransparentImage 之类的功能?或者有人对如何解决这个问题有更好的想法?
我对此做了一点尝试。我不能说我对此 100% 满意,但我已经解释了我在做什么并完成了一些小步骤,因此您可以尝试每个步骤并摆弄数字。为了简单起见,我只是在命令行中完成了它。如果你达到了你想要的程度,一切都可以得到简化和加速。
#!/bin/bash
# Get size of original
sz=$(convert -format "%wx%h" phone.png info:)
# Floodfill background area with transparency
convert phone.png -fuzz 5% -fill none -draw 'color 0,0 floodfill' ObjectOnTransparent.png
# Extract alpha channel
convert ObjectOnTransparent.png -alpha extract Alpha.png
# Extract edges of alpha channel - experiment with thickness
convert Alpha.png -edge 1 AlphaEdges.png
# Get difference from background for all pixels
convert phone.png \( +clone -fill white -colorize 100% \) -compose difference -composite Diff.png
# Multiply edges with difference, so only edge pixels will have a chance of getting through to final mask
convert AlphaEdges.png Diff.png -compose multiply -composite EdgexDiff.png
# Extend Alpha by differences at edges
convert Alpha.png EdgexDiff.png -compose add -composite ReEdgedAlpha.png
# Apply new alpha to original image
convert phone.png \( ReEdgedAlpha.png -colorspace gray \) -compose copyopacity -composite RemaskedPhone.png
# Splat RemaskedPhone over red background
convert -size $sz xc:red RemaskedPhone.png -composite Result.png
Run Code Online (Sandbox Code Playgroud)
对象透明.png
阿尔法.png
AlphaEdges.png
差异.png
EdgexDiff.png
ReEdgedAlpha.png
结果.png