মিলের জন্য চিত্রগুলির তুলনা করার সহজ এবং দ্রুত পদ্ধতি


192

মিলের জন্য দুটি চিত্রের তুলনা করার জন্য আমার একটি সহজ এবং দ্রুত উপায় প্রয়োজন। অর্থাৎ আমি যদি উচ্চ জিনিস পেতে চাই তবে সেগুলিতে ঠিক একই জিনিস রয়েছে তবে কিছুটা ভিন্ন ব্যাকগ্রাউন্ড থাকতে পারে এবং কয়েক পিক্সেল দ্বারা সরানো / পুনরায় আকার দিতে পারে।

(আরও কংক্রিট, যদি এটি বিবেচনা করে তবেই: একটি ছবি একটি আইকন এবং অন্য ছবিটি একটি স্ক্রিনশটের একটি subarea এবং আমি জানতে চাই যে সেই সুবারিয়াটি হ'ল আইকন কিনা or)

আমার হাতে ওপেনসিভি রয়েছে তবে আমি এখনও এর সাথে অভ্যস্ত নই।

একটি সম্ভাবনা যা আমি এখনও পর্যন্ত ভেবেছিলাম: উভয় চিত্রকে 10x10 কোষে ভাগ করুন এবং এই 100 টি কোষের জন্য প্রতিটি রঙের হিস্টোগ্রামের তুলনা করুন। তারপরে আমি কিছু আপ আপ থ্রেশহোল্ড মান সেট করতে পারি এবং আমি যে মানটি পাই তা প্রান্তিকের উপরে হয়, আমি ধরে নিই যে সেগুলি সমান।

আমি এটি এখনও কতটা ভাল কাজ করে তা চেষ্টা করি নি তবে আমার ধারণা এটি যথেষ্ট ভাল হবে। চিত্রগুলি ইতিমধ্যে বেশ অনুরূপ (আমার ব্যবহারের ক্ষেত্রে), তাই আমি একটি সুন্দর উচ্চ প্রান্তিক মান ব্যবহার করতে পারি।

আমি অনুমান করি যে এর জন্য আরও কয়েকটি সম্ভাব্য সমাধান রয়েছে যা আরও কম বেশি কাজ করবে (যেহেতু টাস্কটি নিজেই খুব সহজ কারণ আমি কেবলমাত্র তারা যদি খুব মিল হয় তবেই মিল খুঁজে পেতে চাই)। তুমি কি পরামর্শ দাও?


কোনও চিত্র থেকে স্বাক্ষর / ফিঙ্গারপ্রিন্ট / হ্যাশ প্রাপ্ত সম্পর্কে কয়েকটি খুব সম্পর্কিত / অনুরূপ প্রশ্ন রয়েছে:

এছাড়াও, আমি এই বাস্তবায়নগুলিতে হোঁচট খেয়েছি যার একটি আঙুলের ছাপ পাওয়ার জন্য এই ধরনের ফাংশন রয়েছে:

ধারণাগত ইমেজ হ্যাশ সম্পর্কে কিছু আলোচনা: এখানে


কিছুটা অফটোপিক: অডিও ফিঙ্গারপ্রিন্টগুলি তৈরি করার জন্য অনেকগুলি পদ্ধতি রয়েছে। গানের জন্য আঙুলের ছাপ-ভিত্তিক চেহারা সরবরাহ করে এমন একটি ওয়েব-সার্ভিস মিউজিকবাইনজ তাদের উইকিতে একটি ভাল ওভারভিউ করেছে । তারা এখন অ্যাকোস্টিড ব্যবহার করছে। এটি সঠিক (বা বেশিরভাগ নির্ভুল) মিলগুলি সন্ধানের জন্য। অনুরূপ মিলগুলি খুঁজে পাওয়ার জন্য (বা আপনার কাছে কিছু স্নিপেট বা উচ্চ শব্দ থাকলে), ইকোপ্রিন্টটি একবার দেখুন । সম্পর্কিত সম্পর্কিত একটি প্রশ্ন এখানে । সুতরাং মনে হচ্ছে এটি অডিওর জন্য সমাধান হয়েছে। এই সমস্ত সমাধান বেশ ভাল কাজ করে।

সাধারণভাবে अस्पष्ट অনুসন্ধান সম্পর্কে আরও কিছু সাধারণ প্রশ্ন এখানে । যেমন স্থানীয়ভাবে সংবেদনশীল হ্যাশিং এবং নিকটতম প্রতিবেশী অনুসন্ধান রয়েছে


1
ইমেজ ফিঙ্গারপ্রিন্ট সাহায্য করতে পারে? stackoverflow.com/questions/596262/...
GWW

আর্থ মোভারের দূরত্ব (ইএমডি) নামে পরিচিত ওয়াসারস্টেইন মেট্রিক এমন একটি জিনিস যা লোকেরা জানেন না বলে মনে হয় তবে আপনি এখানে যা চান তা বেশিরভাগই দেবে।
মিমজিপি


হাই, আমি উন্নত ডি হাশ নিয়ে এসেছি - আমি এটিকে আইডিহ্যাশ বলেছি: github.com/Nakilon/dhash-vips
নাকিলন

উত্তর:


107

স্ক্রিনশট বা আইকন রূপান্তরিত করা যেতে পারে (স্কেলড, ঘোরানো, স্কিউ ...)? আমার মাথার উপরে বেশ কয়েকটি পদ্ধতি রয়েছে যা সম্ভবত আপনাকে সহায়তা করতে পারে:

  • @ কার্লোসডিসি দ্বারা উল্লিখিত সরল ইউক্লিডিয়ান দূরত্ব (রূপান্তরিত চিত্রগুলির সাথে কাজ করে না এবং আপনার একটি প্রান্তিকের প্রয়োজন)।
  • (সাধারণীকৃত) ক্রস কারেলেনশন - একটি সাধারণ মেট্রিক যা আপনি চিত্রের ক্ষেত্রগুলির তুলনার জন্য ব্যবহার করতে পারেন। এটি সাধারণ ইউক্যালিডিয়ান দূরত্বের চেয়ে বেশি শক্তিশালী তবে রূপান্তরিত চিত্রগুলিতে কাজ করে না এবং আপনার আবার একটি প্রান্তিকের প্রয়োজন হবে।
  • হিস্টোগ্রাম তুলনা - আপনি যদি হিস্টোগ্রামগুলি স্বাভাবিক করেন তবে এই পদ্ধতিটি ভালভাবে কাজ করে এবং এফাইন ট্রান্সফর্ম দ্বারা প্রভাবিত হয় না। সমস্যাটি সঠিক প্রান্তিকতা নির্ধারণ করছে। এটি রঙ পরিবর্তনের ক্ষেত্রেও খুব সংবেদনশীল (উজ্জ্বলতা, বিপরীতে ইত্যাদি)। আপনি এটি আগের দুটি সাথে একত্রিত করতে পারেন।
  • মুখ্য পয়েন্ট / অঞ্চলগুলির ডিটেক্টর - যেমন এমএসইআর (সর্বোচ্চ স্ট্যাবল এক্সটরমাল অঞ্চলগুলি) , এসআরএফ বা এসআইএফটি । এগুলি খুব মজাদার অ্যালগরিদম এবং এটি আপনার সাধারণ কাজের জন্য খুব জটিল be ভাল জিনিস হ'ল আপনার কেবলমাত্র একটি আইকন সহ সঠিক অঞ্চল থাকতে হবে না, এই ডিটেক্টরগুলি সঠিক মিল খুঁজে পেতে যথেষ্ট শক্তিশালী। এই পদ্ধতির একটি দুর্দান্ত মূল্যায়ন এই কাগজে রয়েছে: স্থানীয় আক্রমণকারী বৈশিষ্ট্য সনাক্তকারী: একটি সমীক্ষা

এর বেশিরভাগই ইতিমধ্যে ওপেনসিভিতে প্রয়োগ করা হয়েছে - উদাহরণস্বরূপ দেখুন সিভিম্যাচটেম্পলেট পদ্ধতি (হিস্টগ্রামের ম্যাচিং ব্যবহার করে): http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html । প্রধান পয়েন্ট / অঞ্চল সনাক্তকারীগুলিও উপলব্ধ - ওপেনসিভি বৈশিষ্ট্য সনাক্তকরণ দেখুন


1
এটি ছোট বা সামান্য সরানো যেতে পারে। এছাড়াও আইকনের পটভূমি আলাদা হবে। আমি হিস্টগ্রাম তুলনা চেষ্টা করেছি কিন্তু আমি অনেক মিথ্যা ধনাত্মক পেয়েছি। আমি ইউক্যালিডিয়ান দূরত্বও চেষ্টা করেছিলাম তবে এটি অনেকগুলি মিথ্যা ধনাত্মকতাও দেয় (তবে আমি আইকনের আলফা মানটির জন্য এটি কিছুটা আরও ভালভাবে পরিচালনা করতে পারি)। আমি আরও কিছুদূর চেষ্টা করব, নইলে আমি এমএসইআর, এসআরএফ বা সিফ্ট পরীক্ষা করে দেখব will
অ্যালবার্ট

1
আরেকটি ধারণা - আপনি যদি সোবল অপারেটর প্রয়োগের পরে চিত্রগুলির হিস্টোগ্রাম তুলনা ব্যবহার করেন তবে এটি কাজ করবে না? এটি কেবল প্রান্তের মিলের তুলনা করবে। ব্যাকগ্রাউন্ডটি কীভাবে "ছদ্মবেশী" তার উপর নির্ভরশীল হতে পারে বা কাজ করতে পারে না।
ক্যারেল পেট্রেনেক

44

আমি সম্প্রতি একই সমস্যার মুখোমুখি হয়েছি, এই সমস্যাটি সমাধান করার জন্য (দুটি চিত্রের তুলনায় সহজ এবং দ্রুত অ্যালগরিদম) একবার এবং সর্বোপরি, আমি একটি 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));
}

এই ক্ষেত্রে, কালারমোমেন্ট হ্যাশ আমাদের সেরা ফলাফল দেয়

  • গাউসিয়ান ব্লার অ্যাটাক: 0.567521
  • শিফট আক্রমণ: 0.229728
  • পুনরায় আকার দিন: 0.229358

প্রতিটি অ্যালগরিদমের পেশাদার এবং কনস

বিভিন্ন আক্রমণ অধীনে পারফরম্যান্স

Img_hash এর অভিনয়ও বেশ ভাল

ফ্যাশ লাইব্রেরির সাথে গতির তুলনা (ইউকেঞ্চ থেকে 100 টি চিত্র) গণনা কর্মক্ষমতা তুলনা কর্মক্ষমতা

আপনি যদি এই অ্যালগরিদমের জন্য সুপারিশের প্রান্তিকতা জানতে চান তবে দয়া করে এই পোস্টটি দেখুন ( http://qtandopencv.blogspot.my/2016/06/intr پيداوار- to- image-hash-module-of.html )। আমি কীভাবে img_hash মডিউলগুলির পারফরম্যান্সটি পরিমাপ করব (আকর্ষণ এবং বিভিন্ন আক্রমণ অন্তর্ভুক্ত) সম্পর্কে যদি আগ্রহী হন তবে দয়া করে এই লিঙ্কটি পরীক্ষা করুন ( http://qtandopencv.blogspot.my/2016/06/speed-up-image-hashing-of -opencvimghash.html )।


11

স্ক্রিনশটটিতে কি কেবল আইকন রয়েছে? যদি তা হয় তবে দুটি চিত্রের L2 দূরত্ব যথেষ্ট হতে পারে। যদি এল 2 দূরত্বটি কাজ না করে, তবে পরবর্তী পদক্ষেপটি হল সহজ এবং সুপ্রতিষ্ঠিত কিছু চেষ্টা করা, যেমন: লুকাস-কানাদে । যা আমি নিশ্চিত ওপেনসিভিতে উপলব্ধ।


সুবারে হ'ল আইকনটি রয়েছে (কিছু এলোমেলো ব্যাকগ্রাউন্ড সহ) বা অন্যরকম কিছু। আমি দেখতে চাই যে এটি কোন মামলা। যদিও এটি খুব সামান্য স্থানান্তরিত বা পুনরায় আকারিত হতে পারে, সে কারণেই আমি নিশ্চিত ছিলাম না যে আমি কেবল দূরত্বটি (যা কিছু আদর্শে) দেখতে পারি কিনা। তবে আমি একটি ছোট আকারের সংস্করণ দিয়ে চেষ্টা করব।
অ্যালবার্ট

6

দুটি ছবির মিলের বিষয়ে যদি আপনি একটি সূচক পেতে চান তবে আমি আপনাকে মেট্রিক থেকে এসএসআইএম সূচকটি থেকে পরামর্শ দেব। এটি মানুষের চোখের সাথে আরও সামঞ্জস্যপূর্ণ। এটি সম্পর্কে একটি নিবন্ধ এখানে: স্ট্রাকচারাল সাদৃশ্য সূচক

এটি ওপেনসিভিতেও প্রয়োগ করা হয়েছে, এবং এটি জিপিইউ দিয়ে ওপেনসিভি এসএসআইএম দিয়ে ত্বরান্বিত করা যেতে পারে


5

আপনি যদি পরীক্ষার অঞ্চলে আপনার টেম্পলেটটির (আইকন) সুনির্দিষ্ট প্রান্তিককরণ নিশ্চিত করতে পারেন তবে পিক্সেল পার্থক্যগুলির যে কোনও পুরানো যোগফল কাজ করবে।

যদি প্রান্তিককরণটি কেবল একটি সামান্য বিট বন্ধ হতে চলেছে, তবে আপনি পিক্সেল পার্থক্যের যোগফল খুঁজে বের করার আগে সিভি :: গাউসিয়ান ব্লুর দিয়ে উভয় চিত্র কম-পাস করতে পারেন ।

প্রান্তিককরণের মানটি যদি সম্ভাব্যভাবে দুর্বল হয় তবে আমি ওরিয়েন্টেড গ্রেডিয়েন্টগুলির একটি হিস্টোগ্রাম বা ওপেনসিভির সুবিধাজনক কীপয়েন্ট সনাক্তকরণ / বর্ণনাকারী অ্যালগরিদমগুলির মধ্যে একটি (যেমন এসআইএফটি বা এসআরএফ ) এর প্রস্তাব দেব


4

যদি অভিন্ন চিত্রগুলির সাথে মিলে যায় - এল 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
}

ফাস্ট। তবে আলোক / দৃষ্টিভঙ্গি ইত্যাদির পরিবর্তনের পক্ষে দৃust় নয় Source


2

আপনি যদি মিলটির জন্য চিত্রটির তুলনা করতে চান তবে আমি আপনাকে ওপেনসিভি ব্যবহারের পরামর্শ দিচ্ছি। ওপেনসিভিতে কয়েকটি বৈশিষ্ট্য মেলানো এবং টেম্পলেট মিল রয়েছে। বৈশিষ্ট্য মিলে যাওয়ার জন্য রয়েছে SURF, SIFT, FAST এবং ডিটেক্টর। আপনি এটি চিত্রটি সনাক্ত করতে, বর্ণনা করতে এবং তার সাথে ম্যাচ করার জন্য ব্যবহার করতে পারেন। এর পরে, আপনি দুটি চিত্রের মধ্যে মিলের সংখ্যাটি সন্ধান করতে নির্দিষ্ট সূচকটি ব্যবহার করতে পারেন।


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