আমি কীভাবে সনাক্ত করব যে দুটি চিত্র "একই" তবে কারও কিছুটা আলাদা ফসল / অনুপাত রয়েছে?


11

আমার দুটি ভিন্ন চিত্র রয়েছে:

100px এখানে চিত্র বর্ণনা লিখুনবা 400px সহএখানে চিত্র বর্ণনা লিখুন

এবং

100px প্রস্থ এখানে চিত্র বর্ণনা লিখুনবা 400px এএখানে চিত্র বর্ণনা লিখুন

আপনি দেখতে পাচ্ছেন যে দু'জনেই মানুষের দৃষ্টিকোণ থেকে স্পষ্টভাবে "একই"। এখন আমি প্রোগ্রামিয়ালি সনাক্ত করতে চাই যে তারা একই রকম। আমি রুবি রত্নটির মাধ্যমে চিত্রের যাদুটি ব্যবহার করে যাচ্ছি rmagick:

img1 = Magick::Image.from_blob(File.read("image_1.jpeg")).first
img2 = Magick::Image.from_blob(File.read("image_2.jpeg")).first

if img1.difference(img2).first < 4000.0 # I have found this to be a good threshold, but does not work for cropped images
  puts "they are the same!!!"
end

এটি একই অনুপাত / ক্রপিংয়ের মতো চিত্রগুলির জন্য ভাল কাজ করে, যখন তাদের সামান্য আলাদা ফসল হয় এবং একই প্রস্থে পুনরায় আকার দেওয়া হয় তখন এটি আদর্শ নয়।

বিভিন্ন ফসলযুক্ত চিত্রগুলির জন্য এটি করার কোনও উপায় আছে কি? আমি এমন একটি সমাধানে আগ্রহী যেখানে আমি এর মতো কিছু বলতে পারি: একটি চিত্র অন্যটির অভ্যন্তরে অন্তর্ভুক্ত থাকে এবং এর কোথাও কোথাও coversেকে থাকে যেমন 90%।

পুনশ্চ. ছবিগুলি যদি উচ্চতর রেজোলিউশনে সহায়তা করে তবে আমি এটি পেতে পারি (যেমন ডাবল)


2
আরম্যাগিক সম্পর্কে নিশ্চিত না, তবে ইমেজম্যাগিকের compareকমান্ড লাইন সরঞ্জামটিতে একটি -subimage-searchসুইচ রয়েছে।
স্টিফান

এটি আকর্ষণীয়, এমন কমান্ডটি দেখতে কেমন হবে?
নীলস ক্রিস্টিয়ান

2
এটি নিজেই কখনও ব্যবহার করেননি
স্টেফান

ধন্যবাদ, এটি একটি দুর্দান্ত তথ্য piece রুবি থেকে কীভাবে এটি করা যায় তা আমি বুঝতে পারি না ...
নীলস ক্রিশ্চিয়ান

1
ছবিগুলি কি নিম্নমানের? যদি না হয় তবে আরও গুণমান সহ চিত্রগুলির বৃহত সংস্করণটি ভাগ করুন।
এমএইচ 304

উত্তর:


6

আপনি বৈশিষ্ট্যটির মিলটি একবার দেখে নিতে পারেন। ধারণাটি দুটি চিত্রের বৈশিষ্ট্যগুলি সন্ধান এবং তাদের সাথে মেলে। এই পদ্ধতিটি সাধারণত অন্য ছবিতে একটি টেম্পলেট (একটি লোগো বলুন) সন্ধান করতে ব্যবহৃত হয়। সংক্ষেপে একটি বৈশিষ্ট্যটিকে এমন জিনিস হিসাবে বর্ণনা করা যেতে পারে যা কোনও চিত্রে যেমন মানুষ কোণে বা খোলা জায়গাগুলিতে আকর্ষণীয় দেখায়। ফিচার সনাক্তকরণ কৌশলগুলি অনেক ধরণের সেখানে রয়েছে তবে আমার প্রস্তাবটি স্কেল-ইনগ্রেন্ট ফিচার ট্রান্সফর্ম (SIFT) বৈশিষ্ট্য সনাক্তকরণ অ্যালগরিদম হিসাবে ব্যবহার করার জন্য। SIFT চিত্রের অনুবাদ, স্কেলিং, ঘূর্ণন, আলোকসজ্জার পরিবর্তনের জন্য আংশিকভাবে আক্রমণাত্মক এবং স্থানীয় জ্যামিতিক বিকৃতিতে শক্তিশালী। এটি আপনার স্পেসিফিকেশনের সাথে মিলছে বলে মনে হচ্ছে যেখানে চিত্রগুলিতে কিছুটা আলাদা অনুপাত থাকতে পারে।

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

Matches: 42

সবুজ রেখাগুলি "ভাল ম্যাচগুলি" উপস্থাপন করে যা অনুপাত পরীক্ষায় উত্তীর্ণ হয় এমন বিন্দুগুলি সনাক্ত করা সমস্ত ম্যাচের প্রতিনিধিত্ব করে। আপনি যদি অনুপাত পরীক্ষাটি ব্যবহার না করেন তবে সমস্ত পয়েন্ট অঙ্কিত হবে। এইভাবে, আপনি কেবল সেরা মিলিত বৈশিষ্ট্যগুলি রাখার জন্য এই ফিল্টারটিকে একটি প্রান্তিক হিসাবে ব্যবহার করতে পারেন।


আমি পাইথনে এটি প্রয়োগ করেছি, আমি রেলগুলির সাথে খুব বেশি পরিচিত নই। ভাগ্য ভালো, এই সাহায্য আশা করি!

কোড

import numpy as np
import cv2

# Load images
image1 = cv2.imread('1.jpg', 0)
image2 = cv2.imread('2.jpg', 0)

# Create the sift object
sift = cv2.xfeatures2d.SIFT_create(700)

# Find keypoints and descriptors directly
kp1, des1 = sift.detectAndCompute(image2, None)
kp2, des2 = sift.detectAndCompute(image1, None)

# FLANN parameters
FLANN_INDEX_KDTREE = 1
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks=50)   # or pass empty dictionary
flann = cv2.FlannBasedMatcher(index_params,search_params)
matches = flann.knnMatch(des1,des2,k=2)

# Need to draw only good matches, so create a mask
matchesMask = [[0,0] for i in range(len(matches))]

count = 0
# Ratio test as per Lowe's paper (0.7)
# Modify to change threshold 
for i,(m,n) in enumerate(matches):
    if m.distance < 0.15*n.distance:
        count += 1
        matchesMask[i]=[1,0]

# Draw lines
draw_params = dict(matchColor = (0,255,0),
                   # singlePointColor = (255,0,0),
                   matchesMask = matchesMask,
                   flags = 0)

# Display the matches
result = cv2.drawMatchesKnn(image2,kp1,image1,kp2,matches,None,**draw_params)
print('Matches:', count)
cv2.imshow('result', result)
cv2.waitKey()

2
দুর্দান্ত আকর্ষণীয় পদ্ধতির, আমি এটিকে একটি স্পিন দেব এবং ফিরে আসব ...
নীলস ক্রিস্টিয়ান

পুনশ্চ. আমি চিত্রগুলি আরও বড় আকারে আপডেট করেছি
নীলস ক্রিস্টিয়ান

1
@ নাথানসিটি কি আপনার উদাহরণের সাথে সবুজ বিন্দু মিলে যায় তবে নীল রঙের হয় না? দেখে মনে হচ্ছে অনেকগুলি তুলনামূলক বিন্দু আছে?
ড্রাকো আটার

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

ধন্যবাদ। উত্তরের প্রতিযোগিতা ছিল কঠিন, অনেক দুর্দান্ত :-)
নীলস ক্রিস্টিয়ান

4

যেহেতু ইমেজম্যাগিক খুব পুরানো, উন্নত এবং বহু বৈশিষ্ট্যযুক্ত সরঞ্জাম, তাই বেশিরভাগ বৈশিষ্ট্যগুলিকে অন্তর্ভুক্ত এমন একটি ইন্টারফেস তৈরি করা কঠিন হবে। এটি যতটা দুর্দান্ত, rmagick (এবং পাইথন যে প্রচুর প্রচেষ্টা চালিয়েছে তা নয়) সমস্ত বৈশিষ্ট্য coveringাকতে কাছে আসে না।

আমি অনেক ব্যবহারের ক্ষেত্রে কল্পনা করি, এটি একটি নিরাপদ পর্যাপ্ত এবং কেবলমাত্র একটি কমান্ড লাইন পদ্ধতি কার্যকর করতে এবং সেখান থেকে পড়তে সহজ হবে। রুবিতে এমন দেখাবে;

require 'open3'

def check_subimage(large, small)
    stdin, stdout, stderr, wait_thr = Open3.popen3("magick compare -subimage-search -metric RMSE #{large} #{small} temp.jpg")
    result = stderr.gets
    stderr.close
    stdout.close
    return result.split[1][1..-2].to_f < 0.2
end

if check_subimage('a.jpg', 'b.jpg')
    puts "b is a crop of a"
else
    puts "b is not a crop of a"
end

আমি গুরুত্বপূর্ণ জিনিসগুলি কভার করব এবং তারপরে অতিরিক্ত নোটগুলি নিয়ে কথা বলব।

দ্বিতীয় চিত্র ( small) প্রথম ( large) এর উপবিবেশন কিনা তা পরীক্ষা করতে কমান্ডটি ম্যাজিক তুলনা ব্যবহার করে । এই ফাংশনটি ছোট (উচ্চতা এবং প্রস্থ উভয়) চেয়ে কড়াভাবে ছোট কিনা তা পরীক্ষা করে না। সাদৃশ্যটির জন্য আমি যে নম্বরটি রেখেছি তা 0.2 (20% ত্রুটি), এবং আপনার সরবরাহিত চিত্রগুলির মান প্রায় 0.15। আপনি এই টিউন টিউন করতে পারেন! আমি দেখতে পেলাম যে ছবিগুলি একটি কঠোর উপসেট হয় 0.01 এর চেয়ে কম পায়।

  • আপনার যদি 90% ওভারল্যাপ রয়েছে এমন ক্ষেত্রে যদি আপনি কম ত্রুটি (ছোট সংখ্যা) চান তবে দ্বিতীয় চিত্রটিতে প্রথমে যেটি অতিরিক্ত জিনিস থাকে না আপনি এটি একবার চালাতে পারেন, তারপরে সাবমিজটি রয়েছে যেখানে প্রথম বড় চিত্রটি কাটা , তারপরে এটিকে ক্রপযুক্ত চিত্রটি "ছোট" এক হিসাবে এবং মূল "ছোট" চিত্রটিকে বৃহত্তর হিসাবে আবার চালান।
  • আপনি যদি রুবিতে সত্যিই একটি দুর্দান্ত অবজেক্ট ওরিয়েন্টেড ইন্টারফেস চান, তবে rmagick ম্যাজিককোর এপিআই ব্যবহার করে। এটি (ডক্সের লিঙ্ক) কমান্ডটি সম্ভবত এটি প্রয়োগ করতে আপনি ব্যবহার করতে চান এবং আপনি নিজেই rmagick বা প্যাকেজটি প্যাকেজ করতে খুলতে পারেন।
  • ওপেন 3 ব্যবহার করে একটি থ্রেড শুরু হবে ( দস্তাবেজগুলি দেখুন )। বন্ধ করা stderrএবং stdout"প্রয়োজনীয়" নয় তবে আপনার অনুমিত হওয়া উচিত।
  • তৃতীয় আর্গ যে "টেম্প" ইমেজটি কোনও ফাইল বিশ্লেষণ করে আউটপুট করার জন্য এটি নির্দিষ্ট করে। দ্রুত চেহারা দিয়ে, এটির প্রয়োজন না হওয়ার উপায় আমি খুঁজে পেলাম না তবে এটি স্বয়ংক্রিয়ভাবে ওভাররাইট হয়ে যায় এবং ডিবাগিংয়ের জন্য সংরক্ষণ করা ভাল। আপনার উদাহরণস্বরূপ, এটি দেখতে এমন হবে;

এখানে চিত্র বর্ণনা লিখুন

  • সম্পূর্ণ আউটপুটটি 10092.6 (0.154003) @ 0,31 এর ফর্ম্যাটে রয়েছে। প্রথম সংখ্যাটি 655535 এর মধ্যে আরএমএস মান, দ্বিতীয়টি (যা আমি ব্যবহার করি) শতাংশ স্বাভাবিক হয়। শেষ দুটি সংখ্যা মূল চিত্রটির অবস্থান উপস্থাপন করে যা থেকে ছোট চিত্র শুরু হয়।
  • যেহেতু "অনুরূপ" চিত্রগুলি কীভাবে সত্যতার কোনও উত্সের উত্স নেই, তাই আমি আরএমএসই বেছে নিয়েছি ( এখানে আরও মেট্রিক বিকল্প দেখুন )। এটি মানগুলির মধ্যে পার্থক্যগুলির একটি মোটামুটি সাধারণ পরিমাপ। একটি নিখুঁত ত্রুটি গণনা (এই) একটি ভাল ধারণা বলে মনে হতে পারে তবে এটি মনে হচ্ছে যে কিছু ক্রপিং সফ্টওয়্যার পিক্সেলগুলি পুরোপুরি সংরক্ষণ করে না তাই আপনাকে ফাজ সামঞ্জস্য করতে হবে এবং এটি কোনও স্বাভাবিক মানের নয়, সুতরাং আপনাকে ত্রুটি গণনা তুলনা করতে হবে ইমেজ আকার এবং কি না।

1
সত্যিই দুর্দান্ত কিছু তথ্য আছে ক্যারল। ধন্যবাদ
নীলস ক্রিস্টিয়ান

আপনার অন্যান্য ক্ষেত্রে এটি কীভাবে কাজ করে তা জানতে আগ্রহী!
ক্যারল চেন

1
সুপার দুর্দান্ত উত্তরের জন্য ধন্যবাদ। যদি আমি পারতাম তবে আমি আপনাকে এটির জন্য 100p পুরস্কারও দিয়েছিলাম :-)
নীলস ক্রিশ্চিয়ান

3

উভয় চিত্রের হিস্টগ্রাম পান এবং তাদের তুলনা করুন। এটি ক্রপ এবং জুমের জন্য খুব ভাল কাজ করবে যদি না এর কারণে খুব কড়া পরিবর্তন ঘটে।

এটি এখনকার পদ্ধতির চেয়ে ভাল যেখানে আপনি সরাসরি চিত্রগুলি বিয়োগ করছেন। তবে এই পদ্ধতির এখনও অল্প কিছু আছে।


আমি এটি একবার খেয়াল করব পরামর্শের জন্য ধন্যবাদ।
নীলস ক্রিস্টিয়ান

এটি খুব কার্যকর উত্তর নয় কারণ এটি লক্ষ্য কীভাবে সম্পাদন করতে হয় তা প্রদর্শন করে না। এটি "গুগল এই পদ এবং এটি খুঁজে বের করার সমতুল্য"।
anothermh

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

3

সাধারণত এই পরিস্থিতিতে টেমপ্লেট ম্যাচিংয়ের ভাল ফলাফল হয়। টেমপ্লেট মিলটি কোনও চিত্রের ক্ষেত্রগুলির সন্ধানের জন্য একটি কৌশল যা কোনও টেম্পলেট চিত্রের সাথে মিল থাকে (দ্বিতীয় চিত্র)। এই অ্যালগরিদম উত্স চিত্রের সেরা ম্যাকটেড পজিশনের জন্য একটি স্কোর দেয় (দ্বিতীয়টি)।

ওপেনসিভিতে টিএম_সিসিইএফএফ_এনআরএমইডি পদ্ধতিটি ব্যবহার করে 0 এবং 1 এর মধ্যে স্কোর দেয় that দুটি চিত্র, স্কোর 1 এর চেয়ে কম হবে।

এখন সাদৃশ্য স্কোরের জন্য একটি প্রান্তিক বিবেচনা করে, আপনি সেগুলি একই কি না তা আবিষ্কার করতে পারেন। সেই থ্রোসোল্ডটি কয়েকটি নমুনা চিত্রগুলিতে কিছু ট্রায়াল এবং ত্রুটি দ্বারা প্রাপ্ত হতে পারে। আমি আপনার চিত্রগুলি চেষ্টা করেছি এবং স্কোরটি 0.823863 পেয়েছি । এখানে কোডটি (ওপেনসিভি সি ++) এবং দুটি চিত্রের মধ্যে সাধারণ ক্ষেত্র, যা ম্যাচের মাধ্যমে প্রাপ্ত:

এখানে চিত্র বর্ণনা লিখুন

Mat im2 = imread("E:/1/1.jpg", 1);
//Mat im2;// = imread("E:/1/1.jpg", 1);
Mat im1 = imread("E:/1/2.jpg", 1);

//im1(Rect(0, 0, im1.cols - 5, im1.rows - 5)).copyTo(im2);

int result_cols = im1.cols - im2.cols + 1;
int result_rows = im1.rows - im2.rows + 1;

Mat result = Mat::zeros(result_rows, result_cols, CV_32FC1);

matchTemplate(im1, im2, result, TM_CCOEFF_NORMED);

double minVal; double maxVal;
Point minLoc; Point maxLoc;
Point matchLoc;

minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());

cout << minVal << " " << maxVal << " " << minLoc << " " << maxLoc << "\n";
matchLoc = maxLoc;

rectangle(im1, matchLoc, Point(matchLoc.x + im2.cols, matchLoc.y + im2.rows), Scalar::all(0), 2, 8, 0);
rectangle(result, matchLoc, Point(matchLoc.x + im2.cols, matchLoc.y + im2.rows), Scalar::all(0), 2, 8, 0);

imshow("1", im1);
imshow("2", result);
waitKey(0);

সুপার দুর্দান্ত উত্তরের জন্য ধন্যবাদ। যদি আমি পারতাম তবে আমি আপনাকে এটির জন্য 100p পুরস্কারও দিয়েছিলাম :-)
নীলস ক্রিশ্চিয়ান

2

সন্ধান_সামান্য_স্থান পদ্ধতিটি বিবেচনা করুন । লক্ষ্য চিত্র হিসাবে দুটি চিত্রের ছোট ব্যবহার করুন। চিত্র এবং টার্গেট ইমেজের ফ্যজ বৈশিষ্ট্যের জন্য বিভিন্ন মান চেষ্টা করুন।


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