সাধারণ ধারণা
বিকল্প 1: উভয় চিত্রকে অ্যারে ( scipy.misc.imread
) হিসাবে লোড করুন এবং একটি উপাদান অনুসারে (পিক্সেল বাই পিক্সেল) পার্থক্য গণনা করুন। পার্থক্যের আদর্শ গণনা করুন।
বিকল্প 2: উভয় চিত্র লোড করুন। তাদের প্রত্যেকের জন্য কিছু ফিচার ভেক্টর গণনা করুন (হিস্টগ্রামের মতো)। চিত্রগুলির চেয়ে বৈশিষ্ট্য ভেক্টরগুলির মধ্যে দূরত্ব গণনা করুন।
তবে প্রথমে কিছু সিদ্ধান্ত নিতে হবে।
প্রশ্নাবলি
আপনার এই প্রশ্নের উত্তর আগে দেওয়া উচিত:
একই আকার এবং মাত্রার চিত্রগুলি কি?
যদি তা না হয় তবে আপনার সেগুলি পুনরায় আকার দেওয়ার বা ক্রপ করার প্রয়োজন হতে পারে। পিআইএল লাইব্রেরি পাইথনে এটি করতে সহায়তা করবে।
যদি সেগুলি একই সেটিংস এবং একই ডিভাইস সহ নেওয়া হয় তবে তারা সম্ভবত একই।
চিত্রগুলি কি ভালভাবে সাজানো আছে?
যদি তা না হয় তবে প্রথমে সেরা অ্যালাইনমেন্টটি সন্ধান করতে, আপনি প্রথমে ক্রস-সম্পর্কিত সম্পর্ক চালাতে চাইতে পারেন। এটি করার জন্য সায়পাইয়ের ফাংশন রয়েছে।
যদি ক্যামেরা এবং দৃশ্যটি এখনও অবধি থাকে তবে চিত্রগুলি ভালভাবে সাজানো সম্ভবত।
চিত্রগুলির এক্সপোজার কি সর্বদা একই থাকে? (হালকাতা / বৈসাদৃশ্য কি একই?)
যদি তা না হয় তবে আপনি চিত্রগুলি স্বাভাবিক করতে চাইতে পারেন ।
তবে সাবধানতা অবলম্বন করুন, কিছু পরিস্থিতিতে এটি ভাল করার চেয়ে আরও খারাপ কাজ করতে পারে। উদাহরণস্বরূপ, একটি অন্ধকার পটভূমিতে একটি একক উজ্জ্বল পিক্সেল স্বাভাবিক চিত্রটি খুব আলাদা করবে।
রঙ তথ্য গুরুত্বপূর্ণ?
আপনি যদি রঙের পরিবর্তনগুলি লক্ষ্য করতে চান, আপনার ধূসর-স্কেল চিত্রের মতো স্কেলারের মানের চেয়ে প্রতি পয়েন্টে রঙের মানগুলির একটি ভেক্টর পাবেন। এই জাতীয় কোড লেখার সময় আপনার আরও মনোযোগ প্রয়োজন।
চিত্রটিতে আলাদা প্রান্ত রয়েছে? তারা কি স্থানান্তরিত হতে পারে?
যদি হ্যাঁ, আপনি প্রথমে প্রান্ত সনাক্তকরণ অ্যালগরিদম প্রয়োগ করতে পারেন (উদাহরণস্বরূপ সোবেল বা প্রিভিট ট্রান্সফর্মের সাথে গ্রেডিয়েন্ট গণনা করুন, কিছু প্রান্তিক প্রয়োগ করুন), তারপরে দ্বিতীয় চিত্রের প্রান্তটি দ্বিতীয় প্রান্তে তুলনা করুন।
ছবিতে কি শব্দ আছে?
সমস্ত সেন্সর কিছু পরিমাণ শব্দ নিয়ে চিত্রটিকে দূষিত করে। স্বল্পমূল্যের সেন্সরগুলির মধ্যে আরও শব্দ রয়েছে। আপনি চিত্রগুলির তুলনা করার আগে কিছু শব্দ কমানোর আবেদন করতে পারেন। অস্পষ্টতা এখানে সর্বাধিক সহজ (তবে সেরা নয়) approach
আপনি কী ধরনের পরিবর্তনগুলি লক্ষ্য করতে চান?
এটি চিত্রের মধ্যে পার্থক্যের জন্য আদর্শের পছন্দকে প্রভাবিত করতে পারে।
চিত্রটি কতটা পরিবর্তিত হয়েছে তা পরিমাপ করতে ম্যানহাটান আদর্শ (পরম মানের সমষ্টি) বা শূন্য আদর্শ (শূন্যের সমান নয় উপাদানের সংখ্যা) ব্যবহার করে বিবেচনা করুন। প্রাক্তন আপনাকে বলবেন যে চিত্রটি কতটা বন্ধ আছে, কেবলমাত্র পিক্সেলের মধ্যে কত পার্থক্য রয়েছে তা কেবল তা বলবে।
উদাহরণ
আমি ধরে নিলাম আপনার চিত্রগুলি সুসংযুক্ত, একই আকার এবং আকার, সম্ভবত বিভিন্ন এক্সপোজার সহ। সরলতার জন্য, আমি তাদের বর্ণ (আরজিবি) চিত্র হলেও গ্রেসকেলে রূপান্তর করি।
আপনার এই আমদানিগুলির প্রয়োজন হবে:
import sys
from scipy.misc import imread
from scipy.linalg import norm
from scipy import sum, average
প্রধান ফাংশন, দুটি চিত্র পড়ুন, গ্রেস্কেলে রূপান্তর করুন, তুলনা করুন এবং ফলাফলগুলি মুদ্রণ করুন:
def main():
file1, file2 = sys.argv[1:1+2]
# read images as 2D arrays (convert to grayscale for simplicity)
img1 = to_grayscale(imread(file1).astype(float))
img2 = to_grayscale(imread(file2).astype(float))
# compare
n_m, n_0 = compare_images(img1, img2)
print "Manhattan norm:", n_m, "/ per pixel:", n_m/img1.size
print "Zero norm:", n_0, "/ per pixel:", n_0*1.0/img1.size
কিভাবে তুলনা করতে হয়। img1
এবং img2
এখানে 2D সাইপাই অ্যারে রয়েছে:
def compare_images(img1, img2):
# normalize to compensate for exposure difference, this may be unnecessary
# consider disabling it
img1 = normalize(img1)
img2 = normalize(img2)
# calculate the difference and its norms
diff = img1 - img2 # elementwise for scipy arrays
m_norm = sum(abs(diff)) # Manhattan norm
z_norm = norm(diff.ravel(), 0) # Zero norm
return (m_norm, z_norm)
যদি ফাইলটি কোনও রঙের চিত্র imread
হয় তবে তীব্রতা অর্জনের জন্য একটি 3 ডি অ্যারে, গড় আরজিবি চ্যানেলগুলি (শেষ অ্যারে অক্ষ) ফেরত দেয়। গ্রেস্কেল চিত্রগুলির জন্য এটি করার দরকার নেই (যেমন .pgm
):
def to_grayscale(arr):
"If arr is a color image (3D array), convert it to grayscale (2D array)."
if len(arr.shape) == 3:
return average(arr, -1) # average over the last axis (color channels)
else:
return arr
সাধারণীকরণ তুচ্ছ, আপনি [0,255] এর পরিবর্তে [0,1] এ সাধারণ করতে বেছে নিতে পারেন। arr
এখানে একটি SciPy অ্যারে, তাই সমস্ত ক্রিয়াকলাপ উপাদান-ভিত্তিক:
def normalize(arr):
rng = arr.max()-arr.min()
amin = arr.min()
return (arr-amin)*255/rng
main
ফাংশনটি চালান :
if __name__ == "__main__":
main()
এখন আপনি এগুলি একটি স্ক্রিপ্টে রাখতে পারেন এবং দুটি চিত্রের বিপরীতে চালাতে পারেন। যদি আমরা চিত্রটিকে নিজের সাথে তুলনা করি তবে কোনও পার্থক্য নেই:
$ python compare.py one.jpg one.jpg
Manhattan norm: 0.0 / per pixel: 0.0
Zero norm: 0 / per pixel: 0.0
যদি আমরা চিত্রটি অস্পষ্ট করে এবং মূলটির সাথে তুলনা করি তবে কিছুটা পার্থক্য রয়েছে:
$ python compare.py one.jpg one-blurred.jpg
Manhattan norm: 92605183.67 / per pixel: 13.4210411116
Zero norm: 6900000 / per pixel: 1.0
পিএস সম্পূর্ণ তুলনা.পি স্ক্রিপ্ট।
আপডেট: প্রাসঙ্গিক কৌশল
যেহেতু প্রশ্নটি একটি ভিডিও ক্রম সম্পর্কিত, যেখানে ফ্রেমগুলি প্রায় একই রকম হতে পারে এবং আপনি অস্বাভাবিক কিছু সন্ধান করেন তাই আমি কিছু বিকল্প পদ্ধতির উল্লেখ করতে চাই যা প্রাসঙ্গিক হতে পারে:
- পটভূমি বিয়োগ এবং বিভাজন (অগ্রভাগ বস্তু সনাক্ত করতে)
- বিচ্ছুরিত অপটিক্যাল প্রবাহ (গতি সনাক্ত করতে)
- চিত্রের পরিবর্তে হিস্টোগ্রাম বা কিছু অন্যান্য পরিসংখ্যান তুলনা করা
আমি জোরালোভাবে "ওপেনসিভি শেখা" বই, অধ্যায় 9 (চিত্রের অংশ এবং বিভাগকরণ) এবং 10 (ট্র্যাকিং এবং গতি) একবার দেখার পরামর্শ দিয়েছি। প্রাক্তন ব্যাকগ্রাউন্ড বিয়োগ পদ্ধতি ব্যবহার করতে শেখায়, দ্বিতীয়টি অপটিক্যাল প্রবাহ পদ্ধতি সম্পর্কে কিছু তথ্য দেয়। সমস্ত পদ্ধতি ওপেনসিভি লাইব্রেরিতে প্রয়োগ করা হয়। যদি আপনি পাইথন ব্যবহার করেন তবে আমি ওপেনসিভি ≥ 2.3 এবং এর ব্যবহার করার পরামর্শ দিইcv2
পাইথন মডিউলটি ।
পটভূমি বিয়োগের সর্বাধিক সহজ সংস্করণ:
- পটভূমির প্রতিটি পিক্সেলের জন্য গড় মান μ এবং মান বিচ্যুতি learn শিখুন
- (μ-2σ, μ + 2σ) বা (μ-σ, μ + σ) এর সাথে বর্তমান পিক্সেলের মানগুলি তুলনা করুন
আরও উন্নত সংস্করণগুলি প্রতিটি পিক্সেলের জন্য অ্যাকাউন্ট সময় সিরিজ গ্রহণ করে এবং অ স্থিতিশীল দৃশ্যের (যেমন চলন্ত গাছ বা ঘাসের মতো) পরিচালনা করে।
অপটিকাল প্রবাহের ধারণাটি হল দুটি বা ততোধিক ফ্রেম নেওয়া এবং প্রতিটি পিক্সেল (ঘন অপটিক্যাল প্রবাহ) বা তাদের কয়েকটি (স্পার্স অপটিক্যাল প্রবাহ) এর জন্য বেগ ভেক্টর বরাদ্দ করা। বিরল অপটিক্যাল প্রবাহ অনুমান করতে, আপনি লুকাশ-কানাদে পদ্ধতি ব্যবহার করতে পারেন (এটি ওপেনসিভিতেও প্রয়োগ করা হয়)। স্পষ্টতই, যদি প্রচুর প্রবাহ থাকে (বেগের ক্ষেত্রের সর্বাধিক মানের তুলনায় উচ্চ গড়), তবে ফ্রেমে কোনও কিছু চলছে এবং পরবর্তী চিত্রগুলি আরও আলাদা।
হিস্টোগ্রামের তুলনা করা একটানা ফ্রেমের মধ্যে হঠাৎ পরিবর্তনগুলি সনাক্ত করতে সহায়তা করতে পারে। এই পদ্ধতির ব্যবহার কর্বন এট আল, 2010 তে হয়েছিল :
একটানা ফ্রেমের মিল। পরপর দুটি ফ্রেমের মধ্যে দূরত্ব পরিমাপ করা হয়। যদি এটি খুব বেশি হয় তবে এর অর্থ হ'ল দ্বিতীয় ফ্রেমটি নষ্ট হয়ে গেছে এবং এভাবে চিত্রটি মুছে ফেলা হবে। Kullback-Leibler দূরত্ব , অথবা পারস্পরিক এনট্রপি, দুই ফ্রেমের histograms করুন:
যেখানে p এবং q হ'ল ফ্রেমের হিস্টোগ্রাম ব্যবহৃত হয়। প্রান্তিকটি 0.2 এ স্থির করা হয়েছে।