Streng genommen, ist dies nicht getan werden kann
Die imtransform ermöglichen können Bilder durch eine projektive Transformation korrigiert werden, aber dies setzt voraus, dass die Objekte in dem Bild liegen auf einem planaren Oberfläche. Das ist, als würde man ein Schachbrett aus zwei verschiedenen Blickwinkeln fotografieren. Siehe das Bild unten.
Der einzige Grund, das Schachbrett behoben werden kann, weil es eben ist. Da Ihr Zylinder 3D ist, können Sie die Punkte nicht korrigieren.
Was können Sie tun, anstatt
Es ist möglich, Unter-Bilder aus dem Zylinder zu extrahieren, wobei jeder Unter-Bild korrigieren, dann nähen sie wieder zusammen.
Beispiel
Zuerst Unter-Bilder erhalten, indem Punkte zwischen den roten Punkten (dargestellt als rot o auf dem Bild ist) auswählen. Beachten Sie, dass die untere willkürlich ist. Wählen Sie dann die Stellen aus, an denen diese roten Punkte enden sollen, die als (grüne x) angezeigt werden.
Als nächstes korrigieren Sie jedes Unterbild. Beachten Sie, dass die roten Punkte jetzt auf den grünen X liegen.
erste Sub Bild
zweite Teilbild
dritte Teilbild
Jetzt stit ch das Bild wieder zusammen. Beachten Sie, dass jetzt alle roten Punkte auf derselben Linie liegen.
close all; clear all; clc;
%Read image
im1 = imread('crCTbm.jpg');
%Location of your red dots
x1 = [49; 106; 178; 234];
y1 = [115 116 126 136];
%Red dots will be aligned on yline in the final image
yline = y1(1);
%Initialize cells
subim = cell(1,length(x1)-1); %Tracks parsed images
Transform = cell(1,length(x1)-1); %Projective transform for each subim
RectifiedIm = cell(1,length(x1)-1); %Rectified images
%Initialize boundaries of image (Due to warping, sometimes the images can
%stretch beyond the border of the original image)
xdataout = [1,1]; ydataout = [1,1];
t1 = figure; imshow(im1);
for ii = 1:length(x1)-1
%Extract a subimage defined by your red dots
tim = zeros(size(im1));
tim(:,x1(ii):x1(ii+1),:) = im1(:,x1(ii):x1(ii+1),:);
subim{ii} = tim;
%Define four points in the original image
originalpoints{ii} = [x1(ii),y1(ii);... %Red Dot
x1(ii+1),y1(ii+1);... %Red Dot
x1(ii),y1(ii)+50;... %Arbitrary point
x1(ii+1),y1(ii)+50]; %Arbitrary point
%Define where there four points should lie in the rectified image
correctedpoints{ii} = [x1(ii),yline;... %Red dot should stay on the same x-coordinate, but y-coordinate is shited to the yline
x1(ii+1),yline;... %Red dot should stay on the same x-coordinate, but y-coordinate is shited to the yline
x1(ii),yline+50;... %Rectilinear point
x1(ii+1),yline+50]; %Rectilinear point
%Plot the original and corrected coordinates on the image
figure(t1); hold on;
plot(originalpoints{ii}(:,1),originalpoints{ii}(:,2),'ro');
plot(correctedpoints{ii}(:,1),correctedpoints{ii}(:,2),'gx');
legend('Original Points','correctedpoints{ii}');
%Sometimes the rectified image extends beyond the borders of the
%original boundary. This finds the worst case scenario for warping and
%sets the boundaries to that
Transform{ii} = maketform('projective',originalpoints{ii},correctedpoints{ii});
[~,xdataim2t,ydataim2t]=imtransform(im1,Transform{ii});
% now xdataim2t and ydataim2t store the bounds of the transformed im2
xdataout=[min([1,xdataim2t(1),xdataout(1)]) max([size(im1,2),xdataim2t(2),xdataout(2)])];
ydataout=[min([1,ydataim2t(1),xdataout(1)]) max([size(im1,1),ydataim2t(2),xdataout(2)])];
end
%Rectify the images
rectifiedx = floor(xdataout(1)):ceil(xdataout(2))+1; %x-coordinates of new image
rectifiedy = floor(ydataout(1)):ceil(ydataout(2))+1; %y-coordinates of new image
for ii = 1:length(x1)-1
RectifiedIm{ii}=imtransform(subim{ii},Transform{ii},'XData',xdataout,'YData',ydataout);
figure; image(rectifiedx,rectifiedy,uint8(RectifiedIm{ii})); hold on;
plot(originalpoints{ii}(:,1),originalpoints{ii}(:,2),'ro');
plot(correctedpoints{ii}(:,1),correctedpoints{ii}(:,2),'gx');
legend('Original Points','Rectified Points');
end
%Stitch the subimages together
finalim = zeros(size(RectifiedIm{1}));
for ii = 1:length(RectifiedIm)
finalim = max(double(finalim),double(RectifiedIm{ii}));
end
figure; imshow(uint8(finalim));
EDIT:
Wenn Sie nur über Ausrichten Punkte in 1D kümmern, ist es auch möglich, sie entlang Epipolarlinien auszurichten.
"Ich habe ein paar Ansätze mit" imtransform "versucht, aber es scheint nicht zu funktionieren." Ich frage mich immer ... funktioniert nicht, weil es einen Fehler verursacht, oder vielleicht einen blauen Bildschirm des Todes verursacht, oder sogar der Computer explodiert komplett in einer Million Stücke. Wer weiß. Es funktioniert einfach nicht. –