Как реализовать эффект объектива «рыбий глаз» (трансформация бочки) в MATLAB? - PullRequest
9 голосов
/ 07 апреля 2010

Как реализовать эффект «рыбий глаз», показанный на этом изображении:

fisheye example

Можно попробовать логотип Google:

alt text

Кстати, какой у него срок?

Ответы [ 3 ]

13 голосов
/ 07 апреля 2010

Я полагаю, что это обычно называют эффектом «рыбьего глаза» или «бочкообразной трансформацией».Вот две ссылки на демонстрации, которые я нашел:

Пример

В этом примере я начал с функции radial.m с первой ссылки над и изменил способ, которым он связывает точки между входным и выходным пространством, чтобы создать красивое круглое изображение.Новая функция fisheye_inverse приведена ниже, и ее следует поместить в папку на вашем пути MATLAB , чтобы вы могли использовать ее позже в этом примере:

function U = fisheye_inverse(X, T)

  imageSize = T.tdata(1:2);
  exponent = T.tdata(3);
  origin = (imageSize+1)./2;
  scale = imageSize./2;

  x = (X(:, 1)-origin(1))/scale(1);
  y = (X(:, 2)-origin(2))/scale(2);
  R = sqrt(x.^2+y.^2);
  theta = atan2(y, x);

  cornerScale = min(abs(1./sin(theta)), abs(1./cos(theta)));
  cornerScale(R < 1) = 1;
  R = cornerScale.*R.^exponent;

  x = scale(1).*R.*cos(theta)+origin(1);
  y = scale(2).*R.*sin(theta)+origin(2);
  U = [x y];

end

Искажение «рыбий глаз»выглядит лучше всего применительно к квадратным изображениям, поэтому вам нужно будет сделать их квадратными, обрезав их или добавив к ним немного цвета.Поскольку преобразование изображения будет выглядеть неправильно для проиндексированных изображений , вам также необходимо преобразовать любые проиндексированные изображения в RGB-изображений , используя ind2rgb. Оттенки серого или бинарных изображений также будут работать нормально.Вот как это сделать для вашего образца Google logo :

[X, map] = imread('logo1w.png');  % Read the indexed image
rgbImage = ind2rgb(X, map);       % Convert to an RGB image
[r, c, d] = size(rgbImage);       % Get the image dimensions
nPad = (c-r)/2;                   % The number of padding rows
rgbImage = cat(1, ones(nPad, c, 3), rgbImage, ones(nPad, c, 3));  % Pad with white

Теперь мы можем создать преобразование с помощью maketform и применить его с помощью imtransform (или imwarp, как рекомендуется в новых версиях):

options = [c c 3];  % An array containing the columns, rows, and exponent
tf = maketform('custom', 2, 2, [], ...  % Make the transformation structure
               @fisheye_inverse, options);
newImage = imtransform(rgbImage, tf);   % Transform the image
imshow(newImage);                       % Display the image

И вот изображение, которое вы должны увидеть:

enter image description here

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

1 голос
/ 07 апреля 2010

Только для записи:

Этот эффект представляет собой тип радиального искажения, называемого "бочкообразное искажение".

Для получения дополнительной информации см .:

http: //en.wikipedia.org/wiki/Distortion_(optics)

Вот другой метод применения эффекта, похожего на искажение бочки, с использованием наложения текстуры (адаптировано из Документация MATLAB ):

[I,map] = imread('logo.gif');
[h,w] = size(I);

sphere; 

hS = findobj('Type','surface');

hemisphere = [ones(h,w),I,ones(h,w)];

set(hS,'CData',flipud(hemisphere),...
    'FaceColor','texturemap',...
    'EdgeColor','none')

colormap(map)
colordef black
axis equal
grid off
set(gca,'xtick',[],'ztick',[],'ytick',[],'box','on')
view([90 0])

Это даст вам круговую рамку, которую вы ищете, но артефакты с алиасами могут быть слишком сложными.

1 голос
/ 07 апреля 2010

Я думаю, вы имеете в виду эффект объектива рыбий глаз . Здесь - некоторый код для имитации рыбьего глаза в matlab.

...