Bir görüntü beyaz arka plan çıkarın ve şeffaf olun
* Aşağıdaki işlemleri yapmak için çalışıyoruz:
RMagick remove white background from image and make it transparent
Ama gerçek fotoğraflar ile berbat (görüntü etrafında bir hale varmış gibi) bakıyor biter.
Şimdiye kadar denedik:
unground0[img_] := With[{mask = ChanVeseBinarize[img, TargetColor->{1.,1.,1.}]},
Rasterize[SetAlphaChannel[img, ImageApply[1-#&, mask]], Background->None]]]
İşte bu bir örnek.
Orijinal resim:
Beyaz arka plan ile görüntü arka plan ile (ya da, gösteri için, pembe bir arka plan) yerine:
Halo kurtulmak için herhangi bir fikir? LevelPenalty gibi verdiği şeyleri, tek halo uzak bir görüntü kaybetme pahasına gidip alabilirim.
Ödül için çözümler, lütfen yukarıdaki gibi çözüm yapı, yani bir resim alır ve şeffaf arka plan ile bir görüntü verir, kendi kendine yeten bir işlev adlı unground-bir şey. bir karşılaştırma yapabiliyorum o Yüzden EDİT: Çok teşekkürler, herkes!
CEVAP
Bu işlev, ters küçük ama görünür ek bir iyileşme için Mark Fidye tarafından açıklanan karışımı uygular:
reverseBlend[img_Image, alpha_Image, bgcolor_] :=
With[
{c = ImageData[img],
a = ImageData[alpha] 0.0001, (* this is to minimize ComplexInfinitys and considerably improve performance *)
bc = bgcolor},
ImageClip@
Image[Quiet[(c - bc (1 - a))/a, {Power::infy,
Infinity::indet}] /. {ComplexInfinity -> 0, Indeterminate -> 0}]
]
Bu arka plan temizleme işlevi vardır. threshold
parametre minSizeCorrection
verdiği için ikiye ayırma sonra kaldırılacak küçük önemsiz bileşenleri boyutu sınırı bu resmi ilk ikiye ayırma için kullanılır.
removeWhiteBackground[img_, threshold_: 0.05, minSizeCorrection_: 1] :=
Module[
{dim, bigmask, mask, edgemask, alpha},
dim = ImageDimensions[img];
bigmask =
DeleteSmallComponents[
ColorNegate@
MorphologicalBinarize[ColorNegate@ImageResize[img, 4 dim], threshold],
Round[minSizeCorrection Times @@ dim/5]];
mask = ColorNegate@
ImageResize[ColorConvert[bigmask, "GrayScale"], dim];
edgemask =
ImageResize[
ImageAdjust@DistanceTransform@Dilation[EdgeDetect[bigmask, 2], 6],
dim];
alpha =
ImageAdd[
ImageSubtract[
ImageMultiply[ColorNegate@ColorConvert[img, "GrayScale"],
edgemask], ImageMultiply[mask, edgemask]], mask];
SetAlphaChannel[reverseBlend[img, alpha, 1], alpha]
]
Fonksiyon testleri:
img = Import["http://i.stack.imgur.com/k7E1F.png"];
background =
ImageCrop[
Import["http://cdn.zmescience.com/wp-content/uploads/2011/06/\
forest2.jpg"], ImageDimensions[img]];
result = removeWhiteBackground[img]
ImageCompose[background, result]
Rasterize[result, Background -> Red]
Rasterize[result, Background -> Black]
Nasıl çalışır kısa açıklama:
Nispeten hassas keskin kenarlar üretir favori binariaztion yönteminizi seçin
-Ölçekli bir görüntü uygulamak, özgün boyut
mask
elde edilen fakir o zaman. Bu bize kenar yumuşatma sağlar. İşin büyük kısmı bitmiş.Küçük bir gelişme, uyum resmin üzerine bir arka plan kullanarak parlaklığı kendi olumsuz olarak alfa, sonra karışım elde edilen görüntü üzerinde orijinal ince bir bölge etrafında kenarları (
edgemask
) azaltmak için görünürlük beyaz piksel üzerinde kenarları. Alfa kanalı, bu işlemler için ilgili hesaplanan (biraz şifreliImageMultiply/Add
ifade).Şimdi ters bir karışım yapmak, böylece alfa kanalı tahmini var.
Adım 3 ve 4 o kadar geliştirmek yok, ama fark görülüyor.
Yerine beyaz arka plan ile PNG görüntü...
Şeffaf arka plan ile giriş kutuları IE...
Ne kadar şeffaf bir arka plan ile bir ...
CSS ile arka plan görüntü boyutunu aya...
Nasıl div arka plan rengini CSS ile şe...