image MATLAB में विभिन्न ओरिएंटेशन और स्केल के साथ चित्रों का मिलान करना



image-processing computer-vision (4)

आपको शुरू करने के लिए यहाँ कुछ है जो आप पूछ रहे हैं वह क्लासिक समस्या है जिसे छवि पंजीकरण के रूप में जाना जाता है। छवि पंजीकरण सही समरूपता ढूंढना चाहता है, जो एक छवि लेता है और इसे दूसरे के साथ संरेखित करता है। इसमें ब्याज या मुख्य बिंदुओं को ढूंढना शामिल है जो दो छवियों के बीच सामान्य हैं और यह निर्धारित करने के लिए कि कौन सा मुख्य बिंदु दो छवियों के बीच मिलते हैं एक बार जब आप इन जोड़ों के अंक प्राप्त करते हैं, तो आप एक ब्रीफ़ोग्राफी मैट्रिक्स निर्धारित करते हैं और छवियों में से एक को ताना करते हैं ताकि वे इस मैट्रिक्स के साथ दूसरे के साथ गठबंधन कर सकें।

मैं यह मानने जा रहा हूं कि आपके कंप्यूटर विजन और इमेज प्रोसेसिंग टूलबॉक्सेस हैं जो MATLAB का हिस्सा हैं I यदि आप ऐसा नहीं करते हैं, तो उत्तर जो मॉरिस ने दिया है वह एक अच्छा विकल्प है, और वीएलएफट टूलबॉक्स एक है जिसे मैंने भी इस्तेमाल किया है।

सबसे पहले, आइए छवियों में सीधे स्टैक ओवरफ्लो से पढ़ें:

im = imread('http://i.stack.imgur.com/vXqe8.png');
im2 = imread('http://i.stack.imgur.com/Pd7pt.png');

im_gray = rgb2gray(im);
im2_gray = rgb2gray(im2);

मुख्य स्क्रीप्टिंग एल्गोरिदम को ग्रेस्केल चित्र की आवश्यकता के रूप में हमें ग्रेस्केल में बदलने की भी आवश्यकता है इसके बाद, हम किसी भी सुविधा का पता लगाने एल्गोरिथ्म का उपयोग कर सकते हैं जो MATLAB के CVST का हिस्सा है .... मैं एसयूआरएफ के उपयोग के लिए जा रहा हूं क्योंकि यह मूल रूप से एसआईएफटी के समान है, लेकिन कुछ मामूली लेकिन महत्वपूर्ण अंतर के साथ। आप का उपयोग कर सकते हैं detectSURFFeatures फ़ंक्शन CVST टूलबॉक्स का हिस्सा है और यह छवियों को grayscale स्वीकार करता है। आउटपुट एक ऐसी संरचना है जिसमें प्रत्येक फीचर के बारे में जानकारी का एक गुच्छा होता है जो चित्र के लिए एल्गोरिदम का पता लगाता है। चलिए दोनों छवियों पर लागू होते हैं (ग्रेस्केल में)

points = detectSURFFeatures(im_gray);
points2 = detectSURFFeatures(im2_gray);

एक बार जब हम सुविधाओं का पता लगाते हैं, तो अब यह उन व्याख्यानों को निकालने का समय है जो इन मुख्य बिंदुओं का वर्णन करते हैं। यह extractFeatures साथ किया जा सकता है यह एक ग्रेस्केल छवि में लेता है और इसी संरचना का पता detectSURFFeatures जो आउटपुट detectSURFFeatures से पता detectSURFFeatures । आउटपुट कुछ पोस्ट प्रोसेसिंग के बाद सुविधाओं का एक सेट और वैध कुंजीपॉइंट है।

[features1, validPoints1] = extractFeatures(im_gray, points);
[features2, validPoints2] = extractFeatures(im2_gray, points2);

अब यह दो छवियों के बीच की सुविधाओं का मिलान करने का समय है। यह matchFeatures साथ किया जा सकता है और यह दो छवियों के बीच की विशेषताएं लेता है:

indexPairs = matchFeatures(features1, features2);

indexPairs एक 2 डी सरणी है जहां पहले कॉलम आपको बताता है कि दूसरी छवि में से दूसरी तस्वीर में संग्रहीत पहली छवि से कौन से सुविधा बिंदु का मिलान दूसरे कॉलम में होगा। हम इसे अपने वैध बिंदुओं में सूचकांक के लिए उपयोग करेंगे, जो कि वास्तव में क्या मेल खाता है

matchedPoints1 = validPoints1(indexPairs(:, 1), :);
matchedPoints2 = validPoints2(indexPairs(:, 2), :);

हम फिर दिखा सकते हैं कि कौन से अंक showMatchedFeatures का उपयोग करके showMatchedFeatures तरह मेल खाते हैं। हम दोनों छवियों को एक-दूसरे के किनारे रख सकते हैं और मिलते-जुलते कुंजीपट्टियों के बीच रेखा खींच सकते हैं यह देखने के लिए कि कौन सा मिलान है।

figure;
showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, 'montage');

मुझे यही मिलता है:

यह सही नहीं है, लेकिन यह निश्चित रूप से दो छवियों के बीच लगातार मैचों को पाता है।

अब हमें आगे क्या करने की ज़रूरत है, बोनोग्राफी मैट्रिक्स और छवियों को ताना मैं estimateGeometricTransform गेटोमेट्रिक ट्रांसफॉर्मर का उपयोग करने जा रहा हूं ताकि हम एक ऐसा परिवर्तन पा सकें जो अंकों के एक सेट को दूसरे में बदलता है। जैसा कि दीमा ने मुझे अपनी टिप्पणी में नीचे बताया, यह मजबूत रूप से RANSAC के माध्यम से सबसे अच्छा स्वरुप मैट्रिक्स निर्धारित करता है। हम estimateGeometricTransform सकते हैं estimateGeometricTransform ट्रांसफॉर्मर ऐसा है:

tform = estimateGeometricTransform(matchedPoints1.Location,...
     matchedPoints2.Location, 'projective');

पहला इनपुट इनपुट पॉइंट्स के एक सेट में लेता है, जो कि आप पॉइंट बदलते हैं। दूसरा इनपुट आधार बिंदुओं के सेट में होता है जो संदर्भ बिंदु हैं। इन बिंदुओं को हम जो तक मैच करना चाहते हैं

हमारे मामले में, हम पहली छवि से अंक को ताना चाहते हैं - व्यक्ति खड़ा है और इसे दूसरे चित्र से मेल करवाएं - उस व्यक्ति को अपने पक्ष में झुकाव, और इसलिए पहला इनपुट पहली छवि से अंक है, और दूसरा इनपुट दूसरी छवि से अंक है

मिलान वाले अंकों के लिए, हम Location फ़ील्ड का संदर्भ देना चाहते हैं क्योंकि इनके निर्देशांक होते हैं जहां दो छवियों के बीच वास्तविक अंकों का मिलान होता है। हम पैमाने, बाल काटना और रोटेशन के लिए भी projective का उपयोग करते हैं। आउटपुट एक संरचना है जिसमें हमारे बिंदुओं के परिवर्तन शामिल हैं।

हम आगे क्या करेंगे पहली छवि को ताने के लिए imwarp का उपयोग करें ताकि वह दूसरे के साथ संरेखित करे।

out = imwarp(im, tform);

out हमारे विकृत छवि शामिल होंगे अगर हम दूसरी छवि और इस आउटपुट छवि को किनारे से दिखाया है:

figure;
subplot(1,2,1);
imshow(im2);
subplot(1,2,2);
imshow(out);

हम यही प्राप्त करते हैं:

मैं कहूंगा कि यह बहुत अच्छा है, क्या आपको नहीं लगता?

आपकी नकल और चिपकाने के लिए, यह पूरा कोड कैसा दिखता है:

im = imread('http://i.stack.imgur.com/vXqe8.png');
im2 = imread('http://i.stack.imgur.com/Pd7pt.png');

im_gray = rgb2gray(im);
im2_gray = rgb2gray(im2);

points = detectSURFFeatures(im_gray);
points2 = detectSURFFeatures(im2_gray);

[features1, validPoints1] = extractFeatures(im_gray, points);
[features2, validPoints2] = extractFeatures(im2_gray, points2);

indexPairs = matchFeatures(features1, features2);

matchedPoints1 = validPoints1(indexPairs(:, 1), :);
matchedPoints2 = validPoints2(indexPairs(:, 2), :);

figure;
showMatchedFeatures(im, im2, matchedPoints1, matchedPoints2, 'montage');

tform = estimateGeometricTransform(matchedPoints1.Location,...
   matchedPoints2.Location, 'projective');

out = imwarp(im, tform);

figure;
subplot(1,2,1);
imshow(im2);
subplot(1,2,2);
imshow(out);

अलग

ध्यान रखें कि मैंने सभी के लिए डिफ़ॉल्ट मापदंडों का इस्तेमाल किया है ... तो detectSURFFeatures , matchFeatures , इत्यादि का पता matchFeatures जा सकता है। आपको अपने द्वारा उपयोग की जाने वाली छवियों के अलग-अलग जोड़े में लगातार परिणाम प्राप्त करने के लिए पैरामीटर के साथ खेलना पड़ सकता है। मैं इसे आपको व्यायाम के रूप में छोड़ दूँगा अपने सभी कार्यों के संबंध में मैंने ऊपर दिए गए सभी लिंकों पर एक नज़र डालें ताकि आप अपने स्वाद के अनुकूल मानदंडों के साथ खेल सकें।

मज़ा करो और अच्छी किस्मत पाओ!

मेरे दो चित्र हैं जो समान हैं लेकिन उन्मुखीकरण और आकार में भिन्नता है। एक उदाहरण नीचे देखा जा सकता है:

क्या दो छवियों का मिलान करने का कोई तरीका है?

मैंने प्रोस्ट्रस्ट्स आकृति विश्लेषण का उपयोग किया है, लेकिन क्या अन्य तरीके हैं?


यह बाकी की तुलना में एक अलग दृष्टिकोण है। फ़ीचर आधारित पंजीकरण पद्धतियां अधिक मजबूत होती हैं, लेकिन मेरा दृष्टिकोण आपके लिए उपयोगी हो सकता है, इसलिए मैं इसे नीचे लिख रहा हूं।

  • संदर्भ छवि लोड करें (मैं इसे मॉडल कहूँगा) और उस छवि को आप मॉडल से तुलना करना चाहते हैं
  • दो छवियों के हिस्टोग्राम की गणना करें
  • दो हिस्टोग्राम की तुलना करें ऐसा करने के कई तरीके हैं यहां मैं प्रतिच्छेदन और सहसंबंध का उपयोग कर रहा हूं
  • हिस्टोग्राम पर्चे: हिस्टोग्राम चौराहों की गणना करें और इसे मॉडल हिस्टोग्राम में पिक्सल की संख्या से विभाजित करके सामान्य करें। यह आपको 0 और 1 के बीच एक मान देगा।

    image = imread('Pd7pt.png');
    model = imread('vXqe8.png');
    grImage = rgb2gray(image);
    grModel = rgb2gray(model);
    hImage = imhist(grImage);
    hModel = imhist(grModel);
    
    normhistInterMeasure = sum(min(hImage, hModel))/sum(hModel)
    corrMeasure = corr2(hImage, hModel)
  • प्रतिच्छेदन और सहसंबंध के लिए मुझे क्रमशः 0.2492 और 0.999 9 मिलता है।


कंप्यूटर विज़न सिस्टम टूलबॉक्स में स्वचालित फ़ीचर मिलान करने वाले उदाहरण का उपयोग करके चित्र रोटेशन और स्केल खोजें देखें।

यह दर्शाता है कि कैसे ब्याज अंक, निकालें और सुविधाओं के विवरण वर्णनकर्ताओं का पता लगाएं, और दो छवियों के बीच परिवर्तन की गणना करें।


आप निम्न कार्य कर रहे एक उचित परिणाम प्राप्त कर सकते हैं:

  • दोनों छवियों में शिफ्ट का पता लगाएं। उदाहरण के लिए vlfeat lib साथ
  • लोवी के नियम का उपयोग करते हुए एसआईएफटी डिस्क्रिप्टर्स से मिलान करें, वीएलएपी के साथ vl_ubcmatch द्वारा कार्यान्वित किया गया
  • कुछ व्यक्तित्व एच। का पालन करने वाले मिलान बिंदुओं का एक सबसेट ढूंढने के लिए RANSAC का उपयोग करें। हैरिस सुविधा बिंदुओं का उपयोग करते हुए एक उदाहरण पीटर कोव्सी की साइट पर देखा जा सकता है, जो कि स्वयं के पास RANSAC और अन्य उपयोगी फ़ंक्शन हैं

प्रारंभिक परिणाम:





matlab-cvst