이 기능은 작지만 눈에 띄는 개선을 위해 Mark Ransom이 설명한 역방향 혼합을 구현합니다.
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}]
]
이것은 배경 제거 기능입니다. threshold
매개 변수 이미지의 이진화 초기에 사용되면,이 minSizeCorrection
이진화 후 제거되는 작은 쓰레기 성분의 크기 한도를 미세하게 조정할 것이다.
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]
]
기능 테스트 :
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]
작동 방식에 대한 간략한 설명 :
비교적 정확한 날카로운 모서리를 생성하는 선호하는 이진화 방법을 선택하십시오.
확대 된 이미지에 적용한 다음 얻은 이미지 mask
를 원래 크기 로 축소합니다 . 이것은 우리에게 앤티 앨리어싱을 제공합니다. 대부분의 작업이 완료되었습니다.
약간 개선하려면 네거티브의 밝기를 알파로 사용하여 이미지를 배경에 혼합 한 다음 얻은 이미지를 가장자리 주변의 얇은 영역 ( edgemask
) 에서 원본 위에 혼합하여 가장자리 의 흰색 픽셀의 가시성을 줄입니다. 이러한 연산에 해당하는 알파 채널이 계산됩니다 (다소 비밀스러운 ImageMultiply/Add
표현).
이제 우리는 리버스 블렌드를 할 수 있도록 알파 채널의 추정치를 얻었습니다.
3 단계와 4 단계는 그다지 개선되지 않지만 차이는 눈에 보입니다.