我正在matlab中编写一个函数,它模仿内置的'imwarp'函数(应用几何变换),而不使用任何类型的循环。我在最后一步,当我必须调用我的函数双线性插值在最终的2D图像的每个索引。
我在这里有3个数组,'pts'具有均匀化向量(x,y,1),我对其进行插值,'row'和'cols'分别具有x和y坐标,用于放置插值强度值的结果图像。
finalImage (rows(1,:),cols(1,:))=bilinear(pts(:,:),im);
请纠正我的语法在这里做正确的。
下面是对图像应用仿射变换的一个简单实现。有些矩阵可能是相反的,因为我是凭记忆做的。我不知道你是如何格式化你的pts数组,所以我认为一个工作的例子是我能做的最好的。interp2
函数采用双线性插值,bilinear
函数采用双线性变换,将模拟滤波器描述为数字滤波器。这不是你想要的。
注:您必须确保在应用图像翘曲时使用逆变换(也就是说,为输出图像中的每个点定义要在输入图像中采样的点)。如果你执行前向变换(即在输出图像中定义输入图像中每个点对应的点),那么你最终会在输出图像中出现一些严重的混叠效果和潜在的漏洞。
希望这对你有帮助。如果有什么问题请告诉我。
img = double(imread('rice.png'))/255;
theta = 30; % rotate 30 degrees
R = [cosd(theta) -sind(theta) 0; ...
sind(theta) cosd(theta) 0; ...
0 0 1];
sx = 15; % skew by 15 degrees in x
Skx = [1 tand(sx) 0; ...
0 1 0; ...
0 0 1];
% Translate by 1/2 size of image
tx = -size(img, 2)/2;
ty = -size(img, 1)/2;
T = [1 0 tx; ...
0 1 ty; ...
0 0 1];
% Scale image down by 1/2
sx = 0.5;
sy = 0.5;
S = [sx 0 0; ...
0 sy 0; ...
0 0 1];
% translate, scale, rotate, skew, then translate back
A = inv(T)*Skx*R*S*T;
% create meshgrid points
[x, y] = meshgrid(1:size(img,2), 1:size(img,1));
% reshape so we can apply matrix op
V = [reshape(x, 1, []); reshape(y, 1, []); ones(1, numel(x))];
Vq = inv(A)*V;
% probably not necessary for these transformations but project back to the z=1 plane
Vq(1,:) = Vq(1,:) ./ V(3,:);
Vq(2,:) = Vq(2,:) ./ V(3,:);
% reshape back into a meshgrid
xq = reshape(Vq(1,:), size(img));
yq = reshape(Vq(2,:), size(img));
% use interp2 to perform bilinear interpolation
imgnew = interp2(x, y, img, xq, yq);
% show the resulting image
imshow(imgnew);