Bu işlev, ek küçük ama gözle görülür bir iyileştirme için Mark Ransom tarafından açıklanan ters 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 kaldırma işlevidir. threshold
Parametre görüntünün ilk çiftlemeye için kullanılan, minSizeCorrection
çiftlemeye sonra kaldırılır küçük önemsiz bileşenleri boyut sınırını verdiği içindir.
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]
]
Fonksiyonun test edilmesi:
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ıştığına dair kısa açıklama:
Nispeten hassas keskin kenarlar üreten favori ikili arıtma yönteminizi seçin
Yukarı ölçeklenmiş bir görüntüye uygulayın, ardından elde edilenin mask
boyutunu orijinal boyuta küçültün . Bu bize kenar yumuşatma verir. İşin çoğu bitti.
Küçük bir iyileştirme için, görüntüyü negatifinin parlaklığını alfa olarak kullanarak arka planla karıştırın, ardından elde edilen görüntüyü orijinalin edgemask
üzerinde, kenarlardaki beyaz piksellerin görünürlüğünü azaltmak için kenarların etrafındaki ince bir bölgede ( ) karıştırın. Bu işlemlere karşılık gelen alfa kanalı hesaplanır (bir şekilde şifreli ImageMultiply/Add
ifade).
Şimdi alfa kanalının bir tahminine sahibiz, böylece tersine harmanlama yapabiliriz.
Adım 3 ve 4 o kadar gelişmez, ancak fark görünür.