如何在 MATLAB 中实现鱼眼镜头效果(桶形变换)?

     2023-02-22     139

关键词:

【中文标题】如何在 MATLAB 中实现鱼眼镜头效果(桶形变换)?【英文标题】:How can I implement a fisheye lens effect (barrel transformation) in MATLAB? 【发布时间】:2010-04-07 03:37:57 【问题描述】:

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

大家可以试试谷歌的logo:

顺便说一句,它的术语是什么?

【问题讨论】:

链接失效。它给出了一条消息:You don't have permission to access the requested object. 等一下,我来修复它.. 【参考方案1】:

我相信这通常被称为“鱼眼镜头”效果或“桶形变换”。以下是我找到的两个演示链接:

Sample code 了解如何使用来自Image Processing Toolbox 的函数maketform'custom' 选项将鱼眼扭曲应用于图像。

An image processing demo 使用函数tformarray 执行桶形变换。

示例

在此示例中,我从 first link above 中的函数 radial.m 开始,并修改了它在输入和输出空间之间关联点的方式以创建漂亮的圆形图像。新函数fisheye_inverse 如下所示,它应该放在MATLAB path 上的一个文件夹中,以便稍后在此示例中使用它:

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

鱼眼失真在应用于方形图像时看起来最好,因此您需要通过裁剪或填充一些颜色来使图像呈方形。由于图像的转换不适用于indexed images,因此您还需要使用ind2rgb 将任何索引图像转换为RGB images。 Grayscale 或 binary images 也可以正常工作。以下是如何为您的示例执行此操作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

这是您应该看到的图像:

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

【讨论】:

我应该把那些.m 文件放在哪里才能让它工作? 您将文件放入 Matlab 路径上的任何文件夹中。例如,当您启动 Matlab 时,键入“pwd”并按回车键。显示的路径是您可以放置​​文件的位置。 哦,它可以,但是角落不是那么圆,如何调整参数以在我的帖子中获得类似的效果? 它不适用于像我帖子中的谷歌徽标这样的真彩色图像。 @ibrahimmahrir:已修复,不感谢 photobucket 的那些混蛋。 ;)【参考方案2】:

我认为您指的是fisheye 镜头效果。 Here是matlab中模仿鱼眼的代码。

【讨论】:

【参考方案3】:

仅作记录:

这种效果是一种称为“桶形畸变”的径向畸变。

更多信息请见:

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

这是一种使用纹理映射(改编自MATLAB Documentation)应用类似于桶形失真效果的不同方法:

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

这将为您提供您正在寻找的圆形框架,但锯齿伪影可能太多而无法处理。

【讨论】:

圆形边框很好看,但是图像模糊,如何克服? 您可以尝试增加图像大小或使用高分辨率图像开始。它还取决于您的图形堆栈如何处理此类映射。积极的一面是,您可以将图像映射到任意表面并获得“狂欢节镜子”效果...... 你能用你提到的carnival mirror更新代码吗?

如何通过openCV模拟鱼眼镜头效果?

】如何通过openCV模拟鱼眼镜头效果?【英文标题】:HowtosimulatefisheyelenseffectbyopenCV?【发布时间】:2010-12-2723:34:07【问题描述】:我正在寻找创建鱼眼镜头效果的方法,查看了openCV的文档,看起来它包含用于鱼眼等径向失真的相机... 查看详情

鱼眼镜头的坐标变换

鱼眼拍摄的全景图像  坐标变换后的结果为 查看详情

在Matlab中去除图像的鱼眼镜头失真时出错[重复]

】在Matlab中去除图像的鱼眼镜头失真时出错[重复]【英文标题】:ErrorinremovingthefisheyelensdistortionofanimageinMatlab[duplicate]【发布时间】:2015-06-2912:00:56【问题描述】:我有以下图片:我想从这张图片中去除鱼眼镜头失真,所以我使用... 查看详情

鱼眼失真校正

...到了一种消除鱼眼镜头失真的算法,我尝试使用opencv在C++中实现它。当参数强度接近于零时,输​​出图像与输入图像完全相同 查看详情

如何在 ColumnTransformer 的管道中实现逆变换?

】如何在ColumnTransformer的管道中实现逆变换?【英文标题】:HowtoimplementinversetransformationinapipelineofaColumnTransformer?【发布时间】:2021-02-0902:05:39【问题描述】:我想了解如何在管道中应用逆变换,而不是直接使用StandardScaler函数。... 查看详情

我将如何通过仿射变换在opencv中实现这一点?

】我将如何通过仿射变换在opencv中实现这一点?【英文标题】:HowwouldIachievethisinopencvwithanaffinetransform?【发布时间】:2017-08-1922:00:10【问题描述】:我想知道如何复制此图像中正在执行的操作:分解:使用dlib(绿点)获取面部特... 查看详情

500万鱼眼摄像头多大范围

参考技术A对于500万像素鱼眼摄像头,它的视野角度在170°-180°之间,能够捕捉到更大范围的景象。 参考技术B鱼眼镜头主要特征:1.鱼眼镜头是指大于180度视场角镜头总称,180º鱼眼镜头、185º鱼眼镜头、190º鱼眼镜头、20... 查看详情

如何在颤动中实现这种效果/布局?

】如何在颤动中实现这种效果/布局?【英文标题】:Howtoachievethiseffect/layoutinflutter?【发布时间】:2021-10-0520:29:18【问题描述】:我发现,这种搜索效果是内置在ios框架中的。但是这种布局如何在Flutter中实现呢?【问题讨论】:... 查看详情

相机畸变与标定

...的放大率远大于边缘区域的放大率,常出现在广角镜头和鱼眼镜头中(下图中);3、线性畸变:光轴与相机所拍摄的诸如建筑物类的物体的垂平面不正交,则原本应该平行的远端一侧和近端一侧,以不相同的角度汇聚产生畸变... 查看详情

如何在android中实现这种折叠效果?

】如何在android中实现这种折叠效果?【英文标题】:Howtoachievethisfoldingeffectinandroid?【发布时间】:2012-09-1212:24:41【问题描述】:这是在ios上的效果像纸折叠的效果适用于iOS的PaperFold:https://github.com/honcheng/PaperFold-for-iOS【问题讨... 查看详情

如何在 Flutter 中实现“磨砂玻璃”效果?

】如何在Flutter中实现“磨砂玻璃”效果?【英文标题】:HowdoIdothe"frostedglass"effectinFlutter?【发布时间】:2017-09-1822:29:18【问题描述】:我正在编写一个Flutter应用程序,我想使用/实现iOS上常见的“磨砂玻璃”效果。我该怎... 查看详情

如何在unity中实现拖尾效果

...会添加拖尾或者鼠标点击的特效,接下来就说说在unity中如何实现拖尾效果,首先unity中有个组件,叫TrailRenderer,在Component——>Effect——>TrailRenderer中添加,根据自己需要的效果设置自己需要的颜色,然后还有相... 查看详情

如何在 UITable 中实现 Instagram 评论的效果?

】如何在UITable中实现Instagram评论的效果?【英文标题】:howcaniaccomplishtheeffectofinstagramcommentsinaUITable?【发布时间】:2013-12-0523:57:06【问题描述】:当我们在cmets中滚动时,我想完成instagram的效果,它像这样隐藏键盘:我知道它不... 查看详情

如何在导航栏菜单中实现平滑的向下滑动效果

】如何在导航栏菜单中实现平滑的向下滑动效果【英文标题】:HowtoachievesmootheslidedowneffectinNavbarMenu【发布时间】:2018-03-2404:43:24【问题描述】:目标-我想在一些滚动后实现向下滑动(用于导航栏)效果。我实际上实现了我想要... 查看详情

你如何在 iOS 中实现“时钟擦除”/径向擦除效果?

】你如何在iOS中实现“时钟擦除”/径向擦除效果?【英文标题】:Howdoyouachievea"clockwipe"/radialwipeeffectiniOS?【发布时间】:2014-03-1415:24:29【问题描述】:有时您会看到正在使用的“时钟擦除”动画。像这样的:你将如何在iO... 查看详情

如何在android中实现图像视图的缩放效果?

】如何在android中实现图像视图的缩放效果?【英文标题】:Howtoimplementzoomeffectforimageviewinandroid?【发布时间】:2012-01-1400:26:57【问题描述】:我必须实现图像缩放,我尝试了很多代码。但我没有完全了解手势事件。我想在我们应... 查看详情

WinUI3如何在桌面应用中实现亚克力窗口效果?

】WinUI3如何在桌面应用中实现亚克力窗口效果?【英文标题】:HowtoimplementacrylicwindowseffectinWinUI3indesktopapplication?【发布时间】:2022-01-1020:39:39【问题描述】:在使用VS2022创建WinUI3(WindowsAppSDK1.0)项目时,我无法在Windows上实现亚克... 查看详情

如何在 Google Tango 中统一使用鱼眼相机?

】如何在GoogleTango中统一使用鱼眼相机?【英文标题】:HowtousefisheyecamerainunityinGoogleTango?【发布时间】:2017-03-2812:31:53【问题描述】:我想使用GoogleTango的鱼眼相机拍摄环境照片,然后对其进行分析。但是,如何在Unity环境中实现... 查看详情