SORU
7 Kasım 2011, PAZARTESİ


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:

original image

Beyaz arka plan ile görüntü arka plan ile (ya da, gösteri için, pembe bir arka plan) yerine:

image with transparent background -- actually a pink background here, to make the halo problem obvious

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
11 Kasım 2011, Cuma


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]

Sample

Nasıl çalışır kısa açıklama:

  1. Nispeten hassas keskin kenarlar üretir favori binariaztion yönteminizi seçin

  2. -Ö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ş.

  3. 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 şifreli ImageMultiply/Add ifade).

  4. Ş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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • NextKsa

    NextKsa

    7 EKİM 2009
  • Tomas N

    Tomas N

    14 Kasım 2010
  • wwjoshdew

    wwjoshdew

    1 AĞUSTOS 2007