আমি দুটি চিত্রের মধ্যে পার্থক্য কীভাবে মাপ দিতে পারি?


179

আমি যা করতে চাই তা এখানে:

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

আমি কল্পনা করি যে পার্থক্যটি প্রশমিত করার কিছু উপায় রয়েছে এবং আমাকে উত্সর্গীকৃতভাবে একটি প্রান্তিক অবস্থান নির্ধারণ করতে হবে।

আমি সিদ্ধতার চেয়ে সরলতার সন্ধান করছি। আমি পাইথন ব্যবহার করছি।


সংশ্লিষ্ট: stackoverflow.com/questions/25977/...
Anoyz

উত্তর:


269

সাধারণ ধারণা

বিকল্প 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 করুন:

$$ d (p, q) = \ যোগ_পি পি (i) \ লগ (পি (আই) / কিউ (আই))

যেখানে p এবং q হ'ল ফ্রেমের হিস্টোগ্রাম ব্যবহৃত হয়। প্রান্তিকটি 0.2 এ স্থির করা হয়েছে।


আমি RuntimeWarning: invalid value encountered in double_scalars44 ( return (arr-amin)*255/rng) এবং একটি ValueError: array must not contain infs or NaNsলাইন 30 ( z_norm = norm(diff.ravel(), 0)) এ
পেয়েছি

@ বায়োজিক এটি rngশূন্যের সমান হলে । কেবল একটি চেক যোগ করুন এবং সেট করুনrng = 1
হাইসি

76

একটি সহজ সমাধান:

একটি হিসাবে ইমেজ এনকোড JPEG এবং একটি উল্লেখযোগ্য পরিবর্তনের জন্য চেহারা FILESIZE

আমি ভিডিও থাম্বনেইলের সাথে অনুরূপ কিছু বাস্তবায়ন করেছি এবং প্রচুর সাফল্য এবং স্কেলাবিলিটি পেয়েছি।


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

পছন্দ করি. যদিও অন্যান্য সমাধানগুলি খুব কার্যকরভাবে কাজ করে, তবে এটি একটি সাধারণ পরিস্থিতির জন্য একটি দুর্দান্ত সুবিধা: আপনি যদি "বেস" চিত্রটি সংরক্ষণ করতে চান না তবে কী করবেন? কেবল ফাইলটিকে একটি হ্যাশ হিসাবে সংরক্ষণ করুন এবং তারপরে সংখ্যার সাথে বিয়োগের সাথে তুলনা করুন। আমার ক্ষেত্রে আমার 4 টি চিত্র রয়েছে যার মধ্যে একটি খুব সিমিলার এবং অন্যান্য 3 টি একেবারেই আলাদা। কেবল একই মাত্রায় স্কেল করুন, জেপিজি এবং সাবস্ট্রাক্ট করতে। সত্যিই সুন্দর.
দিয়েগো আন্দ্রেস ডায়েজ এস্পিনোজা

60

আপনি পিআইএল থেকে ফাংশন ব্যবহার করে দুটি চিত্রের তুলনা করতে পারেন ।

import Image
import ImageChops

im1 = Image.open("splash.png")
im2 = Image.open("splash2.png")

diff = ImageChops.difference(im2, im1)

ডিফ অফ অবজেক্টটি এমন একটি চিত্র যেখানে প্রতিটি পিক্সেলটি প্রথম চিত্র থেকে দ্বিতীয় চিত্রটিতে p পিক্সেলের রঙ মানের বিয়োগের ফলাফল। ডিফ ইমেজ ব্যবহার করে আপনি বেশ কিছু কাজ করতে পারেন। সহজতমটি হ'ল diff.getbbox()ফাংশন। এটি আপনাকে ন্যূনতম আয়তক্ষেত্রটি বলবে যাতে আপনার দুটি চিত্রের মধ্যে সমস্ত পরিবর্তন রয়েছে।

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


2
আমি পার্থক্য চিত্রটি সংরক্ষণ করতে চাই। চিত্রের পার্থক্য ধারণ করে যা পৃথক বস্তু মানে। আমি এটা সংরক্ষণ করতে পারি?
সাগর

2
@ অ্যান্থনি আপনি চিত্রটির নাম উল্লেখ করে ডিফেক্ট অবজেক্টে সেভ () কে কল করতে পারেন। এটি পছন্দ করুন: diff.save ("diff.png") এটি আপনার জন্য পার্থক্য চিত্র সংরক্ষণ করবে।
সাগর

20

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

ন্যাকপির মতো সিনট্যাক্স ব্যবহার করে,

dist_euclidean = বর্গক্ষেত্র (যোগফল ((i1 - i2) ^ 2)) / i1.size

ডিস্ট_ম্যানহট্টান = যোগ (অ্যাবস (আই 1 - আই 2)) / i1.size

dist_ncc = যোগ ((i1 - গড় (i1)) * (i2 - গড় (i2)) / / (
  (i1.size - 1) * stdev (i1) * stdev (i2))

ধরে নিচ্ছি i1এবং i22 ডি গ্রেস্কেল চিত্রের অ্যারে রয়েছে।


3
চিত্র ক্রস-সম্পর্ক সম্পর্কিত ফাংশনগুলি সায়পাই ( ডকস.সসিপি.আর / ডক / স্কিপি / রেফারেন্স / জেনারেটেড /… ) এ অন্তর্নির্মিত এবং এফএফটি ব্যবহার করে একটি দ্রুত সংস্করণ এসটিএসসি পাইথন ( stsci.edu/resources/software_hardware/pyraf/ এ উপলব্ধ stsci_python )
এন্ডোলিথ

14

চেষ্টা করার মতো একটি তুচ্ছ জিনিস:

উভয় চিত্রকে ছোট থাম্বনেইলগুলিতে (যেমন 64৪ x 64৪) পুনরায় নমুনা করুন এবং থাম্বনেইলগুলি পিক্সেল-বাই-পিক্সেলের একটি নির্দিষ্ট প্রান্তিকের সাথে তুলনা করুন। যদি মূল চিত্রগুলি প্রায় একই হয় তবে পুনরায় সজ্জিত থাম্বনেইলগুলি খুব অনুরূপ বা এমনকি একই হবে। এই পদ্ধতিটি শব্দের যত্ন নেয় যা বিশেষত কম আলোর দৃশ্যে ঘটতে পারে। গ্রেস্কেলতে গেলে আরও ভাল হতে পারে।


তবে আপনি কীভাবে পিক্সেলগুলি তুলনা করবেন?
ক্যারিয়ার

আপনার থাম্বনেইলগুলি পরে, আপনি কেবল একের সাথে পিক্সেলগুলি তুলনা করতে পারেন। আপনি আরজিবি মানগুলির "দূরত্ব" গণনা করতে পারবেন, আপনি যদি রঙে কাজ করছেন বা ধূসর টোনগুলির মধ্যে পার্থক্য রয়েছে যদি আপনি গ্রেস্কেলটিতে থাকেন।
এটস গোলাল

1
"একের পর এক পিক্সেল তুলনা করুন"। ওটার মানে কি? যদি প্রতি পিক্সেল 64৪ ^ 2 পিক্সেল-পিক্সেল পরীক্ষার মধ্যে একটি ব্যর্থ হয় তবে কি পরীক্ষাটি ব্যর্থ হওয়া উচিত?
ফেডেরিকো এ রাম্পনি 13

"থাম্বনেলস পিক্সেল বাই পিক্সেল একটি নির্দিষ্ট থ্রেশহোল্ডের সাথে তুলনা করুন" বলতে আমি কী বোঝাতে চাইছি তা হল পিক্সেলের তুলনা করার জন্য একটি अस्पष्ट অ্যালগরিদম নিয়ে আসা। যদি গণনা করা পার্থক্য (আপনার ফাসি অ্যালগোরিদমের উপর নির্ভর করে) একটি নির্দিষ্ট প্রান্তিকে ছাড়িয়ে যায় তবে চিত্রগুলি "একই নয়"।
এটস গোলাল

1
অত্যন্ত সহজ উদাহরণ, "ঝাপসা অ্যালগরিদম" ছাড়া কিছু: প্রতিবার পিক্সেল মাধ্যমে সমান্তরাল লুপ (পিক্সেল # তুলনা এন ইমেজ # 1 পিক্সেল # টি এন ইমেজ # 2), এবং একটি পরিবর্তনশীল মান পার্থক্য যোগ
mk12

7

আমি যদি তারা "যথেষ্ট আলাদা" হয় তবে কীভাবে গণনা করা যায় সেই প্রশ্নটি আমি বিশেষভাবে সম্বোধন করছি। আমি ধরে নিয়েছি আপনি কীভাবে একের পর এক পিক্সেলগুলি বিয়োগ করবেন তা বের করতে পারেন।

প্রথমত, আমি কিছুই না পরিবর্তিত কিছু চিত্র নিয়েছি এবং সর্বাধিক পরিমাণে যে কোনও পিক্সেল পরিবর্তিত হয় কেবল তা ক্যাপচারের পরিবর্তনের কারণে, ইমেজিং সিস্টেমের শব্দে, জেপিজি সংক্ষেপণের, আর আলোতে মুহুর্তের পরিবর্তনের কারণে খুঁজে পেতে পারি find । সম্ভবত আপনি খুঁজে পাবেন যে 1 বা 2 বিট পার্থক্যগুলি প্রত্যাশিত হওয়া উচিত এমনকি যখন কোনও কিছুই সরে না যায়।

তারপরে "আসল" পরীক্ষার জন্য আপনি এই জাতীয় মানদণ্ড চান:

  • যদি পি পিক্সেল পর্যন্ত আলাদা হয় তবে ই এর চেয়ে বেশি আলাদা নয় same

সুতরাং, সম্ভবত, যদি ই = 0.02, পি = 1000, এর অর্থ হবে (প্রায়) যে কোনও একক পিক্সেল ~ 5 ইউনিট (8 বিট চিত্র অনুমান করে) দ্বারা পরিবর্তন হয় বা 1000 এর বেশি হলে এটি "আলাদা" হবে পিক্সেলগুলিতে কোনও ত্রুটি ছিল।

এটি প্রাথমিকভাবে একটি ভাল "ট্রিজেস" কৌশল হিসাবে লক্ষ্য করা হচ্ছে যাতে দ্রুত পরীক্ষা করার প্রয়োজন না এমন চিত্রগুলি দ্রুত সনাক্ত করতে পারে। "ব্যর্থ" ইমেজগুলি আরও আরও বিস্তৃত / ব্যয়বহুল কৌশলতে আরও বেশি হতে পারে যা ক্যামেরাটি কিছুটা নাড়াচাড়া করলে মিথ্যা ধনাত্মক হবে না, উদাহরণস্বরূপ, বা আলো পরিবর্তনের ক্ষেত্রে আরও দৃ rob় ছিল।

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


6

কর্মক্ষেত্রে আমারও একই সমস্যা ছিল, আমি আমাদের চিত্রটি রূপান্তরের শেষ পয়েন্টটি আবার লিখছিলাম এবং আমি এটি দেখতে চেয়েছিলাম যে নতুন সংস্করণটি পুরানো সংস্করণের মতো একই বা প্রায় একই আউটপুট তৈরি করছে। সুতরাং আমি এটি লিখেছি:

https://github.com/nicolashahn/diffimg

যা একই আকারের চিত্রগুলিতে পরিচালিত হয় এবং প্রতি পিক্সেল স্তরে প্রতিটি চ্যানেলে মানগুলির মধ্যে পার্থক্য পরিমাপ করে: আর, জি, বি (, এ), এই চ্যানেলগুলির গড় পার্থক্য নেয় এবং তারপরে পার্থক্যটির গড় গড়ে তোলে সমস্ত পিক্সেল, এবং একটি অনুপাত প্রদান করে।

উদাহরণস্বরূপ, সাদা পিক্সেলের একটি 10x10 চিত্র এবং একই চিত্র কিন্তু একটি পিক্সেল লাল হয়ে গেছে, সেই পিক্সেলের পার্থক্যটি 1/3 বা 0.33 ... (আরজিবি 0,0,0 বনাম 255,0,0) ) এবং অন্যান্য সমস্ত পিক্সেল 0 হয় মোট 100 পিক্সেল সহ, 0.33 ... / 100 = a image 0.33% চিত্রের পার্থক্য।

আমি বিশ্বাস করি এটি অপের প্রকল্পের জন্য নিখুঁতভাবে কাজ করবে (আমি বুঝতে পারি এটি এখন অনেক পুরানো পোস্ট, তবে ভবিষ্যতের স্ট্যাকওভারফ্লুয়ার্স যারা অজগরের চিত্রগুলি তুলনা করতে চান তাদের জন্য পোস্ট করা)।


5

প্রদত্ত বেশিরভাগ উত্তর আলোক স্তরের সাথে সম্পর্কিত হবে না।

তুলনা করার আগে আমি প্রথমে চিত্রটিকে একটি আদর্শ আলোর স্তরে স্বাভাবিক করতে চাই।


আপনি যদি পর্যায়ক্রমিক চিত্রগুলি এবং সংলগ্ন জোড়াগুলি পৃথক করে তুলছেন তবে কেউ সম্ভবত লাইট জ্বালানোর পরে প্রথমটি রাখার সামর্থ্য বোধ করতে পারেন।
ওয়াকিটালকি

5

দুটি চিত্রের মধ্যে সাদৃশ্য পরিমাপের আর একটি দুর্দান্ত, সহজ উপায়:

import sys
from skimage.measure import compare_ssim
from skimage.transform import resize
from scipy.ndimage import imread

# get two images - resize both to 1024 x 1024
img_a = resize(imread(sys.argv[1]), (2**10, 2**10))
img_b = resize(imread(sys.argv[2]), (2**10, 2**10))

# score: {-1:1} measure of the structural similarity between the images
score, diff = compare_ssim(img_a, img_b, full=True)
print(score)

অন্যরা যদি চিত্রের মিলের তুলনায় আরও শক্তিশালী উপায়ে আগ্রহী হন তবে আমি টেনসরফ্লো ব্যবহার করে অনুরূপ চিত্রগুলি পরিমাপ ও চাক্ষুষ করার জন্য একটি টিউটোরিয়াল এবং ওয়েব অ্যাপ্লিকেশন একসাথে রেখেছি।


3
হ্যাঁ, skimageএই অ্যাপ্লিকেশনটির জন্য ব্যবহার করে খুব সুন্দর। আমি from skimage.measure import compare_ssim, compare_mseঅনেক ব্যবহার করি । skimage.measure ডক্স
ximiki

3

আপনি কি অনুরূপ চিত্রের সন্ধানের জন্য অ্যালগরিদম দেখেছেন ? পরামর্শ দেখতে এটি পরীক্ষা করে দেখুন।

আমি আপনার ফ্রেমের একটি তরঙ্গলিপি রূপান্তরের পরামর্শ দেব (এটি হর ট্রান্সফরমেশন ব্যবহারের জন্য আমি একটি সি এক্সটেনশন লিখেছি); তারপরে, দুটি ছবির মধ্যে বৃহত্তম (আনুপাতিকভাবে) তরঙ্গপত্রের কারণগুলির সূচির তুলনা করে, আপনার একটি সংখ্যাসমূহের সাদৃশ্য আনুমানিক হওয়া উচিত।


2

উত্তর দিতে খুব দেরি হলে আমি ক্ষমা চাইছি, তবে যেহেতু আমি এ জাতীয় কিছু করে চলেছি আমি ভেবেছিলাম যে আমি কোনওভাবে অবদান রাখতে পারি could

ওপেনসিভি এর সাহায্যে আপনি টেমপ্লেট মিলটি ব্যবহার করতে পারেন। ধরে নিয়েছি আপনি যেমন বলেছেন ওয়েবক্যাম ব্যবহার করছেন:

  1. চিত্রগুলি সরল করুন (হতে পারে প্রান্তিকের?)
  2. টেমপ্লেট ম্যাচিং প্রয়োগ করুন এবং মিনিম্যাক্সলোকের সাথে সর্বাধিক_ভাল পরীক্ষা করুন

টিপ: সর্বোচ্চ_ওয়াল (বা ব্যবহৃত পদ্ধতির উপর নির্ভর করে মিনি_ওয়াল) আপনাকে নম্বর দেবে, বড় সংখ্যা large শতাংশের পার্থক্য পেতে, একই চিত্রের সাথে টেমপ্লেট মিলটি ব্যবহার করুন - ফলাফলটি আপনার 100% হবে।

উদাহরণস্বরূপ সিউডো কোড:

previous_screenshot = ...
current_screenshot = ...

# simplify both images somehow

# get the 100% corresponding value
res = matchTemplate(previous_screenshot, previous_screenshot, TM_CCOEFF)
_, hundred_p_val, _, _ = minMaxLoc(res)

# hundred_p_val is now the 100%

res = matchTemplate(previous_screenshot, current_screenshot, TM_CCOEFF)
_, max_val, _, _ = minMaxLoc(res)

difference_percentage = max_val / hundred_p_val

# the tolerance is now up to you

আশা করি এটা সাহায্য করবে.


1

পৃথিবী মুভিজের দূরত্ব আপনার প্রয়োজন মতো হতে পারে। এটা হতে পারে abit যদিও রিয়েল টাইমে বাস্তবায়ন ভারী।


আমি এই উত্তরটি সুন্দরভাবে অনুভব করি না: "আমি সিদ্ধতার চেয়ে সরলতার সন্ধান করছি I'm আমি পাইথন ব্যবহার করছি" "
পিলিউপিলি

আমি মনে করি যেহেতু এই প্রশ্ন থ্রেডটি প্রচুর ট্র্যাফিক পেয়েছে এবং বেশিরভাগ দর্শকদের মধ্যে যে শিরোনামটি আঁকবে তা দুটি চিত্রের মধ্যে পার্থক্য কীভাবে মাপবসা করতে হয় সে সম্পর্কে এটির এখানে মান রয়েছে।
ড্যানোরাম

1

দুটি চিত্রের ম্যানহাটন দূরত্ব গণনা সম্পর্কে কী । এটি আপনাকে এন * এন মান দেয়। তারপরে আপনি এন মানগুলিকে হ্রাস করতে একটি সারির গড়ের মতো কিছু করতে পারেন এবং একটি একক মান পাওয়ার জন্য এটির উপরে একটি ফাংশন।


1

ত্রিপডে একই ক্যামেরায় তোলা জেপিজি চিত্রগুলির সাথে আমি অনেক ভাগ্য পেয়েছি (১) ব্যাপকভাবে সরল করে (যেমন 3000 পিক্সেল প্রশস্ত থেকে 100 পিক্সেল প্রশস্ত বা তার চেয়ে কম) (2) প্রতিটি জেপিজির অ্যারে একক করে সমতল করা ভেক্টর (3) জোড়ায় সংযুক্তিযুক্ত ইমেজগুলি সম্পর্কিত একটি সাধারণ সম্পর্কিত অ্যালগরিদম সহ সম্পর্কযুক্ত গুণাগুণ (4) স্কোয়ারিং সহাবস্থান সহগ পেতে আর-বর্গ পেতে (অর্থাত্ একটি চিত্রের পরিবর্তনের ভগ্নাংশটি পরবর্তীটির প্রকরণের দ্বারা বর্ণিত) (5) সাধারণত আমার অ্যাপ্লিকেশনটিতে যদি r-বর্গ <0.9, আমি বলি যে দুটি চিত্র আলাদা এবং এর মধ্যে কিছু ঘটেছিল।

এটি আমার বাস্তবায়নে মজবুত এবং দ্রুত (গণিত 7)

আপনার আগ্রহী ইমেজের যে অংশটি আপনার আগ্রহী সেটির সাথে এই অংশটি খেলতে আগ্রহী এবং সেই চিত্রটিকে এই ছোট্ট অঞ্চলে ফেলে সমস্ত চিত্র ছড়িয়ে দিন, অন্যথায় ক্যামেরা থেকে দূরে থাকা তবে গুরুত্বপূর্ণ পরিবর্তনটি মিস হবে।

পাইথন কীভাবে ব্যবহার করতে হয় তা আমি জানি না, তবে আমি নিশ্চিত যে এটিও সংযোগ স্থাপন করবে, না?


1

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


আপনি ইমেজগুলিতে নিজের গুণফল গণনা করতে পারেন?
এন্ডোলিথ

আপনাকে চিত্রগুলির জন্য হিস্টোগ্রামগুলি গণনা করতে হবে (প্রয়োজনীয়তার সাথে হিস্টোগ্রামের বিন আকার সহ)।
vishalv2050

1

ইস্ক-ডেমন দ্বারা হার ওয়েভলেটগুলি কীভাবে প্রয়োগ করা হয় তা দেখুন । অন-ফ্লাইয়ে চিত্রের মধ্যে পার্থক্য গণনা করতে আপনি এটি আইএমজিডিবি সি ++ কোড ব্যবহার করতে পারেন:

ইস্ক-ডেমন একটি ওপেন সোর্স ডাটাবেস সার্ভার যা কোনও চিত্র সম্পর্কিত ওয়েবসাইট বা সফ্টওয়্যারটিতে সামগ্রী-ভিত্তিক (ভিজ্যুয়াল) চিত্র অনুসন্ধান যুক্ত করতে সক্ষম।

এই প্রযুক্তিটি কোনও চিত্র-সম্পর্কিত ওয়েবসাইট বা সফ্টওয়্যার ব্যবহারকারীদের কোনও উইজেটের উপর স্কেচ করার অনুমতি দেয় যা তারা ওয়েবসাইটটি সবচেয়ে সাদৃশ্য চিত্রগুলি দেখতে এবং তাদের কাছে উত্তর পেতে চায় বা প্রতিটি চিত্র বিশদ পৃষ্ঠায় আরও অনুরূপ ফটোগুলির জন্য অনুরোধ করে।


1

আমারও একই সমস্যা ছিল এবং একটি সাধারণ পাইথন মডিউল লিখেছিলাম যা একটি কালো / সাদা বর্ণের চিত্র তৈরি করতে বালিশের ইমেজকপস ব্যবহার করে দুটি একই আকারের চিত্রের তুলনা করে এবং হিস্টোগ্রামের মানগুলি যোগ করে।

আপনি সরাসরি এই স্কোরটি পেতে পারেন, বা একটি পূর্ণ কালো বনাম সাদা ডিফের তুলনায় শতাংশের মান।

এটিতে একটি সাধারণ আইস_অকুয়াল ফাংশন রয়েছে, চিত্রটি সমান হিসাবে পাসের অধীনে (এবং অন্তর্ভুক্ত) একটি অস্পষ্ট-থ্রেশহোল্ড সরবরাহ করার সম্ভাবনা সহ।

পদ্ধতিটি খুব বেশি বিস্তৃত নয়, তবে একই সমস্যাটির সাথে লড়াই করে অন্য কোনও ক্ষেত্রে এটি ব্যবহার করতে পারে।

https://pypi.python.org/pypi/imgcompare/


1

কিছুটা আরও নীতিগত পন্থা হ'ল জিআইএসটি বা সেন্ট্রিস্টের মতো চিত্রগুলির তুলনা করতে বিশ্বব্যাপী বর্ণনাকারী ব্যবহার করা। এখানে বর্ণিত একটি হ্যাশ ফাংশনও একই ধরণের সমাধান সরবরাহ করে।


1
import os
from PIL import Image
from PIL import ImageFile
import imagehash
  
#just use to the size diferent picture
def compare_image(img_file1, img_file2):
    if img_file1 == img_file2:
        return True
    fp1 = open(img_file1, 'rb')
    fp2 = open(img_file2, 'rb')

    img1 = Image.open(fp1)
    img2 = Image.open(fp2)

    ImageFile.LOAD_TRUNCATED_IMAGES = True
    b = img1 == img2

    fp1.close()
    fp2.close()

    return b





#through picturu hash to compare
def get_hash_dict(dir):
    hash_dict = {}
    image_quantity = 0
    for _, _, files in os.walk(dir):
        for i, fileName in enumerate(files):
            with open(dir + fileName, 'rb') as fp:
                hash_dict[dir + fileName] = imagehash.average_hash(Image.open(fp))
                image_quantity += 1

    return hash_dict, image_quantity

def compare_image_with_hash(image_file_name_1, image_file_name_2, max_dif=0):
    """
    max_dif: The maximum hash difference is allowed, the smaller and more accurate, the minimum is 0.
    recommend to use
    """
    ImageFile.LOAD_TRUNCATED_IMAGES = True
    hash_1 = None
    hash_2 = None
    with open(image_file_name_1, 'rb') as fp:
        hash_1 = imagehash.average_hash(Image.open(fp))
    with open(image_file_name_2, 'rb') as fp:
        hash_2 = imagehash.average_hash(Image.open(fp))
    dif = hash_1 - hash_2
    if dif < 0:
        dif = -dif
    if dif <= max_dif:
        return True
    else:
        return False


def compare_image_dir_with_hash(dir_1, dir_2, max_dif=0):
    """
    max_dif: The maximum hash difference is allowed, the smaller and more accurate, the minimum is 0.

    """
    ImageFile.LOAD_TRUNCATED_IMAGES = True
    hash_dict_1, image_quantity_1 = get_hash_dict(dir_1)
    hash_dict_2, image_quantity_2 = get_hash_dict(dir_2)

    if image_quantity_1 > image_quantity_2:
        tmp = image_quantity_1
        image_quantity_1 = image_quantity_2
        image_quantity_2 = tmp

        tmp = hash_dict_1
        hash_dict_1 = hash_dict_2
        hash_dict_2 = tmp

    result_dict = {}

    for k in hash_dict_1.keys():
        result_dict[k] = None

    for dif_i in range(0, max_dif + 1):
        have_none = False

        for k_1 in result_dict.keys():
            if result_dict.get(k_1) is None:
                have_none = True

        if not have_none:
            return result_dict

        for k_1, v_1 in hash_dict_1.items():
            for k_2, v_2 in hash_dict_2.items():
                sub = (v_1 - v_2)
                if sub < 0:
                    sub = -sub
                if sub == dif_i and result_dict.get(k_1) is None:
                    result_dict[k_1] = k_2
                    break
    return result_dict


def main():
    print(compare_image('image1\\815.jpg', 'image2\\5.jpg'))
    print(compare_image_with_hash('image1\\815.jpg', 'image2\\5.jpg', 7))
    r = compare_image_dir_with_hash('image1\\', 'image2\\', 10)
    for k in r.keys():
        print(k, r.get(k))


if __name__ == '__main__':
    main()
  • আউটপুট:

    মিথ্যা
    সত্য
    চিত্র 2 \ 5.jpg
    চিত্র 1 \ 815.jpg চিত্র 2 \ 6.jpg চিত্র 1 \ 819.jpg চিত্র 2 \ 7.jpg
    চিত্র1 \ 900.jpg চিত্র
    2 \ 8.jpg চিত্র
    1 \ 998.jpg চিত্র 2 \ 9.jpg চিত্র1 \ 1012 .jpg

  • উদাহরণ ছবি:

    • 815.jpg
      815.jpg

    • 5.jpg
      5.jpg


0

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


0

দুটি চিত্রের মতো দেখতে / কতটা দেখতে লাগে তা মূল্যায়নের জন্য সেখানে অনেকগুলি মেট্রিক রয়েছে।

আমি এখানে কোনও কোডে যাব না, কারণ আমি মনে করি এটি প্রযুক্তিগত সমস্যা ছাড়া অন্য কোনও বৈজ্ঞানিক সমস্যা হওয়া উচিত।

সাধারণত, প্রশ্নটি চিত্রগুলির প্রতি মানুষের ধারণার সাথে সম্পর্কিত, সুতরাং প্রতিটি অ্যালগরিদমের মানব ভিজ্যুয়াল সিস্টেমের বৈশিষ্ট্যের উপর সমর্থন রয়েছে।

ক্লাসিক পদ্ধতিগুলি হ'ল:

দৃশ্যমান পার্থক্য predictor: চিত্র বিশ্বস্ততা এর মূল্যায়নের জন্য একটি আলগোরিদিম ( https://www.spiedigitallibrary.org/conference-proceedings-of-spie/1666/0000/Visible-differences-predictor--an-algorithm-for-the- মূল্যায়ন / 10.1117 / 12.135952. শর্ট? এসএসও = 1 )

চিত্রের গুণমান মূল্যায়ন: ত্রুটি দৃশ্যমানতা থেকে কাঠামোগত মিলের ( http://www.cns.nyu.edu/pub/lcv/wang03-reprint.pdf )

এফএসআইএম: চিত্রের গুণমান নির্ধারণের জন্য একটি বৈশিষ্ট্য সমতা সূচক ( https://www4.comp.polyu.edu.hk/~cslzhang/IQA/TIP_IQA_FSIM.pdf )

তাদের মধ্যে SSIM (চিত্রের গুণমান অ্যাসেসমেন্ট: ত্রুটি দৃশ্যমানতা স্ট্রাকচারাল সাদৃশ্য থেকে) সবচেয়ে সহজ পদ্ধিতি হল নিরূপণ করা এবং তার মাথার উপরে যেমন অন্য কাগজ "চিত্রের গুণমান অ্যাসেসমেন্ট ভিত্তিক গ্রেডিয়েন্ট অনুরূপ উপর" (রিপোর্ট, ছোট হয় HTTPS: //www.semanticscholar .org / কাগজ / চিত্র-গুণমান-মূল্যায়ন-ভিত্তিতে-গ্রেডিয়েন্ট-লিউ-লিন / 2 বি 819bef80c02d5d4cb56f27b202535e119df988 )।

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


0

গড় স্কোয়ার ত্রুটি গণনা করে নিমপি ব্যবহার করে একটি সহজ এবং দ্রুত সমাধান রয়েছে:

before = np.array(get_picture())
while True:
    now = np.array(get_picture())
    MSE = np.mean((now - before)**2)

    if  MSE > threshold:
        break

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