WaveletMapIndexed
может дать пространственно-размытое размытие, как показано в документации Mathematica (WaveletMapIndexed-> Примеры-> Приложения-> Обработка изображений) .Вот реализация foveatedBlur
с использованием скомпилированной версии функции acuity
из другого ответа:
Clear[foveatedBlur];
foveatedBlur[image_, d_, cx_, cy_, blindspotradius_] :=
Module[{sx, sy},
{sy, sx} = ImageDimensions@image;
InverseWaveletTransform@WaveletMapIndexed[ImageMultiply[#,
Image[acuityC[d, sx, sy, -cy + sy/2, cx - sx/2, blindspotradius]]] &,
StationaryWaveletTransform[image, Automatic, 6], {___, 1 | 2 | 3 | 4 | 5 | 6}]]
, где скомпилированная острота равна
Clear[acuityC];
acuityC = Compile[{{distance, _Real}, {sx, _Integer}, {sy, _Integer}, {x0, _Real},
{y0, _Real}, {blindspotradius, _Real}},
Table[With[{\[Theta] = ArcTan[distance, Sqrt[(x - x0)^2 + (y - y0)^2]]},
(Exp[-Abs[\[Theta]]/(15 Degree)] - .05)/.95
*(1. - Boole[(x - x0)^2 + (y - y0 + 0.25 sy)^2 <= blindspotradius^2])],
{x, Floor[-sx/2], Floor[sx/2 - 1]}, {y, Floor[-sy/2], Floor[sy/2 - 1]}]];
РасстояниеПараметр устанавливает скорость падения остроты зрения.Точка фокусировки {cx,cy}
и радиус слепой зоны говорят сами за себя.Вот пример использования Manipulate
, смотрящий прямо в правый глаз Лены:
size = 256;
lena = ImageResize[ExampleData[{"TestImage", "Lena"}], size];
Manipulate[foveatedBlur[lena, d, p[[1]], p[[2]], 20], {{d, 250}, 50,
500}, {{p, ImageDimensions@lena/2}, Locator, Appearance -> None}]
Видите слепое пятно?