以下代码描述了图像的仿射变换,I,
T = [sx, 0, 0;...
0, sy, 0;...
0, 0, 1];
tform = maketform('affine', T);
[J,cdata,rdata] = imtransform(I,tform);
获得变换后的图像J后,我想在图像J上找到I(5,5)的适当像素值。
我该怎么办?
我的代码是
function test()
sx = 0.5; sy = 1;
theta = pi/4;
Ts = [sx, 0, 0;...
0, sy, 0;...
0, 0, 1];
Tr = [cos(theta) -sin(theta) 0;...
sin(theta) cos(theta), 0; ...
0, 0, 1];
T = Ts*Tr;
I = imread('image_0002.jpg');
tform = maketform('affine', T);
[J,xdata,ydata] = imtransform(I,tform);
h = ydata(2) - ydata(1);
w = xdata(2) - xdata(1);
%%
gridOx = meshgrid(1:50:size(I,2), 1:50:size(I,1));
gridOy = meshgrid(1:50:size(I,1), 1:50:size(I,2))';
go = [gridOy(:), gridOx(:), ones(length(gridOx(:)),1)];
for i=1:size(go,1)
I = makept(I, go(i,1), go(i,2));
end
imshow(I);
%%
gt = T*go';
TL = T*[1,1,1]';
BL = T*[size(I,1), 1, 1]';
TR = T*[1, size(I,2), 1]';
BR = T*[size(I,1), size(I,2), 1]';
minr = min([TL(1), TR(1), BL(1), BR(1)]);
minc = min([TL(2), TR(2), BL(2), BR(2)]);
%%
gt = int32(round(gt));
r = gt(1,:) - minr+1;
c = gt(2,:) - minc+1;
figure,hold on;
for i=1:length(r)
J = makept(J, r(i), c(i));
plot(gt(1, i), gt(2, i));
end
figure, imshow(J);
close all;
end
function I = makept(I, r, c)
mr = max(r-2,1);
mc = max(c-2,1);
maxr = min(r+2,size(I,1));
maxc = min(c+2,size(I,2));
I(mr:maxr, mc:maxc,:) = 0;
I(mr:maxr, mc:maxc,1) = 255;
end
答案 0 :(得分:7)
您可以像转换图像一样转换像素坐标。
appropriatePixel = J(T*[5;5;1]);
您发布的代码已经非常接近了。永远记住,对于图像,图像的原点位于左上角,图像尺寸的顺序是列 - 行,与矩阵不同。你在某些地方考虑到了这一点,但并不是所有地方都考虑到了这一点。
下面的代码应该可以解决问题。 gt = T*go
已更改为使用T的转置,minc
和minr
已被交换。
function airplane()
close all
sx = 0.5; sy = 1;
theta = pi/4;
Ts = [sx, 0, 0;...
0, sy, 0;...
0, 0, 1];
Tr = [cos(theta) -sin(theta) 0;...
sin(theta) cos(theta), 0; ...
0, 0, 1];
T = Ts*Tr;
I = imread('airplane2.png');
tform = maketform('affine', T);
[J,xdata,ydata] = imtransform(I,tform);
%%
gridOx = meshgrid(1:50:size(I,2), 1:50:size(I,1));
gridOy = meshgrid(1:50:size(I,1), 1:50:size(I,2))';
go = [gridOx(:), gridOy(:), ones(length(gridOx(:)),1)];
figure; imshow(I); hold on;
scatter(go(:,1), go(:,2), 25, 'rs', 'filled');
%%
gt = T'*go';
TL = T*[1,1,1]';
BL = T*[size(I,1), 1, 1]';
TR = T*[1, size(I,2), 1]';
BR = T*[size(I,1), size(I,2), 1]';
minc = min([TL(1), TR(1), BL(1), BR(1)]);
minr = min([TL(2), TR(2), BL(2), BR(2)]);
%%
gt = int32(round(gt));
r = gt(1,:) - minr+1;
c = gt(2,:) - minc+1;
figure; imshow(J);hold on;
scatter(c, r, 25, 'rs', 'filled');
end
结果:
答案 1 :(得分:1)
我发现了另一种方式..使用'tformfwd'..我们需要应用缩放以及http://blogs.mathworks.com/steve/2006/02/14/spatial-transformations-maketform-tformfwd-and-tforminv/
中的解释 function [new_im, grn, gcn] = transformImage(I, gr, gc, TM)
[new_im xdata ydata] = imtransform(I, TM);
w = xdata(2)-xdata(1) +1;
h = ydata(2)-ydata(1)+1;
scalex = size(new_im,2)/w;
scaley = size(new_im,1)/h;
% cartesian coordinates
go = [gc(:), gr(:)];
%% cartesian coordinates
NPt = tformfwd(TM, go);
% convert to image coordinates
NPtImage(:,1) = NPt(:,1) - xdata(1) + 1;
NPtImage(:,2) = NPt(:,2) - ydata(1) + 1;
NPtImage(:,1) = NPtImage(:,1)*scalex;
NPtImage(:,2) = NPtImage(:,2)*scaley;
NPtImage = round(NPtImage);
grn = NPtImage(:,2);
gcn = NPtImage(:,1);
grn = reshape(grn, size(gr,1), size(gr,2));
gcn = reshape(gcn, size(gc,1), size(gc,2));
showimgs = false;
if showimgs
I = uint8(I);
new_im = uint8(new_im);
figure, imshow(I), hold on;
for i=1:size(go,1)
plot(go(i,1), go(i,2), 'r*');
end
figure, imshow(new_im, 'XData', xdata, 'YData', ydata);
hold on
axis on
for i=1:size(go,1)
plot(NPt(i,1), NPt(i,2), 'r*')
end
tmpim = new_im;
for i=1:size(NPtImage,1)
tmpim = makept(tmpim, NPtImage(i,2), NPtImage(i,1), 'b');
end
figure, imshow(tmpim);
end
end
function I = makept(I, r, c, color)
mr = max(r-2,1);
mc = max(c-2,1);
maxr = min(r+2,size(I,1));
maxc = min(c+2,size(I,2));
I(mr:maxr, mc:maxc,:) = 0;
if strcmp(color, 'r')
I(mr:maxr, mc:maxc,1) = 255;
else
I(mr:maxr, mc:maxc,3) = 255;
end
end