Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MATLAB将二维图像放置到半球中_Matlab_Image Processing - Fatal编程技术网

使用MATLAB将二维图像放置到半球中

使用MATLAB将二维图像放置到半球中,matlab,image-processing,Matlab,Image Processing,我正在尝试将2D图像放置到3D半球中。我有一个128x128大小的图像。我生成我的半球: [x,y,z] = sphere(127); x = x(64:end,:); y = y(64:end,:); z = z(64:end,:); Attempt = warp(x,y,z,Img) 我的图像是一个圆(如下所示)。我得到的是围绕半球的奇怪扭曲。然而,我基本上想要的是,如果我将图像放入半球(这不是我得到的),它会是什么样子 谢谢你能提供的任何帮助 您应该注意wrap函数在给定曲面上扭曲图

我正在尝试将2D图像放置到3D半球中。我有一个128x128大小的图像。我生成我的半球:

[x,y,z] = sphere(127);
x = x(64:end,:);
y = y(64:end,:);
z = z(64:end,:);

Attempt = warp(x,y,z,Img)
我的图像是一个圆(如下所示)。我得到的是围绕半球的奇怪扭曲。然而,我基本上想要的是,如果我将图像放入半球(这不是我得到的),它会是什么样子

谢谢你能提供的任何帮助


您应该注意
wrap
函数在给定曲面上扭曲图像的方式,并以某种方式准备曲面,使图像的中心保持在曲面的最小值上

在本例中,我使用MATLAB提供的以下图像(因为我没有您的图像,但结果相同):

现在我创建一个曲面,如下所示:

fx = @(u,v) u.* cos(v);  
fz = @(u,v) u.^2;        
fy = @(u,v) 5.*u.*sin(v);
u = linspace(-10,10, 100);
v = linspace(-pi,pi, 100);
[uu,vv] = meshgrid(u, v);
X = fx(uu,vv);
Y = fy(uu,vv);
Z = fz(uu,vv);
surf(X,  Y,  Z);

现在进行翘曲:

warp(X,Y,Z,Img);
axis off


注意:从公式<代码> > Fy 中删除“<代码> 5”/代码>是一个半球而不是一个类星体。

这里需要考虑的两个一般问题是:由<代码>球< /代码>生成的(x,y,z)坐标的排序以及图像将映射到它们的方式:

点的排序 要了解如何生成点,我将使用128 x 128 RGB图像的示例
mapImage
到球面:

subplot(1, 2, 1);
imshow(mapImage);
subplot(1, 2, 2);
[x, y, z] = sphere(128);
warp(x, y, z, mapImage);
axis equal

请注意,图像最左侧的列映射到沿球体左侧(从其底点到其顶点)的直线。图像中的每个连续列在球体周围按时钟方向(向下看)按顺序分段映射。这向我们展示了
(x,y,z)
矩阵中的点是如何排序的

如果要将图像映射到半球形“碗”上,则需要沿碗边缘的一半生成点,以围绕底部和边缘另一半的顺序分段环绕。为了避免涉及几何解释,我将简单地告诉您,只需在
sphere
的返回调用中交换
y
z
矩阵,然后丢弃三个矩阵中的最后一半列,即可生成碗:

[x, z, y] = sphere(128);
x = x(:, 1:65);
y = y(:, 1:65);
z = z(:, 1:65);
warp(x, y, z, mapImage)
axis equal

映射您的图像 如上图所示,整个图像映射到曲面,而不仅仅是圆心区域。请注意,在碗边缘的顶部和底部点上,明亮颜色的角是如何被挤压的,在那里,球体的生成点密集聚集。也许您只想将圆心区域映射到曲面

为此,您必须变换图像,使圆形区域沿每行拉伸,以填充图像。你也许可以用做这类事情,但我将展示一个用做这类事情的例子


计算
Xq
的行看起来有点难看。为了解释,将
Xq
的每一行中的索引从-1重新缩放到1(而不是1到128),乘以该行中圆形区域宽度的一半,然后向上移动,以用作1到128范围内的插值。这会在顶部和底部更大程度地拉伸圆形区域,从而填充整个正方形图像,并更好地映射到球面。

我觉得代码的第二行有问题吗?我没有图像工具箱(所以我没有warp),但是你想要这样的东西吗:
ok=z>0
扭曲(x(ok)、y(ok)、z(ok)、Img)
虽然我的代码可能是错误的(我的错误),但本质上我的问题是我需要移动2D图像与半球零点对应的中心。非常感谢。我从这个详细的答案中学到了很多。这正是我努力实现的目标。
[x, z, y] = sphere(128);
x = x(:, 1:65);
y = y(:, 1:65);
z = z(:, 1:65);
warp(x, y, z, mapImage)
axis equal
[Xq, Yq] = meshgrid(1:128);
Xq = 64.5+sqrt(abs(63.5^2-(Yq-64.5).^2)).*(Xq-64.5)./63.5;
centerImage(:, :, 1) = interp2(mapImage(:, :, 1), Xq, Yq);
centerImage(:, :, 2) = interp2(mapImage(:, :, 2), Xq, Yq);
centerImage(:, :, 3) = interp2(mapImage(:, :, 3), Xq, Yq);
subplot(1, 2, 1);
imshow(centerImage);
subplot(1, 2, 2);
warp(x, y, z, centerImage);
axis equal