এটি সেরা সমাধান নয়, তবে এটি একটি সমাধান। আমি আরও ভাল কৌশল শিখতে চাই:
যদি এগুলি ঘোরানো বা ছোট করা না যায়, আপনি চিত্রগুলির একটি সাধারণ ক্রস-পারস্পরিক সম্পর্ক ব্যবহার করতে পারেন। বৃহত্তর চিত্রটিতে ছোট চিত্রটি যেখানেই ঘটে সেখানে একটি উজ্জ্বল শিখর থাকবে।
আপনি এফএফটি পদ্ধতিটি ব্যবহার করে ক্রস-পারস্পরিক সম্পর্কের গতি বাড়িয়ে তুলতে পারেন, তবে আপনি যদি কেবলমাত্র একটি বৃহত টার্গেট চিত্রের সাথে একটি ছোট উত্স চিত্রের সাথে মেলে থাকেন তবে ব্রুট-ফোর্স মাল্টিপল-অ্যান্ড-অ্যাড পদ্ধতিটি কখনও কখনও (সাধারণত নয়) দ্রুত হয়।
উৎস:
টার্গেট:
ক্রস-কোরিলেশন:
দুটি উজ্জ্বল স্পটগুলি হ'ল লোকেশন match
কিন্তু আপনি কি যাতে নিজে কাজ করবে না, আপনার উদাহরণ ছবিতে একটি ঘূর্ণন প্যারামিটার আছে। যদি কেবল ঘূর্ণনের অনুমতি দেওয়া হয়, এবং স্কেলিং না করে তবে ক্রস-পারস্পরিক সম্পর্ক ব্যবহার করা এখনও সম্ভব তবে আপনার ক্রস-কনলেটলেট, উত্সটি ঘোরানো, এটি পুরো লক্ষ্য চিত্রের সাথে ক্রস-কোলেক্টেলেটেড, আবার ঘোরানো ইত্যাদি প্রয়োজন need সমস্ত ঘূর্ণন।
মনে রাখবেন যে এটি অগত্যা কখনও চিত্রটি খুঁজে পাবে না। যদি উত্স চিত্রটি এলোমেলো গোলমাল হয় এবং লক্ষ্যটি এলোমেলো গোলমাল হয় তবে আপনি সঠিক দৃষ্টিতে অনুসন্ধান না করে আপনি এটি পাবেন না। সাধারণ পরিস্থিতিতে এটি সম্ভবত এটি খুঁজে পেতে পারে তবে এটি চিত্রের বৈশিষ্ট্য এবং আপনার অনুসন্ধান করা কোণগুলির উপর নির্ভর করে।
এই পৃষ্ঠাটি এটি কীভাবে হবে তার উদাহরণ দেখায়, তবে অ্যালগরিদম দেয় না।
যে কোনও অফসেট যেখানে যোগফল কিছুটা থ্রেশহোল্ডের ওপরে রয়েছে এটি ম্যাচ। আপনি নিজের সাথে উত্স চিত্রটি সংযুক্ত করে এবং এই সংখ্যার দ্বারা আপনার সমস্ত অঙ্কগুলি ভাগ করে ম্যাচের ভালতা গণনা করতে পারেন। একটি নিখুঁত ম্যাচ হবে 1.0।
এটি খুব কম্পিউটেশনালভাবে ভারী হবে, যদিও, এবং সম্ভবত বিন্দুগুলির মিলের প্যাটার্নগুলির জন্য আরও ভাল পদ্ধতি রয়েছে (যার বিষয়ে আমি জানতে চাই)।
গ্রেস্কেল এবং এফএফটি পদ্ধতি ব্যবহার করে দ্রুত পাইথনের উদাহরণ:
from __future__ import division
from pylab import *
import Image
import ImageOps
source_file = 'dots source.png'
target_file = 'dots target.png'
# Load file as grayscale with white dots
target = asarray(ImageOps.invert(Image.open(target_file).convert('L')))
close('all')
figure()
imshow(target)
gray()
show()
source_Image = ImageOps.invert(Image.open(source_file).convert('L'))
for angle in (0, 180):
source = asarray(source_Image.rotate(angle, expand = True))
best_match = max(fftconvolve(source[::-1,::-1], source).flat)
# Cross-correlation using FFT
d = fftconvolve(source[::-1,::-1], target, mode='same')
figure()
imshow(source)
# This only finds a single peak. Use something that finds multiple peaks instead:
peak_x, peak_y = unravel_index(argmax(d),shape(d))
figure()
plot(peak_y, peak_x,'ro')
imshow(d)
# Keep track of all these matches:
print angle, peak_x, peak_y, d[peak_x,peak_y] / best_match
1-রঙ বিটম্যাপ
1-রঙের বিটম্যাপের জন্য, যদিও এটি আরও দ্রুত হবে। আন্তঃসম্পর্ক ঘটে:
- লক্ষ্য চিত্রের উপর উত্স ইমেজ রাখুন
- উত্স চিত্রটি 1 পিক্সেল দ্বারা সরান
- বিটওয়াইস-এবং সমস্ত ওভারল্যাপিং পিক্সেল
- সমস্ত 1s যোগফল
- ...
বাইনারিতে গ্রেস্কেল চিত্রটি প্রসারিত করা এবং তারপরে এটি করা যথেষ্ট ভাল হতে পারে।
পয়েন্ট মেঘ
যদি উত্স এবং লক্ষ্য উভয় বিন্দুর নিদর্শন হয় তবে একটি দ্রুত পদ্ধতি হ'ল প্রতিটি বিন্দুর কেন্দ্রগুলি খুঁজে পাওয়া (একটি পরিচিত বিন্দুর সাথে একবার ক্রস-কোলেলেটেট করে আবার শিখাগুলি সন্ধান করতে) এবং পয়েন্টগুলির একটি সেট হিসাবে সেগুলি সংরক্ষণ করা হয়, তবে উত্সটি মিলিয়ে দিন ঘোরানো, অনুবাদ করে এবং দুটি সেটের নিকটতম পয়েন্টগুলির মধ্যে সর্বনিম্ন স্কোয়ার ত্রুটি আবিষ্কার করে লক্ষ্য নির্ধারণ করা।