Просто замените любой пиксель, «почти близкий к белому», пикселем того же цвета RGB и сигмоидальным градиентом на канале прозрачности.Вы можете применить линейный переход от твердого к прозрачному, но синусоида, сигмоид или танх выглядят более естественно, в зависимости от резкости искомого края, они быстро уходят от носителя к твердому или прозрачному, но не в пошаговом / двоичном видеЭто то, что у вас сейчас есть.
Подумайте об этом так:
Скажем, R, G, B каждый равен 0,0-1,0, тогда давайте представим белый как одно число как R+ G + B = 1,0 * 3 = 3,0.
Извлечение небольшого количества каждого цвета делает его немного "не совсем белым", но если брать немного из всех 3, это отнимает намного больше, чемнемного от любого.Допустим, вы разрешаете 10% -ное снижение на любом одном канале: 1,0 * .10 = .1. Теперь распределите эту потерю по всем трем и свяжите ее между 0 и 1 для альфа-канала, если она меньше, чем 0,1, так, чтобы (потеря = 0,9) => 0 и (потеря = 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];
Для справки:
maxLoss = .1;
Plot[{ 1/(1 + Exp[-10(loss - 0.5maxLoss)/maxLoss]),
Log[maxLoss]/Log[loss],
loss/maxLoss
}, {loss, 0, maxLoss}]
Единственная опасность (или выгода?), которую вы имеете в этомЭто то, что это не заботится о белых, которые на самом деле являются частью фотографии.Удаляет все белые.Так что, если у вас есть изображение белого автомобиля, в нем будут прозрачные пятна.Но из вашего примера это, кажется, желаемый эффект.