2016-10-17 54 views
0

我正在使用透明颜色去除背景颜色的脚本。ImageMagic php中的模糊洪水填充 - 制作透明图像

剧本是这样的,并给出了确定的结果,区分紫红色。

 $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); 

但是,它留下了图像周围颜色的痕迹。这里有一个例子,当我试图去除白色背景的电话周围的边框 - 你可以清楚地看到边缘的白色痕迹。

enter image description here

的问题是 - 做一个洪水填补像素0,0时,背景色被着色错了,我需要一个“模糊”的油漆桶填充功能。 Imagemagic为floodFillPaintImage提供了“模糊”算法,但“模糊”部分的参数仅用作像素的选择,而不是模糊着色。

例如,我有一个100%的白色 - 算法正确选择完美的白色背景,并填充一个新的完美紫红色图像。当你设置一个“模糊”参数,算法正确选择 80%的白色像素(例如),但它再次以100%紫红色着色。这就是出现丑角的问题。

ImageMagic支持像“真”模糊泛滥填充和“真实”模糊paintTransparentImage?或者有人对如何解决这个问题有更好的想法?

回答

3

我有一点点去了。我不能说我对此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 

ObjectOnTransparent.png

enter image description here

Alpha.png

enter image description here

AlphaEdges.png

enter image description here

Diff.png

enter image description here

EdgexDiff.png

enter image description here

ReEdged Α。PNG

​​

Result.png

enter image description here

+0

非常感谢你的帮助,它确实帮助我得到的问题开始。然而,EdgexDiff.png有时会产生边框,这些边框对于某些图像来说太薄。这绝对比我原始的方法好,但仍然不是很好 – user151496