Как может одна реализация эффект линзы подозрительного взгляда, проиллюстрированный в том изображении:
Можно использовать логотип Google для попытки:
BTW, каков термин для него?
Я считаю, что это обычно называют эффектом «линзы рыбий глаз» или «бочкообразной трансформацией». Вот две ссылки на демонстрации, которые я нашел:
Пример кода для того, как вы можете применить искажение «рыбий глаз» к изображениям с помощью опции 'custom'
для функции maketform
из Панель инструментов обработки изображений .
Демонстрационная программа обработки изображений , которая выполняет преобразование ствола с использованием функции tformarray
.
В этом примере я начал с функции 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 :
[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
И вот изображение, которое вы должны увидеть:
Вы можете отрегулировать степень искажения, изменив третье значение в массиве options
, которое является экспоненциальная степень, используемая при радиальной деформации точек изображения.
Думаю, вы имеете в виду эффект линзы рыбий глаз . Вот код для имитации рыбьего глаза в Matlab.
Для записи:
Этот эффект является разновидностью радиального искажение называется «бочкообразным искажением».
Для получения дополнительной информации см .:
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])
Это даст вам круговой фрейм, который вы ищете, но артефакты наложения спектров могут оказаться слишком большими, чтобы иметь дело с ними.