image आईएएस समानता के लिए छवियों की तुलना करने के लिए सरल और तेज़ तरीका




रेड इंडियन कौन है (6)

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

इसे ओपनसीवी में भी लागू किया गया है, और इसे जीपीयू के साथ तेज किया जा सकता है: जीपीयू के साथ ओपनसीवी एसएसआईएम

समानता के लिए दो छवियों की तुलना करने के लिए मुझे एक सरल और तेज़ तरीका चाहिए। मैं उच्च मूल्य प्राप्त करना चाहता हूं यदि उनमें बिल्कुल एक ही चीज़ है लेकिन कुछ अलग पृष्ठभूमि हो सकती है और कुछ पिक्सेल द्वारा स्थानांतरित / आकार बदल सकती है।

(अधिक ठोस, यदि यह मायने रखता है: एक तस्वीर एक आइकन है और दूसरी तस्वीर एक स्क्रीनशॉट का एक उपर्य है और मैं जानना चाहता हूं कि वह सबरेआ बिल्कुल आइकन है या नहीं।)

मेरे पास ओपनसीवी है लेकिन मैं अभी भी इसका उपयोग नहीं कर रहा हूं।

एक संभावना मैंने अब तक सोचा था: दोनों चित्रों को 10x10 कोशिकाओं में विभाजित करें और उन 100 कोशिकाओं में से प्रत्येक के लिए, रंग हिस्टोग्राम की तुलना करें। फिर मैं कुछ बनाया गया थ्रेसहोल्ड मान सेट कर सकता हूं और यदि मुझे जो मान मिलता है वह उस सीमा से ऊपर है, तो मुझे लगता है कि वे समान हैं।

मैंने अभी तक यह कोशिश नहीं की है कि यह कितना अच्छा काम करता है लेकिन मुझे लगता है कि यह काफी अच्छा होगा। छवियां पहले से ही बहुत समान हैं (मेरे उपयोग के मामले में), इसलिए मैं एक सुंदर उच्च थ्रेसहोल्ड मान का उपयोग कर सकता हूं।

मुझे लगता है कि इसके लिए कई अन्य संभावित समाधान हैं जो कम या ज्यादा काम करेंगे (क्योंकि कार्य स्वयं ही काफी सरल है क्योंकि मैं केवल समानता का पता लगाना चाहता हूं यदि वे वास्तव में बहुत समान हैं)। आप क्या सुझाव देंगे?

किसी छवि से हस्ताक्षर / फिंगरप्रिंट / हैश प्राप्त करने के बारे में कुछ बहुत संबंधित / समान प्रश्न हैं:

साथ ही, मैंने इन कार्यान्वयन पर ठोकर खाई है जिसमें फिंगरप्रिंट प्राप्त करने के लिए ऐसे कार्य हैं:

अवधारणात्मक छवि हैश के बारे में कुछ चर्चाएं: here

थोड़ा ऑफटॉपिक: ऑडियो फिंगरप्रिंट बनाने के लिए कई विधियां मौजूद हैं। म्यूजिकब्रेनज़ , एक वेब-सेवा जो गानों के लिए फिंगरप्रिंट-आधारित लुकअप प्रदान करती है, उनके विकी में एक अच्छा अवलोकन है । वे अब AcoustID का उपयोग कर रहे हैं। यह सटीक (या अधिक सटीक) मिलान खोजने के लिए है। समान मिलान खोजने के लिए (या यदि आपके पास केवल कुछ स्निपेट या उच्च शोर है), तो Echoprint पर एक नज़र Echoprint । एक संबंधित एसओ सवाल here । तो ऐसा लगता है कि यह ऑडियो के लिए हल किया गया है। ये सभी समाधान काफी अच्छे काम करते हैं।

सामान्य रूप से अस्पष्ट खोज के बारे में कुछ और सामान्य सवाल here । जैसे इलाके-संवेदनशील हैशिंग और निकटतम पड़ोसी खोज है


मुझे हाल ही में एक ही समस्या का सामना करना पड़ता है, इस समस्या को हल करने के लिए (दो छवियों की तुलना करने के लिए सरल और तेज़ एल्गोरिदम) एक बार और सभी के लिए, मैं opencv_contrib में एक img_hash मॉड्यूल का योगदान करता हूं, आप इस लिंक से विवरण पा सकते हैं।

img_hash मॉड्यूल छह छवि हैश एल्गोरिदम प्रदान करता है, जो उपयोग करने में काफी आसान है।

उदाहरण उदाहरण

मूल लेना

धुंधला लेना

आकार बदलें लेना

शिफ्ट लेना

#include <opencv2/core.hpp>
#include <opencv2/core/ocl.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/img_hash.hpp>
#include <opencv2/imgproc.hpp>

#include <iostream>

void compute(cv::Ptr<cv::img_hash::ImgHashBase> algo)
{
    auto input = cv::imread("lena.png");
    cv::Mat similar_img;

    //detect similiar image after blur attack
    cv::GaussianBlur(input, similar_img, {7,7}, 2, 2);
    cv::imwrite("lena_blur.png", similar_img);
    cv::Mat hash_input, hash_similar;
    algo->compute(input, hash_input);
    algo->compute(similar_img, hash_similar);
    std::cout<<"gaussian blur attack : "<<
               algo->compare(hash_input, hash_similar)<<std::endl;

    //detect similar image after shift attack
    similar_img.setTo(0);
    input(cv::Rect(0,10, input.cols,input.rows-10)).
            copyTo(similar_img(cv::Rect(0,0,input.cols,input.rows-10)));
    cv::imwrite("lena_shift.png", similar_img);
    algo->compute(similar_img, hash_similar);
    std::cout<<"shift attack : "<<
               algo->compare(hash_input, hash_similar)<<std::endl;

    //detect similar image after resize
    cv::resize(input, similar_img, {120, 40});
    cv::imwrite("lena_resize.png", similar_img);
    algo->compute(similar_img, hash_similar);
    std::cout<<"resize attack : "<<
               algo->compare(hash_input, hash_similar)<<std::endl;
}

int main()
{
    using namespace cv::img_hash;

    //disable opencl acceleration may(or may not) boost up speed of img_hash
    cv::ocl::setUseOpenCL(false);

    //if the value after compare <= 8, that means the images
    //very similar to each other
    compute(ColorMomentHash::create());

    //there are other algorithms you can try out
    //every algorithms have their pros and cons
    compute(AverageHash::create());
    compute(PHash::create());
    compute(MarrHildrethHash::create());
    compute(RadialVarianceHash::create());
    //BlockMeanHash support mode 0 and mode 1, they associate to
    //mode 1 and mode 2 of PHash library
    compute(BlockMeanHash::create(0));
    compute(BlockMeanHash::create(1));
}

इस मामले में, ColorMomentHash हमें सर्वश्रेष्ठ परिणाम देते हैं

  • गाऊशियन ब्लर हमला: 0.567521
  • शिफ्ट हमला: 0.229728
  • आकार का आकार बदलें: 0.229358

प्रत्येक एल्गोरिदम के पेशेवरों और विपक्ष

Img_hash का प्रदर्शन भी अच्छा है

PHash लाइब्रेरी के साथ गति तुलना (ukbench से 100 छवियां)

यदि आप इन एल्गोरिदम के लिए अनुशंसा थ्रेसहोल्ड जानना चाहते हैं, तो कृपया इस पोस्ट को जांचें ( http://qtandopencv.blogspot.my/2016/06/introduction-to-image-hash-module-of.html )। यदि आप इस बारे में दिलचस्प हैं कि मैं img_hash मॉड्यूल के प्रदर्शन को मापता हूं (गति और विभिन्न हमलों को शामिल करता हूं), तो कृपया इस लिंक को देखें ( http://qtandopencv.blogspot.my/2016/06/speed-up-image-hashing-of-opencvimghash.html )।


यदि आप परीक्षण क्षेत्र में अपने टेम्पलेट (आइकन) का सटीक संरेखण सुनिश्चित कर सकते हैं, तो पिक्सेल मतभेदों का कोई पुराना योग काम करेगा।

अगर संरेखण केवल एक छोटा सा बंद होने जा रहा है, तो आप पिक्सेल मतभेदों के योग को खोजने से पहले दोनों छवियों को cv::GaussianBlur साथ कम-पास कर सकते हैं।

अगर संरेखण की गुणवत्ता संभावित रूप से खराब है तो मैं ओरिएंटेड ग्रेडियेंट्स का एक हिस्टोग्राम या ओपनसीवी के सुविधाजनक कीपॉइंट डिटेक्शन / डिस्क्रिप्टर एल्गोरिदम (जैसे कि SIFT या SIFT ) की सिफारिश करता हूं।


क्या स्क्रीनशॉट में केवल आइकन होता है? यदि ऐसा है, तो दो छवियों की एल 2 दूरी पर्याप्त हो सकती है। यदि एल 2 दूरी काम नहीं करती है, तो अगला कदम कुछ सरल और अच्छी तरह से स्थापित करने की कोशिश करना है, जैसे: Lucas-Kanade । जो मुझे यकीन है कि ओपनसीवी में उपलब्ध है।


यदि समान छवियों से मेल खाने के लिए - एल 2 दूरी के लिए कोड

// 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
}

फास्ट। लेकिन प्रकाश / दृष्टिकोण आदि में परिवर्तन के लिए मजबूत नहीं Source


क्या स्क्रीनशॉट या आइकन बदल दिया जा सकता है (स्केल, घूर्णन, skewed ...)? मेरे सिर के शीर्ष पर कुछ विधियां हैं जो संभवतः आपकी मदद कर सकती हैं:

  • @carlosdc द्वारा वर्णित सरल यूक्लिडियन दूरी (रूपांतरित छवियों के साथ काम नहीं करती है और आपको थ्रेसहोल्ड की आवश्यकता होती है)।
  • (सामान्यीकृत) क्रॉस सहसंबंध - एक साधारण मीट्रिक जिसे आप छवि क्षेत्रों की तुलना के लिए उपयोग कर सकते हैं। यह सरल यूक्लिडियन दूरी से अधिक मजबूत है लेकिन परिवर्तित छवियों पर काम नहीं करता है और आपको फिर से सीमा की आवश्यकता होगी।
  • हिस्टोग्राम तुलना - यदि आप सामान्यीकृत हिस्टोग्राम का उपयोग करते हैं, तो यह विधि अच्छी तरह से काम करती है और एफ़िन ट्रांसफॉर्म से प्रभावित नहीं होती है। समस्या सही दहलीज निर्धारित कर रही है। यह रंग परिवर्तन (चमक, विपरीत इत्यादि) के प्रति भी संवेदनशील है। आप इसे पिछले दो के साथ जोड़ सकते हैं।
  • मुख्य बिंदु / क्षेत्रों के डिटेक्टर - जैसे एमएसईआर (अधिकतम स्थिर चरम क्षेत्र) , एसयूआरएफ या SIFT । ये बहुत मजबूत एल्गोरिदम हैं और वे आपके सरल कार्य के लिए बहुत जटिल हो सकते हैं। अच्छी बात यह है कि आपके पास केवल एक आइकन के साथ सटीक क्षेत्र नहीं है, ये डिटेक्टर सही मिलान खोजने के लिए पर्याप्त शक्तिशाली हैं। इन तरीकों का एक अच्छा मूल्यांकन इस पेपर में है: स्थानीय इनवेरिएंट फीचर डिटेक्टर: एक सर्वेक्षण

इनमें से अधिकतर ओपनसीवी में पहले ही कार्यान्वित किए गए हैं - उदाहरण के लिए देखें cvMatchTemplate विधि (हिस्टोग्राम मिलान का उपयोग करता है): http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html । मुख्य बिंदु / क्षेत्र डिटेक्टर भी उपलब्ध हैं - ओपनसीवी फ़ीचर डिटेक्शन देखें





computer-vision