The following code descripes the affine transformation of an image, I,
T = [sx, 0, 0;...
0, sy, 0;...
0, 0, 1];
tform = maketform('affine', T);
[J,cdata,rdata] = imtransform(I,tform);
After obtaining the transformed image, J, I want to find the appropriate pixel value of I(5,5) on image J.
What should I do?
My code is
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
You transform the pixel coordinates just like you transformed the image.
appropriatePixel = J(T*[5;5;1]);
The code you posted was already quite close. Always remember that with images, the origin for images is in the top left and that the order of image dimensions is columns-rows, unlike with matrices. You took this into account in some places, but not everywhere.
The code below should fix the problem. gt = T*go
was changed to use the transpose of T, and minc
and minr
were swapped.
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
Result:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With