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

Posted

技术标签:

【中文标题】在Matlab中去除图像的鱼眼镜头失真时出错[重复]【英文标题】:Error in removing the fisheye lens distortion of an image in Matlab [duplicate] 【发布时间】:2015-06-29 12:00:56 【问题描述】:

我有以下图片:

我想从这张图片中去除鱼眼镜头失真,所以我使用了以下代码:

[X,map] = imread('Foam_Image.jpg');  % Read the indexed image
options = [size(X,1) size(X,2) 1];   % An array containing the columns, rows and exponent
tf = maketform('custom',2,2,[],...   % Make the transformation structure
               @fisheye_inverse,options);
newImage = imtransform(X,tf); 
imshow(newImage);                    % show image

但我收到以下错误:

Error using imtransform>parse_inputs (line 438)
XData and YData could not be automatically determined.  Try specifying XData and YData explicitly in the call to
IMTRANSFORM.

Error in imtransform (line 265)
args = parse_inputs(varargin:);

我也使用了imwarp 而不是imtransform,但我仍然收到错误消息。任何人都知道为什么我会收到此错误以及如何解决它?

【问题讨论】:

【参考方案1】:

如消息所述,您需要在使用名称-属性参数语法调用imtransform 期间手动指定XDataYData 属性。

根据docs,XData例如是:

一个二元素实向量,当与“YData”组合时,指定 输出图像 B 在二维输出空间中的空间位置 X-Y。 'XData' 的两个元素给出 x 坐标(水平) 分别是 B 的第一列和最后一列。

同样适用于YData。因此,您可以像这样修改对imtransform 的调用:

newImage = imtransform(X,tf,'XData',[1 col],'YData',[1 row]);

其中colrow 是您之前计算的大小函数的输出。

希望有帮助!

【讨论】:

感谢您的回答,但我仍然有错误。我确实喜欢这样:x = size(X,1); y = size(X,2); newImage = imtransform(X,tf,'XData',[1 x],'YData',[1 y]); XData 代表列数,所以这里应该是[ 1 size(X,2) ] 可能这不是错误的原因。 是的,对不起,我的意思是x=size(X,2),所以错误仍然存​​在。我认为我使用了错误的函数@fisheye_inverse,因为我想从已经失真的图像中去除鱼眼失真,而不是实现它。我认为这个函数实际上实现了失真。 嗯,是的,实际上我认为你是对的。 here函数你服了吗? 是的,没错。不幸的是,我不知道有什么函数可以逆转失真。

以上是关于在Matlab中去除图像的鱼眼镜头失真时出错[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何找到未失真的鱼眼图像和正常图像之间的差异?

鱼眼失真校正

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

图像提取基于matlab鱼眼图像有效区域提取含Matlab源码 2186期

图像检测显著图基于matlab失真提示鱼眼图显著图计算含Matlab源码 1903期

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