ওপেনসিভিতে কীভাবে অনুরূপ দুটি চিত্রের মূল্যায়ন করতে পারি?


141

ওপেনসিভি কি দুটি চিত্রের তুলনা সমর্থন করে কিছু মান (সম্ভবত একটি শতাংশ) ফিরিয়ে দেয় যা নির্দেশ করে যে এই চিত্রগুলি কতটা সমান? উদাহরণস্বরূপ, যদি একই চিত্রটি দুইবার পাস করা হয় তবে 100% ফিরিয়ে দেওয়া হবে, চিত্রগুলি সম্পূর্ণ আলাদা থাকলে 0% ফেরত আসবে।

আমি ইতিমধ্যে স্ট্যাক ওভারফ্লোতে প্রচুর অনুরূপ বিষয়গুলি পড়েছি। আমি বেশ কিছু গুগলিংও করেছি। দুঃখের বিষয় আমি সন্তোষজনক উত্তর নিয়ে আসতে পারিনি।


উত্তর:


208

এটি 3 টি কোডের লাইন থেকে পুরো গবেষণা ম্যাগাজিনের উত্তর সহ একটি বিশাল বিষয়।

আমি সর্বাধিক সাধারণ এই জাতীয় কৌশলগুলি এবং তাদের ফলাফলগুলি রূপরেখা করব।

হিস্টোগ্রামের তুলনা করা

অন্যতম সহজ এবং দ্রুততম পদ্ধতি। কয়েক দশক আগে প্রস্তাবিত চিত্র সাদৃশ্য খুঁজে পাওয়ার উপায় হিসাবে। ধারণাটি হ'ল কোনও বনে প্রচুর সবুজ, এবং মানুষের মুখ অনেক গোলাপী বা যা কিছু থাকবে। সুতরাং, আপনি যদি বনের সাথে দুটি ছবি তুলনা করেন তবে আপনি হিস্টোগ্রামগুলির মধ্যে কিছুটা সাদৃশ্য পাবেন কারণ উভয়টিতে আপনার প্রচুর সবুজ রয়েছে।

নেতিবাচক: এটি খুব সরল। একটি কলা এবং একটি সৈকত উভয় হলুদ হিসাবে একই চেহারা হবে।

ওপেনসিভি পদ্ধতি: তুলনা হিস্ট ()

টেমপ্লেট মিলছে

এখানে একটি ভাল উদাহরণ ম্যাচটিম্পলেট ভাল মিল খুঁজে পাচ্ছে । এটি অনুসন্ধানের চিত্রটির সাথে একের সাথে সন্ধান করছে ol এটি সাধারণত একটি বড় একটিতে ছোট চিত্রের অংশগুলি খুঁজতে ব্যবহৃত হয়।

ডাউনসাইডস: এটি কেবল অভিন্ন চিত্র, একই আকার এবং ওরিয়েন্টেশন সহ ভাল ফলাফলগুলি দেয়।

ওপেনসিভি পদ্ধতি: ম্যাচ টেম্পলেট ()

বৈশিষ্ট্য মিলছে

চিত্র অনুসন্ধান করার অন্যতম কার্যকর উপায় হিসাবে বিবেচিত। একটি চিত্র থেকে বেশ কয়েকটি বৈশিষ্ট্য বের করা হয়, এমনভাবে গ্যারান্টি দেয় যে একই বৈশিষ্ট্যগুলি ঘোরানো, ছোট বা স্কেল করা হলেও পুনরায় স্বীকৃত হবে। এইভাবে নিষ্কাশন করা বৈশিষ্ট্যগুলি অন্য চিত্র বৈশিষ্ট্যগুলির সেটগুলির সাথে মিলে যায়। প্রথমটির সাথে মেলে এমন বৈশিষ্ট্যের একটি উচ্চ অনুপাত রয়েছে এমন অন্য চিত্রটি একই দৃশ্যের চিত্রিত করা বলে মনে করা হয়।

পয়েন্টের দুটি সেটের মধ্যে হোমোগ্রাফি সন্ধান করা আপনাকে মূল ছবি বা ওভারল্যাপিংয়ের পরিমাণের মধ্যে শ্যুটিং কোণে আপেক্ষিক পার্থক্য খুঁজে পেতে দেয়।

এটিতে বেশ কয়েকটি ওপেনসিভি টিউটোরিয়াল / নমুনা এবং একটি দুর্দান্ত ভিডিও রয়েছে । একটি সম্পূর্ণ ওপেনসিভি মডিউল (বৈশিষ্ট্য 2 ডি) এটি উত্সর্গীকৃত।

ডাউনসাইডস: এটি ধীর হতে পারে। এটি নিখুঁত নয়।


উপর OpenCV Q & A- সাইটে আমি বৈশিষ্ট্য বর্ণনাকারী, যা মহান যখন পুরো চিত্র এবং জমিন বর্ণনাকারী, যা মানুষের মুখ বা একটি চিত্র গাড়ি মত বস্তু চিহ্নিত করতে ব্যবহার করা হয় তুলনা করা হয় মধ্যে পার্থক্য সম্পর্কে কথা বলছি।


একই রকম চিত্র তুলনা করতে যে মাত্র কয়েক স্বতন্ত্র চিত্র আছে (যেমন একটি নতুন অবজেক্ট অন্যথায় একই দৃশ্য স্থানান্তরিত) আপনার কাছে সাথে কাজ করতে পারেন absdiff codota.com/code/java/methods/org.opencv.core.Core/absdiff থ্রেশহোল্ডিং ফলাফলের একটি মুখোশ তৈরি করে যা আপনাকে সেই অঞ্চলগুলিকে হাইলাইট করতে দেয় যা দৃশ্য থেকে দৃশ্যে পরিবর্তিত হয়েছিল।
সর্বোচ্চ এফ 17

34

অভিন্ন চিত্রের মিলের জন্য যদি (একই আকার / অভিযোজন)

// Compare two images by getting the L2 error (square-root of sum of squared error).
double getSimilarity( const Mat A, const Mat B ) {
if ( A.rows > 0 && A.rows == B.rows && A.cols > 0 && A.cols == B.cols ) {
    // Calculate the L2 relative error between images.
    double errorL2 = norm( A, B, CV_L2 );
    // Convert to a reasonable scale, since L2 error is summed across all pixels of the image.
    double similarity = errorL2 / (double)( A.rows * A.cols );
    return similarity;
}
else {
    //Images have a different size
    return 100000000.0;  // Return a bad value
}

উৎস


12

স্যামের সমাধান যথেষ্ট হওয়া উচিত। আমি হিস্টগ্রাম পার্থক্য এবং টেমপ্লেট মিল উভয়ের সমন্বয় ব্যবহার করেছি কারণ একটি পদ্ধতি আমার জন্য 100% সময় কাজ করে না। যদিও আমি হিস্টগ্রাম পদ্ধতিতে কম গুরুত্ব দিয়েছি। আমি কীভাবে সাধারণ অজগর লিপিটি প্রয়োগ করেছি।

import cv2

class CompareImage(object):

    def __init__(self, image_1_path, image_2_path):
        self.minimum_commutative_image_diff = 1
        self.image_1_path = image_1_path
        self.image_2_path = image_2_path

    def compare_image(self):
        image_1 = cv2.imread(self.image_1_path, 0)
        image_2 = cv2.imread(self.image_2_path, 0)
        commutative_image_diff = self.get_image_difference(image_1, image_2)

        if commutative_image_diff < self.minimum_commutative_image_diff:
            print "Matched"
            return commutative_image_diff
        return 10000 //random failure value

    @staticmethod
    def get_image_difference(image_1, image_2):
        first_image_hist = cv2.calcHist([image_1], [0], None, [256], [0, 256])
        second_image_hist = cv2.calcHist([image_2], [0], None, [256], [0, 256])

        img_hist_diff = cv2.compareHist(first_image_hist, second_image_hist, cv2.HISTCMP_BHATTACHARYYA)
        img_template_probability_match = cv2.matchTemplate(first_image_hist, second_image_hist, cv2.TM_CCOEFF_NORMED)[0][0]
        img_template_diff = 1 - img_template_probability_match

        # taking only 10% of histogram diff, since it's less accurate than template method
        commutative_image_diff = (img_hist_diff / 10) + img_template_diff
        return commutative_image_diff


    if __name__ == '__main__':
        compare_image = CompareImage('image1/path', 'image2/path')
        image_difference = compare_image.compare_image()
        print image_difference

আমি অজগর ভাল বুঝতে পারি না। তবে 'কম্যেটেটিভ_মেজ_ডিফ' টাইপ কী? সিভি.ম্যাট বা ডাবল। যদি এটি সিভি। আপনি আমার জন্য ব্যাখ্যা করতে পারেন?
বুলেটরাইন

1

সামান্য বিট টপিক তবে দরকারী অজগরটি numpy অ্যাপ্রোচ। এটির দৃust় এবং দ্রুত তবে কেবল পিক্সেলের তুলনা করে না এবং ছবিতে থাকা বস্তু বা ডেটা নয় (এবং এটির জন্য একই আকার এবং আকৃতির চিত্র প্রয়োজন):

ওপেনসিভি এবং কম্পিউটার দর্শনের জন্য কোনও লাইব্রেরি ছাড়াই এটি করার জন্য খুব সহজ এবং দ্রুত পদ্ধতির মাধ্যমে চিত্র অ্যারেগুলি আদর্শ করা

import numpy as np
picture1 = np.random.rand(100,100)
picture2 = np.random.rand(100,100)
picture1_norm = picture1/np.sqrt(np.sum(picture1**2))
picture2_norm = picture2/np.sqrt(np.sum(picture2**2))

উভয় নরমড ছবি (বা ম্যাট্রিক) সংজ্ঞায়িত করার পরে আপনি যে ছবিগুলি তুলনা করতে চান তার অঙ্কের পরিমাণটি যোগ করতে পারেন:

1) আপনি যদি অনুরূপ চিত্রের তুলনা করেন তবে যোগফল 1:

In[1]: np.sum(picture1_norm**2)
Out[1]: 1.0

২) যদি সেগুলি না হয় তবে আপনি 0 এবং 1 এর মধ্যে একটি মান পাবেন (যদি আপনি 100 দ্বারা গুণিত করেন তবে শতাংশ):

In[2]: np.sum(picture2_norm*picture1_norm)
Out[2]: 0.75389941124629822

দয়া করে লক্ষ্য করুন যে যদি আপনার রঙিন ছবি থাকে তবে আপনাকে এটি 3 টি মাত্রায় করতে হবে বা কেবল একটি গ্রেস্কেল সংস্করণটির সাথে তুলনা করুন। আমাকে প্রায়শই স্বেচ্ছাসেবী সামগ্রীর সাথে প্রচুর পরিমাণে ছবি তুলনা করতে হয় এবং এটি করা সত্যিই দ্রুত উপায়।


2
হাই, আমি কেবল আপনার পদক্ষেপটি অনুসরণ করি তবে আমি দেখতে পেয়েছি যে স্বাভাবিককরণের অংশটি সঠিক ফলাফল পেতে পারে না। চূড়ান্ত ফলাফল 1.0 এর চেয়ে অনেক বেশি। কোন ধারণা?
জি_সি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.