others - 在MATLAB中,如何实现鱼眼镜头效果?

如何实现该图像中的鱼眼镜头效果:

fisheye example

alt text

时间:

这通常称为"鱼眼镜头"效果或"barrel变换",以下是我找到的两个演示链接:

例子


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

灰阶二进制图像也可以正常工作,


[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


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

下面是你应该看到的图像:

alt text

可以通过更改options数组中的第三个值来调整失真程度,这是图像点径向变形中使用的指数幂。

我认为你是指鱼眼镜头效果。 在这里,是一些模仿鱼眼在matlab中的代码。

只是为了记录:

这种效果是一种径向失真称为"桶形失真"

有关详细信息,请参阅:

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


[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])

...