图像 – 在MATLAB中展开半圆柱的图片

我的问题如下:

《图像 – 在MATLAB中展开半圆柱的图片》

我从水平视角拍摄了一个半圆柱的图片,上面有方形网格线,所以我想知道如何在MATLAB中实现打开这个半圆柱体以使我的所有网格单元变成相同的尺寸?我知道我将在边缘单元格中放松大量的分辨率,并且简单的线性插值应该可以解决这个问题,但我不知道如何告诉MATLAB这样做.我也知道圆柱的几何特性,半径和高度.任何帮助是极大的赞赏.

这是我正在使用的方法,但我试图找到使边缘与内部单元格大小相同的转换.

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)

最佳答案 我认为转型比你想做的要简单得多.看看(向前)转换,采取平面网格并将其包裹在圆柱体周围.沿圆柱轴线的坐标(在这种情况下为y坐标)不变.如果我们将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]);

结果:

《图像 – 在MATLAB中展开半圆柱的图片》

这仍然不完美,主要是因为原始图像周围有边框,我们正在与图像的其余部分一起转换.这可以通过裁剪图像以仅包含圆柱部分来改善.

点赞