tienen - ¿Cómo puedo implementar un efecto de lente de ojo de pez(transformación de barril) en MATLAB?
quitar efecto ojo de pez photoshop (3)
¿Cómo se puede implementar el efecto de lente de ojo de pez ilustrado en esa imagen?
Uno puede usar el logo de Google para probar:
Por cierto, ¿cuál es el término para eso?
Para que conste:
Este efecto es un tipo de distorsión radial llamada "distorsión de barril".
Para obtener más información, consulte:
http: //en.wikipedia.org/wiki/Distortion_(optics)
Aquí hay un método diferente para aplicar un efecto similar a la distorsión de barril mediante el mapeo de textura (adaptado de la documentación de 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])
Esto le dará el marco circular que está buscando pero los artefactos de aliasing podrían ser demasiado para tratar.
Creo que esto se conoce comúnmente como un efecto de "ojo de pez" o una "transformación de barril". Aquí hay dos enlaces a demos que encontré:
Código de ejemplo de cómo puede aplicar distorsiones de ojo de pez a las imágenes utilizando la opción
''custom''
para elmaketform
función de la Caja de herramientas de procesamiento de imágenes .Una demostración de procesamiento de imágenes que realiza una transformación de barril con la función
tformarray
.
Ejemplo
En este ejemplo, comencé con la función radial.m
del primer enlace de arriba y modifiqué la forma en que relaciona los puntos entre los espacios de entrada y salida para crear una bonita imagen circular. La nueva función fisheye_inverse
se da a continuación, y debe colocarse en una carpeta en su ruta MATLAB para que pueda usarla más adelante en este ejemplo:
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
La distorsión de ojo de pez se ve mejor cuando se aplica a imágenes cuadradas, por lo que querrá hacer que las imágenes cuadren recortándolas o rellenándolas con un poco de color. Dado que la transformación de la imagen no se verá bien para las imágenes indexadas , también deseará convertir cualquier imagen indexada en imágenes RGB utilizando ind2rgb
. Las imágenes en escala de grises o binarias también funcionarán bien. A continuación, le indicamos cómo hacer esto para su muestra del logotipo de 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
Ahora podemos crear la transformación con maketform
y aplicarla con imtransform
(o imwarp
como se recomienda en las versiones más nuevas):
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
Y aquí está la imagen que debes ver:
Puede ajustar el grado de distorsión cambiando el tercer valor en la matriz de options
, que es la potencia exponencial utilizada en la deformación radial de los puntos de la imagen.