Можем ли мы генерировать "foveated Image" в Mathematica
" Foveated imaging - это технология цифровой обработки изображений, в которой разрешение изображения или количество деталей различаются по изображению в соответствии с одним или больше" точек фиксации ". Точка фиксации указывает область изображения с высоким разрешением и соответствует центру сетчатки глаза, фовеа".
![enter image description here]()
Я хочу использовать такой образ, чтобы проиллюстрировать остроту зрения людей. На следующей диаграмме показана относительная острота левого человеческого глаза (горизонтальная секция) в градусах от фовеа (Википедия):
![enter image description here]()
Есть ли способ создать изображение в Mathematica с использованием возможностей его обработки изображений?
Ответы
Ответ 1
Что-то в следующих строках может работать для вас. Детали фильтрации должны быть скорректированы с учетом ваших вкусов.
lena = ExampleData[{"TestImage", "Lena"}]
![lena]()
ImageDimensions[lena]
==> {512, 512}
mask = DensityPlot[-Exp[-(x^2 + y^2)/5], {x, -4, 4}, {y, -4, 4},
Axes -> None, Frame -> None, Method -> {"ShrinkWrap" -> True},
ColorFunction -> GrayLevel, ImageSize -> 512]
![mask]()
Show[ImageFilter[Mean[Flatten[#]] &, lena, 20, Masking -> mask], ImageSize -> 512]
![enter image description here]()
Ответ 2
Следуя ответу Sjoerd, вы можете Fold[]
размытие, зависящее от радиуса, следующим образом.
Модель для остроты (очень грубая модель):
Clear[acuity];
acuity[distance_, x_, y_, blindspotradius_] :=
With[{\[Theta] = ArcTan[distance, Sqrt[x^2 + y^2]]},
Clip[([email protected][-Abs[\[Theta]]/(15. Degree)] - .05)/.95,
{0,1}] (1. - Boole[(x + 100.)^2 + y^2 <= blindspotradius^2])]
Plot3D[acuity[250., x, y, 25], {x, -256, 256}, {y, -256, 256},
PlotRange -> All, PlotPoints -> 40, ExclusionsStyle -> Automatic]
![Acuity of fovea model]()
Пример изображения:
size = 100;
lena = ImageResize[ExampleData[{"TestImage", "Lena"}], size];
Manipulate[
ImageResize[
Fold[Function[{ima, r},
ImageFilter[(Mean[Flatten[#]] &), ima,
7*(1 - acuity[size*5, r, 0, 0]),
Masking -> Graphics[Disk[p/2, r],
PlotRange -> {{0, size}, {0, size}}]
]],
lena, Range[10, size, 5]],
200],
{{p, {size, size}}, Locator}]
Некоторые примеры:
![Acuity example 1]()
![Acuity example 2]()
Ответ 3
WaveletMapIndexed
может давать пространственно изменяющееся размытие, как показано в документации Mathematica (WaveletMapIndexed- > Примеры- > Приложения- > Обработка изображений). Ниже приведена реализация foveatedBlur
с использованием скомпилированной версии функции acuity
из другого ответа:
Clear[foveatedBlur];
foveatedBlur[image_, d_, cx_, cy_, blindspotradius_] :=
Module[{sx, sy},
{sy, sx} = [email protected];
[email protected][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, [email protected]/2}, Locator, Appearance -> None}]
![Foveated Image Example with blind spot]()
Посмотрите на мертвое место?