Po prostu zastąp każdy piksel „prawie zbliżony do białego” pikselem o tym samym kolorze RGB i sigmoidalnym gradiencie na kanale przezroczystości. Możesz zastosować liniowe przejście od bryły do przezroczystości, ale sinusoida, sigmoida lub tanh wyglądają bardziej naturalnie, w zależności od ostrości krawędzi, której szukasz, szybko odchodzą od medium do stałego lub przezroczystego, ale nie w stopniowym / binarnym sposób, który masz teraz.
Pomyśl o tym w ten sposób:
Powiedzmy, że każdy z R, G, B ma wartość 0,0-1,0, a następnie przedstawmy biały jako pojedynczą liczbę jako R + G + B = 1,0 * 3 = 3,0.
Usunięcie odrobiny każdego koloru sprawia, że jest on trochę „złamanej bieli”, ale usunięcie odrobiny wszystkich trzech kolorów jest o wiele bardziej osłabione niż trochę z któregokolwiek. Powiedzmy, że pozwalasz na redukcję o 10% na dowolnym kanale: 1,0 * .10 = 0,1, Teraz rozłóż tę stratę na wszystkie trzy i połącz ją między 0 a 1 dla kanału alfa, jeśli jest mniejsza niż 0,1, czyli ( strata = 0,9) => 0 i (strata = 1,0) => 1:
threshold=.10;
maxLoss=1.0*threshold;
loss=3.0-(R+G+B);
alpha=If[loss>maxLoss,0,loss/maxLoss];
(* linear scaling is used above *)
(* or use 1/(1 + Exp[-10(loss - 0.5maxLoss)/maxLoss]) to set sigmoid alpha *)
(* Log decay: Log[maxLoss]/Log[loss]
(for loss and maxLoss <1, when using RGB 0-255, divide by 255 to use this one *)
setNewPixel[R,G,B,alpha];
Na przykład:
maxLoss = .1;
Plot[{ 1/(1 + Exp[-10(loss - 0.5maxLoss)/maxLoss]),
Log[maxLoss]/Log[loss],
loss/maxLoss
}, {loss, 0, maxLoss}]
Jedynym niebezpieczeństwem (lub korzyścią?), Które w tym tkwi, jest to, że nie obchodzą go białe, które tak naprawdę SĄ częścią zdjęcia. Usuwa wszystkie białka. Więc jeśli masz zdjęcie białego samochodu, skończy się to na przezroczystych plamach. Ale z twojego przykładu wydaje się, że jest to pożądany efekt.