2016-07-21 11 views
1

Ich versuche, einen Zylinder auf einem Bild in Matlab, wie ich die roten Markierungen und die gelben Fäden (siehe Bild) auf einem 2D- Flugzeug in der Linie. Ich habe ein paar Ansätze mit "imtransform" versucht, aber es scheint nicht zu funktionieren.Rektifikation/Entpacken eines zylindrischen Objekts auf einem Bild in Matlab

Ich habe auch darüber nachgedacht, ein Raster auf den Zylinder zu legen, damit ich weiß, wie man die Transformation anpasst.

Hat jemand das gleiche Problem? Ich wäre sehr glücklich, einige Ideen zu bekommen, wie man dieses Problem lösen kann.

enter image description here

+0

"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. –

Antwort

1

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.

Rectifying a chessboard

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. Image with subimages

Als nächstes korrigieren Sie jedes Unterbild. Beachten Sie, dass die roten Punkte jetzt auf den grünen X liegen.

Subim1

erste Sub Bild

Subim2

zweite Teilbild

Subim3

dritte Teilbild

Jetzt stit ch das Bild wieder zusammen. Beachten Sie, dass jetzt alle roten Punkte auf derselben Linie liegen.

Stitched Image

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.

+0

Dies ist eine großartige Idee @ceiltechbladhm und danke auch für die Erklärung. Sie sind vollkommen imtransformiert und ich werde diesen Ansatz mit mehr roten Punkten versuchen. – Chris

Verwandte Themen