2011-05-30 40 views
4

我想翘曲基于具有不同取向的给定的直线的图像的图像:翘曲基于具有不同取向的给定线

  1. 对于输入图像上的每个线,我可以得到像素的坐标在线
  2. 然后我会映射这些像素到扭曲的图像,使每一行现在是一列。

我会用interp2因为我已经有XYZ,我会做XiYi为每个行所获得的坐标。但是,您将如何:

  • 避免制作for循环哪个索引遍布行数?
  • 确保输出扭曲图像中的每一列的大小相同?
  • 用径向线对输入图像进行采样?
  • 我认为最难的问题是,即使我使用不同的方向,你将如何保持邻域结构:例如,输入图像左侧的horiontal线(行)和右侧部分的径向线?

这里的输入图像是一个轮胎,有这种很好的圆圈图案。我可以从轮胎中心做出径向线,我想要得到一个新的图像,其列是来自径向线的像素。

这是我到目前为止的代码(没有interp2,因为我还没有解决上述问题)。

close all 

%% Image 
Z = imread('tire.tif'); 
% The corresponding mesh 
sz = size(Z); 
[X,Y] = meshgrid(1:sz(2), 1:sz(1)); 

%% Line 
lineEquation = @(c, v) (v(1)*(X-c(2))+v(2)*(Y-c(1)))/norm(v); 
getLine = @(c, v) abs(lineEquation(c, v))<1/2; 
% Example 
c = [93, 109]; 
v = [2, 1]; 
line = getLine(c, v); 

%% Circle 
circleEquation = @(c, r) ((X-c(2)).^2+(Y-c(1)).^2-r^2)/r^2; 
getCircle = @(c, r) abs(circleEquation(c, r))<1/r; 
% Example 
r = 24; 
circle = getCircle(c, r); 

%% Plot a sequence of line 
figure; 
for delta = -1:0.1:1 
     v = [0.1, delta]; 
     line_delta = getLine(c, v); 
     Z_line = Z; 
     Z_line(line_delta) = 255; 
     imagesc(Z_line); 
     colormap('gray'); 
     pause(0.05); 
end 

%% Plot examples 
figure; 

subplot(221); 
imagesc(Z); 
title('Image'); 

subplot(222); 
Z_line = Z; 
Z_line(line) = 255; 
imagesc(Z_line); 
title('Line'); 

subplot(223); 
Z_circle = Z; 
Z_circle(circle) = 255; 
imagesc(Z_circle); 
title('Circle'); 

subplot(224); 
% TODO 
title('Warped image'); 

colormap('gray'); 

这里有不同的输出:

Examples

Lines

Circles


这里是扭曲图像: Warped image

这里是答案代码:

[ANG, RAD] = meshgrid(0:0.01:2*pi, 0:0.5:166); 
XI = c(2) + cos(ANG).*RAD; 
YI = c(1) + sin(ANG).*RAD; 
WARPED = interp2(X, Y, double(Z), XI, YI); 

WARPED(isnan(WARPED))= max(WARPED(:)); 
imagesc(WARPED); 
title('Warped image'); 
colormap('gray'); 
+0

+1 for silly gifs :) – 2011-05-30 21:41:03

回答

3

您的主要问题(我认为)正在构建矩阵XI和YI interp2。你通过认识到在新的图像中水平轴表示线的角度构建这些,并且垂直轴表示从圆的中心的距离,从而构建那些:

%% angle from 360 to 0, radius from 0 to 100 
%% resulting image will be 361 x 101 pixels 
[ANG, RAD] = meshgrid(360:-1:0,0:100); 
%% I take the centre of the circle at (93, 109) Is this correct? 
%% From there you can create XI and YI 
%% from the angle and radius you have at each point 
XI = ones(size(ANG))*93 + cos(ANG/(2*PI)).*RAD; 
YI = ones(size(ANG))*109 + sin(ANG/(2*PI)).*RAD; 

WARPED = interp2(X,Y,Z, XI, YI) 

的输出将是重扭曲(当然),因为在每个半径的圆被拉长到相同的长度。沿着线条扭曲将是最小的。如果一切顺利,我的数学福也没有离开我,这会给你一个轮胎图像,从中心切到右边。

+0

这似乎是个好主意。谢谢! – Wok 2011-05-31 12:51:11

+0

你测试过了吗?它能解决你的问题吗? – 2011-06-01 14:36:35

+1

确实如此。 :) – Wok 2011-06-01 15:20:28

2

最好的方法:使用 二阶改造各界对线,然后就切出你所需要的线的多项式变换。 使用2个Matlab命令cp2tform()带参数'polynomial'和imtransform() 在变换T中设置x 1和y 2的值1以创建圆和平移以定义轮胎的中心像素。

对不起,我不提供代码,因为我从iPhone回答。 P.s.检查Matlab有关多项式和保角变换的帮助。他们正是你所需要的。

+0

谢谢,我已经努力了一下(我仍然不确定我得到的结果),但它是一个很好的发现! – Wok 2011-05-31 12:52:30

相关问题