我想转换一个图像从笛卡尔到极轴,并使用它的OpenGL纹理。因此,我参考了下面的两篇文章,使用了MatLab。
Link 1Link 2
我的代码与Link 2的Anwser完全相同
% load image
img = imread('my_image.png');
% convert pixel coordinates from cartesian to polar
[h,w,~] = size(img);
[X,Y] = meshgrid((1:w)-floor(w/2), (1:h)-floor(h/2));
[theta,rho] = cart2pol(X, Y);
Z = zeros(size(theta));
% show pixel locations (subsample to get less dense points)
XX = X(1:8:end,1:4:end);
YY = Y(1:8:end,1:4:end);
tt = theta(1:8:end,1:4:end);
rr = rho(1:8:end,1:4:end);
subplot(121), scatter(XX(:),YY(:),3,'filled'), axis ij image
subplot(122), scatter(tt(:),rr(:),3,'filled'), axis ij square tight
% show images
figure
subplot(121), imshow(img), axis on
subplot(122), warp(theta, rho, Z, img), view(2), axis square
结果正是我想要的,除了一件事,我非常满意。这是下面图片中的区域(红色圈出的区域)。考虑到对面(蓝色圈出的区域)不是,我认为这部分也应该填上。因为这个部分是空的,所以当它用作纹理时会有问题。我想知道我如何才能填补这一部分。谢谢。(与Link 2的答案代码如度数<->弧度和轴值差别不大。但我认为这并不重要。)
2条答案
按热度按时间eqqqjvef1#
您在问题中显示的问题之所以会发生,是因为您的算法是错误的。
您所做的(推送):
反之亦然(拉):
这种区别被称为“推”(进入输出)和“拉”(来自输入)。只有拉才能给出正确的结果。
只需要很少的MatLab代码。您只需要
pol2cart
和interp2
,以及一个meshgrid
。使用
interp2
,您可以选择内插(线性、立方等)。最近邻插值法会留下可见的瑕疵。反之亦然(从“丝带”获得一个“圆环”)非常相似。在圆环空间上抛出一个网格,减去中心,从笛卡儿变换到极轴,并使用这些来从“带状”图像采样到“圆环”图像。
我对OpenCV比对MatLab更熟悉。也许MatLab有类似OpenCV的
warpPolar()
,或者通用的remap()
。无论如何,完全“手工”完成操作是微不足道的,但有足够的支持功能来减轻您手中的繁重工作(interp2、pol2cart、Meshgrid)。xvw2m8pv2#
1.-白色圆弧表示所使用的翻译POL-CART引入了重大错误。
2.-颠倒以下脚本可以解决您的问题。
这是一个从cart-poll开始的脚本,没有引入错误或忽略输入数据,这就是当翻译后出现如此宽的白色弧线明显正确时所发生的情况。
由此产生的
3.-让我知道如果你想要一些帮助写Poll-Cart从这个剧本。
问候
约翰·贝克