2012-09-13 12 views
6

के साथ चयनित है मेरे पास दो अक्षों वाला एक जीयूआई है। पहली अक्ष में कम-रिज़ॉल्यूशन वाली छवि होती है।मैटलैब: आरओआई की रीयल-टाइम प्लॉटिंग IMRECT

मैं क्या करना चाहता हूं, IMRECT का उपयोग करके पहली अक्ष पर एक क्षेत्र का चयन करें और फिर उस क्षेत्र को दूसरी अक्षों पर एक उच्च-रिज़ॉल्यूशन छवि के रूप में प्रदर्शित करें, जबकि मैं लगातार आयत को चारों ओर स्थानांतरित करता हूं।

एकमात्र तरीका यह है कि मैं ऐसा करने में सक्षम हूं, इसके लिए एक 0.1 फॉर के साथ "लूप" के साथ है जो केवल एक या दो मिनट तक चलता है जबकि मैं आरओआई को IMRECT के साथ चुनता हूं और बदलता हूं, बहुत बोझिल।

मेरा विचार था कि जब भी माउस पहले अक्षों में स्थानांतरित हो जाता है, तब उस समारोह में प्लॉटिंग और getPosition कमांड के साथ चलने वाले फ़ंक्शन का उपयोग करना था। हालांकि, मुझे यकीन नहीं है कि इस तरह के एक समारोह को कैसे लिखना है (अक्ष के भीतर माउस आंदोलन पर ट्रिगर करना)।

किसी भी मदद की सराहना की जाएगी!

+1

इसके अलावा बाहर की जाँच: http://stackoverflow.com/questions/10998739/स्केल करने योग्य-खींचने योग्य-बॉक्स-ऑन-प्लॉट-वह-चयन-डेटा/10 998803 # 10 998803 –

उत्तर

4

सामान्य रूप से, आपको अपने imrect पर कॉलबैक असाइन करना चाहिए। उदाहरण के लिए:

x = imrect(); 
x.addNewPositionCallback(@(x)(disp('The rect has changed'))) 

कॉलबैक को अज्ञात कार्यों का उपयोग करके छवि और दूसरी अक्ष जैसे अतिरिक्त पैरामीटर प्राप्त करना चाहिए।


मैंने एक छोटा कोड स्निपेट लिखा जो आप चाहते हैं। आपको सीमा जांच जोड़नी चाहिए, क्योंकि मुझे परेशान नहीं था। जब आप आयत को स्थानांतरित करते हैं तो imshow चलाने के बजाय यह CData अपडेट करता है, इसलिए यह काफी चिकनी है।

GUI

function Zoomer 
    figure(); 

    highResImage = imread('peppers.png'); 
    lowResImage = imresize(highResImage,0.5); 

    a1 = subplot(2,1,1); 
    a2 = subplot(2,1,2); 

    imshow(lowResImage,'Parent',a1); 
    initialPosition = [10 10 100 100]; 
    lowResRect = imrect(a1,initialPosition); 

    lowResRect.addNewPositionCallback(@(pos)Callback(pos,a2,highResImage)); 

    Callback(initialPosition , a2, highResImage); 
end 

function Callback(position,axesHandle, highResImage) 
    position = position * 2; 
    x1 = position(1); 
    y1 = position(2); 
    x2 = position(1) + position(3); 
    y2 = position(2) + position(4); 

    highResThumbnail = highResImage(round(y1:y2),round(x1:x2),:); 

    if isempty(get(axesHandle,'Children')) 
     imshow(highResThumbnail,'Parent',axesHandle); 
    else 
     imHandle = get(axesHandle,'Children'); 
     oldSize = size(get(imHandle,'CData')); 
     if ~isequal(oldSize, size(highResThumbnail)) 
      imshow(highResThumbnail,'Parent',axesHandle); 
     else 
      set(imHandle,'CData', highResThumbnail); 
     end  
    end 
end 
+0

धन्यवाद, एंड्री। मैं इसे पूरी तरह से काम करने के लिए मिला है। थोड़ी देर पहले संघर्ष कर रहा था, वही था जो मैं खोज रहा था। छवि के आकार के भीतर सही आयताकार को बाधित करने के लिए मेरे पास कोड की पिछली पंक्ति अब काम नहीं करती है। क्या आपके पास अक्ष के भीतर सही चयन को बाधित करने का त्वरित समाधान है? आपका बहुत बहुत धन्यवाद! – user1668909

+0

@ user1668909, http://stackoverflow.com/questions/10998739/scaleable-dragable-box-on-plots-that-can-select-data/10998803#10998803 देखें। विशेष रूप से 'makeConstraint' फ़ंक्शन –

1

के रूप में @ एंड्री के जवाब simillar कार्यक्षमता, तीन अंतर के साथ:

  • 'CData' के बजाय axis सीमाएं सेट करने
  • आवर्धन कारक (तेज हो सकता है?) परिवर्तनीय है और आयताकार आकार पर निर्भर करता है, 'fit'के कारण 10।
  • जोड़ा गया ConstraintFcn

होगा:

function imZ = Zoom(im, s) 

f = figure; 
a1 = subplot(1,2,1); 
imshow(im,'InitialMagnification', 'fit'); 
a2 = subplot(1,2,2); 
imshow(im,'InitialMagnification', 'fit'); 

Ipos = [0 0 s]; 
rect = imrect(a1,Ipos); 
rect.setPositionConstraintFcn(@(p) Const(p,size(im))); 
rect.addNewPositionCallback(@(p) CB(p,a2)); 
CB(Ipos,a2); 

if nargout > 0 
    uiwait(f); 
    imZ = im(pm(2):pm(2)+pm(4),pm(1):pm(1)+pm(3),:); 
end 

    function p = Const(p,imS) 
     p(1:2) = max(1,p(1:2)); 
     p(1:2) = min(imS([2 1])-p(3:4),p(1:2)); 
    end 

    function CB(p,a) 
     pm = round(p); 
     axes(a);  
     axis([pm(1),pm(1)+pm(3),pm(2),pm(2)+pm(4)]); 
    end 
end 

जो कहा जा सकता है के रूप में:

Zoom(imread('peppers.png'),[100 100]); 
+0

मुझे लगता है कि यह सबसे अच्छा जवाब है। –

संबंधित मुद्दे