как создать такое изображение в Mathematica - PullRequest
16 голосов
/ 08 июня 2011

Я думаю о том, как обработать изображение для генерации the following effect в Mathematica, учитывая его мощные возможности обработки изображений. Кто-нибудь может дать некоторое представление о том, как это сделать?

Большое спасибо.

Ответы [ 2 ]

15 голосов
/ 08 июня 2011

Вот одна версия, использующая текстуры.Конечно, он не действует как реальный объектив, он просто повторяет части изображения с перекрытием.

t = CurrentImage[];

(* square off the image to avoid distortion *)
t = ImageCrop[t, {240,240}];

n = 20; 
Graphics[{Texture[t], 
   Table[
     Polygon[
       Table[h*{Sqrt[3]/2, 0} + (g - h)*{Sqrt[3]/4, 3/4} + {Sin[t], Cos[t]}, 
         {t, 0., 2*Pi - Pi/3, Pi/3}
         ], 
       VertexTextureCoordinates -> Transpose[{
         Rescale[
           (1/4)*Sqrt[3]*(g - h) + (Sqrt[3]*h)/2., 
           {-n/2, n/2}, 
           {0, 1}
           ] + {0, Sqrt[3]/2, Sqrt[3]/2, 0, -(Sqrt[3]/2), -(Sqrt[3]/2)}/(n/2), 
         Rescale[
           (3.*(g - h))/4, 
           {-n/2, n/2}, 
           {0, 1}
           ] + {1, 1/2, -(1/2), -1, -(1/2), 1/2}/(n/2)
         }]
      ], 
      {h, -n, n, 2}, 
      {g, -n, n, 2}
    ]
  }, 
  PlotRange -> n/2 - 1
]

Вот код выше, примененный к стандартному тесту изображения ( Лена )

enter image description here

8 голосов
/ 08 июня 2011

«Я думаю, что это может быть хорошо аппроксимировано вычисленным смещением для изображения в каждой ячейке» - Mr.Wizard

Точно! Как видно из восстановленного изображения, эффект линзы отсутствует, а плитки - это просто смещения.

enter image description here

Вам понадобится Hexagonal_tessellation и простой алгоритм для расчета смещения для каждого шестиугольника из некоторой выбранной центральной точки (вес / 2, рост / 2).

...