1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
| load clown
X1 = X;
X2 = X;
figure(1)
clf
colormap(map)
% % Image 1
% X1 = imread('image112.png');
% % Image 2
% X2 = imread('image111.png');
% Coordonnees des sommets du triangle sur l'image 1
xa = 114;
ya = 50;
xb = 122;
yb = 92;
xc = 122;
yc = 23;
% Coordonnees des sommets du triangle sur l'image 2
xa1 = 100;
ya1 = 50;
xb1 = 117;
yb1 = 92;
xc1 = 117;
yc1 = 23;
% Image 1 + triangle 1
s(1) = subplot(2,1,1);
im(1) = imagesc(X1);
hold on
patch('vertices', [xa ya ; xb yb ; xc yc], ...
'faces', [1 2 3], ...
'facecolor', 'none')
axis image
% Image 2 + triangle 2
s(2) = subplot(2,1,2);
im(2) = imagesc(X2);
hold on
patch('vertices', [xa1 ya1 ; xb1 yb1 ; xc1 yc1], ...
'faces', [1 2 3], ...
'facecolor', 'none')
axis image
linkaxes(s,'xy')
% Detection des pixels à l'intérieur du triangle 1
[x,y] = meshgrid(1:size(X1,2), 1:size(X1,1));
idx = inpolygon(x(:), y(:), [xa1 xb1 xc1], [ya1 yb1 yc1]);
idx = find(idx);
[r,c] = ind2sub(size(X1), idx);
% Transformation affine triangle 1 => triangle 2
A = [xa xb xc
ya yb yc
1 1 1];
X = [xa1 xb1 xc1
ya1 yb1 yc1
1 1 1];
T = X/A;
% Application de la transformation inverse aux pixels contenus dans le triangle 2
pts = T\[c(:).' ; r(:).' ; ones(1,numel(c))];
% % Affichage de la localisation des pixels traites sur les deux images
% axes(s(1))
% plot(pts(1,:), pts(2,:), 'r.')
% axes(s(2))
% plot(c, r, 'r.')
pts = floor(pts);
for n = 1:size(pts,2)
X2(r(n), c(n)) = X1(pts(2,n), pts(1,n));
end
set(im(2), 'cdata', X2) |
Partager