在 MATLAB 中展开半圆柱体的图片
unwrap picture of a half cylinder in 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 中实现展开这个半圆柱体,使我的所有网格单元都相同尺寸?我知道我会在边缘单元中降低很多分辨率,简单的线性插值应该可以解决问题,但我不知道如何告诉 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]);
结果:
这仍然不完美,主要是因为原始图像周围有边框,我们正在与图像的其余部分一起进行变换。这可以通过裁剪图像以仅包含圆柱体部分来改善。