MATLAB中半圆柱展开图

yh2wf1be  于 2022-11-24  发布在  Matlab
关注(0)|答案(1)|浏览(267)

我的问题如下:

我有一张从水平Angular 拍摄的半圆柱体的图片,上面有正方形的网格线,所以我想知道如何在MATLAB中实现展开这个半圆柱体,使我所有的网格单元变得相同大小?我知道我会在边缘单元中丢失很多分辨率,一个简单的线性插值应该可以做到这一点。但我不知道如何告诉MATLAB做这件事。2我也知道圆柱体的几何性质,半径和高度。3任何帮助都非常感谢。
这是我正在使用的方法,但我试图找到的转换,将使边缘是相同的大小作为内部细胞。

im=imread('Capture.png');
imshow(im);
impixelinfo

r = @(x) sqrt(x(:,1).^2 + x(:,2).^2);
w = @(x) atan2(x(:,2), x(:,1));
f = @(x) [sqrt(r(x)) .* cos(w(x)), sqrt(r(x)) .* sin(w(x))];
g = @(x, unused) f(x);

tform2 = maketform('custom', 2, 2, [], g, []);
im3 = imtransform(im, tform2, 'UData', [-1 1], 'VData', [-1 1], ...
'XData', [-1 1], 'YData', [-1 1]);

figure,
imshow(im3)
ep6jt1vc

ep6jt1vc1#

我认为这种转换比您要做的要简单得多。(正向)变换,以获取平面网格并将其环绕圆柱体。沿着圆柱体轴的坐标如果我们取x方向上的网格坐标的范围为[-1,1],圆柱体上的坐标将是:
sin(x × π/2)
由于这是从栅格到圆柱体的“正向”变换,因此也是从圆柱体到栅格的“反向”变换。

f = @(x, unused) [sin(x (:, 1) * pi / 2), x(:, 2)]
tform2 = maketform('custom', 2, 2, [], f, []);
im3=imtransform(img, tform2, 'UData', [-1 1], 'VData', [-1 1], ...
                             'XData', [-1 1], 'YData', [-1 1]);

结果:

这仍然不是完美的,主要是因为原始图像周围有边框,我们要将其与图像的其余部分沿着进行变形。这可以通过裁剪图像使其只包含圆柱体部分来改善。

相关问题