matlab कंट्रोल पॉइंट्स का इस्तेमाल करते हुए एक छवि वार्प करना




image-processing octave (2)

मैं यहाँ से निकाले गए इस योजना के अनुसार नियंत्रण बिंदुओं का उपयोग कर एक छवि को परिवर्तित करना चाहता हूं:

A और B में स्रोत के निर्देशांक एक लक्ष्य कोने में शामिल हैं I

मैं रूपांतरण मैट्रिक्स की गणना कर रहा हूँ:

A = [51 228;  51 127; 191 127; 191 228];
B = [152 57; 219 191;  62 240;  92 109];
X = imread('rectangle.png');
info = imfinfo('rectangle.png');
T = cp2tform(A,B,'projective');

यहां तक ​​कि यह ठीक से काम करने लगता है, क्योंकि (सामान्यीकृत निर्देशांक का उपयोग करते हुए) एक स्रोत शीर्ष इसके लक्ष्य को जन्म देता है:

H = T.tdata.T;
> [51 228 1]*H
ans =
  -248.2186   -93.0820    -1.6330
> [51 228 1]*H/ -1.6330
ans =
   152.0016    57.0006     1.0000

समस्या यह है कि imtransform एक अप्रत्याशित परिणाम पैदा करता है:

Z = imtransform(X,T,'XData',[1 info.Width], 'YData',[1 info.Height]);
imwrite(Z,'projective.png');

मैं यह मेरा अपेक्षित परिणाम बनाने के लिए imtransform का उपयोग कैसे कर सकता हूं ?:

क्या इसे प्राप्त करने का कोई वैकल्पिक तरीका है?


आपको उस चित्र के आकार के नियंत्रण बिंदु को "अनुकूल" करना होगा जिसे आप कार्य कर रहे हैं जिस तरह से मैंने ऐसा किया, A में कंट्रोल पॉइंट के कोनों और स्रोत छवि के कोनों के बीच एक एनीमेशन परिवर्तन की गणना करके (वैसे आप अंक बनाना चाहते हैं, उसी घड़ी की क्रम में हैं)

मुझे बताइए एक बात यह है कि आपके मैट्रिक्स A में अंकों का क्रम आपके द्वारा दिखाए गए चित्र से मेल नहीं खाता है, इसलिए मैंने तय किया है कि नीचे दिए गए कोड में ...

जीवनी का अनुमान लगाने के लिए यहां कोड (MATLAB) में परीक्षण किया गया है:

% initial control points
A = [51 228;  51 127; 191 127; 191 228];
B = [152 57; 219 191;  62 240;  92 109];
A = circshift(A, [-1 0]);  % fix the order of points to match the picture

% input image
%I = imread('peppers.png');
I = im2uint8(checkerboard(32,5,7));
[h,w,~] = size(I);

% adapt control points to image size
% (basically we estimate an affine transform from 3 corner points)
aff = cp2tform(A(1:3,:), [1 1; w 1; w h], 'affine');
A = tformfwd(aff, A);
B = tformfwd(aff, B);

% estimate homography between A and B
T = cp2tform(B, A, 'projective');
T = fliptform(T);
H = T.tdata.Tinv

मुझे मिला:

>> H
H =
   -0.3268    0.6419   -0.0015
   -0.4871    0.4667    0.0009
  324.0851 -221.0565    1.0000

अब हम अंक की कल्पना करते हैं:

% check by transforming A points into B
%{
BB = [A ones(size(A,1),1)] * H;        % convert to homogeneous coords
BB = bsxfun(@rdivide, BB, BB(:,end));  % convert from homogeneous coords
%}
BB = tformfwd(T, A(:,1), A(:,2));
fprintf('error = %g\n', norm(B-BB));

% visually check by plotting control points and transformed A
figure(1)
subplot(121)
plot(A([1:end 1],1), A([1:end 1],2), '.-', 'MarkerSize',20, 'LineWidth',2)
line(BB([1:end 1],1), BB([1:end 1],2), 'Color','r', 'Marker','o')
text(A(:,1), A(:,2), num2str((1:4)','a%d'), ...
    'VerticalAlign','top', 'HorizontalAlign','left')
title('A'); legend({'A', 'A*H'}); axis equal ij
subplot(122)
plot(B([1:end 1],1), B([1:end 1],2), '.-', 'MarkerSize',20, 'LineWidth',2)
text(B(:,1), B(:,2), num2str((1:4)','b%d'), ...
    'VerticalAlign','top', 'HorizontalAlign','left')
title('B'); legend('B'); axis equal ij

अंत में हम स्रोत छवि पर परिवर्तन लागू कर सकते हैं:

% transform input image and show result
J = imtransform(I, T);
figure(2)
subplot(121), imshow(I), title('image')
subplot(122), imshow(J), title('warped')


आपकी समस्या यह है कि जब आप अपने XData और YData को imtransform में निर्दिष्ट करते हैं, तो आपने गलती से आउटपुट छवि को क्रॉप कर imtransform । वैध XData और YData श्रेणी की गणना करने के लिए A को बदलने के लिए एक विकल्प tformfwd का उपयोग करना होगा।

[U,V] = tformfwd(T, A(:,1), A(:,2));

Z = imtransform(X,T,'XData',[min(U) max(U)], 'YData', [min(V) max(V)]);




projective-geometry