سؤال

إليك ما أود أن أفعله:

أقوم بالتقاط الصور بكاميرا الويب على فترات منتظمة.نوع من مثل شيء مرور الوقت.ومع ذلك، إذا لم يتغير شيء حقًا، فهذه هي الصورة إلى حد كبير تبدو نفس الشيء، لا أريد تخزين أحدث لقطة.

أتصور أن هناك طريقة ما لقياس الفرق، ويجب أن أحدد عتبة تجريبيًا.

أبحث عن البساطة بدلا من الكمال.أنا أستخدم بايثون.

هل كانت مفيدة؟

المحلول

فكرة عامة

الخيار 1:قم بتحميل كلتا الصورتين كمصفوفات (scipy.misc.imread) وحساب الفرق بين العناصر (بكسلًا ببكسل).احسب معيار الفرق.

الخيار 2:قم بتحميل كلتا الصورتين.احسب بعض ناقلات الميزات لكل منها (مثل الرسم البياني).حساب المسافة بين ناقلات المعالم بدلا من الصور.

ومع ذلك، هناك بعض القرارات التي يجب اتخاذها أولاً.

أسئلة

يجب عليك الإجابة على هذه الأسئلة أولا:

  • هل الصور لها نفس الشكل والأبعاد؟

    إذا لم يكن الأمر كذلك، فقد تحتاج إلى تغيير حجمها أو اقتصاصها.ستساعدك مكتبة PIL على القيام بذلك في بايثون.

    إذا تم التقاطها بنفس الإعدادات ونفس الجهاز، فمن المحتمل أن تكون هي نفسها.

  • هل الصور متناسقة بشكل جيد؟

    إذا لم يكن الأمر كذلك، فقد ترغب في تشغيل الارتباط المتبادل أولاً، للعثور على أفضل محاذاة أولاً.لدى SciPy وظائف للقيام بذلك.

    إذا كانت الكاميرا والمشهد ثابتين، فمن المرجح أن تكون الصور متوافقة بشكل جيد.

  • هل تعرض الصور هو نفسه دائمًا؟(هل الخفة/التباين هو نفسه؟)

    إذا لم يكن الأمر كذلك، قد ترغب في ذلك للتطبيع الصور.

    لكن كن حذرًا، ففي بعض المواقف قد يكون هذا خطأً أكثر من نفعه.على سبيل المثال، فإن وجود بكسل ساطع واحد على خلفية داكنة سيجعل الصورة التي تمت تسويتها مختلفة تمامًا.

  • هل معلومات اللون مهمة؟

    إذا كنت تريد ملاحظة تغيرات اللون، فسيكون لديك متجه لقيم اللون لكل نقطة، بدلاً من القيمة العددية كما في الصورة ذات التدرج الرمادي.تحتاج إلى مزيد من الاهتمام عند كتابة مثل هذا الرمز.

  • هل هناك حواف مميزة في الصورة؟هل من المحتمل أن يتحركوا؟

    إذا كانت الإجابة بنعم، فيمكنك تطبيق خوارزمية اكتشاف الحافة أولاً (على سبيل المثال.احسب التدرج باستخدام تحويل Sobel أو Prewitt، ثم قم بتطبيق بعض العتبات)، ثم قارن الحواف في الصورة الأولى بالحواف الموجودة في الصورة الثانية.

  • هل هناك ضجيج في الصورة؟

    تقوم جميع المستشعرات بتلويث الصورة بقدر من الضوضاء.أجهزة الاستشعار منخفضة التكلفة لديها المزيد من الضوضاء.قد ترغب في تطبيق بعض تقليل الضوضاء قبل مقارنة الصور.Blur هو النهج الأكثر بساطة (ولكنه ليس الأفضل) هنا.

  • ما نوع التغييرات التي تريد ملاحظتها؟

    قد يؤثر هذا على اختيار القاعدة المستخدمة للفرق بين الصور.

    فكر في استخدام معيار مانهاتن (مجموع القيم المطلقة) أو المعيار الصفري (عدد العناصر الذي لا يساوي الصفر) لقياس مدى تغير الصورة.سيخبرك الأول بمقدار اختلاف الصورة، بينما سيخبرك الأخير فقط بعدد وحدات البكسل المختلفة.

مثال

أفترض أن صورك محاذاة بشكل جيد، بنفس الحجم والشكل، وربما مع تعرض مختلف.للتبسيط، أقوم بتحويلها إلى تدرج رمادي حتى لو كانت صورًا ملونة (RGB).

سوف تحتاج هذه الواردات:

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 SciPy هنا:

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 تقوم بإرجاع مصفوفة ثلاثية الأبعاد، وقنوات RGB المتوسطة (محور المصفوفة الأخير) للحصول على الكثافة.لا داعي للقيام بذلك مع الصور ذات التدرج الرمادي (على سبيل المثال. .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,1] بدلاً من [0,255]. 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

ملاحظة.كامل قارن.py النصي.

تحديث:التقنيات ذات الصلة

نظرًا لأن السؤال يتعلق بتسلسل فيديو، حيث من المحتمل أن تكون الإطارات متماثلة تقريبًا، وتبحث عن شيء غير عادي، أود أن أذكر بعض الأساليب البديلة التي قد تكون ذات صلة:

  • طرح الخلفية وتقسيمها (للكشف عن الكائنات الأمامية)
  • التدفق البصري المتناثر (للكشف عن الحركة)
  • مقارنة الرسوم البيانية أو بعض الإحصائيات الأخرى بدلاً من الصور

أوصي بشدة بإلقاء نظرة على كتاب "Learning OpenCV"، الفصل التاسع (أجزاء الصورة وتقسيمها) والفصل العاشر (التتبع والحركة).يقوم الأول بتعليم استخدام طريقة الطرح في الخلفية، بينما يقدم الأخير بعض المعلومات حول طرق التدفق البصري.يتم تنفيذ جميع الطرق في مكتبة OpenCV.إذا كنت تستخدم بايثون، أقترح استخدام OpenCV ≥ 2.3، و cv2 وحدة بايثون.

النسخة الأكثر بساطة من الطرح الخلفية:

  • تعرف على متوسط ​​القيمة μ والانحراف المعياري σ لكل بكسل من الخلفية
  • قارن قيم البكسل الحالية بالنطاق (μ-2σ,μ+2σ) أو (μ-σ,μ+σ)

تأخذ الإصدارات الأكثر تقدمًا في الاعتبار السلاسل الزمنية لكل بكسل وتتعامل مع المشاهد غير الثابتة (مثل الأشجار المتحركة أو العشب).

تتمثل فكرة التدفق البصري في أخذ إطارين أو أكثر، وتعيين ناقل السرعة لكل بكسل (التدفق البصري الكثيف) أو لبعضهم (التدفق البصري المتناثر).لتقدير التدفق البصري المتناثر، يمكنك استخدام طريقة لوكاس كانادي (يتم تنفيذه أيضًا في OpenCV).من الواضح، إذا كان هناك الكثير من التدفق (متوسط ​​مرتفع على القيم القصوى لمجال السرعة)، فهذا يعني أن شيئًا ما يتحرك في الإطار، وتكون الصور اللاحقة أكثر اختلافًا.

قد تساعد مقارنة الرسوم البيانية في اكتشاف التغيرات المفاجئة بين الإطارات المتتالية.تم استخدام هذا النهج في كوربون وآخرون، 2010:

تشابه الإطارات المتتالية. يتم قياس المسافة بين إطارين متتاليين.إذا كان مرتفعًا جدًا، فهذا يعني أن الإطار الثاني تالف وبالتالي يتم حذف الصورة.ال مسافة كولباك – ليبلر, ، أو الإنتروبيا المتبادلة، على الرسوم البيانية للإطارين:

$$ d(p,q) = \sum_i p(i) \log (p(i)/q(i)) $$

أين ص و س يتم استخدام الرسوم البيانية للإطارات.تم تثبيت العتبة على 0.2.

نصائح أخرى

حل بسيط:

قم بتشفير الصورة كـ a jpeg والبحث عن تغيير جوهري في حجم الملف.

لقد نفذت شيئًا مشابهًا مع الصور المصغرة للفيديو، وحققت الكثير من النجاح وقابلية التوسع.

ويمكنك المقارنة بين الصور باستخدام وظائف من PIL .

import Image
import ImageChops

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

diff = ImageChops.difference(im2, im1)

والكائن فرق هي صورة فيها كل بكسل هو نتيجة الطرح القيم لون هذا البكسل في الصورة الثانية من الصورة الأولى. استخدام صورة فرق يمكنك القيام به العديد من الأشياء. أبسط واحدة هي وظيفة diff.getbbox(). وسوف اقول لكم المستطيل الحد الأدنى الذي يحتوي على كافة التغييرات بينكم وبين صورتين.

وربما يمكنك تنفيذ تقريبية لغيرها من الاشياء المذكورة هنا باستخدام وظائف من PIL كذلك.

وطريقتين شعبية وبسيطة نسبيا هي: (أ) المسافة الإقليدية اقترح بالفعل، أو (ب) تطبيع عبر الارتباط. تطبيع عبر الارتباط يميل إلى أن يكون أكثر قوة ملحوظ للتغيرات الإضاءة من بسيط عبر الارتباط. ويكيبيديا يعطي صيغة ل تطبيع عبر الارتباط . أساليب أكثر تطورا موجودة أيضا، ولكنها تتطلب قدرا عمل أكثر قليلا.

وعن طريق تركيب مثل نمباي،

dist_euclidean = sqrt(sum((i1 - i2)^2)) / i1.size

dist_manhattan = sum(abs(i1 - i2)) / i1.size

dist_ncc = sum( (i1 - mean(i1)) * (i2 - mean(i2)) ) / (
  (i1.size - 1) * stdev(i1) * stdev(i2) )

وعلى افتراض أن i1 وi2 هي 2D صفائف صورة الرمادي.

وهناك شيء تافه لمحاولة:

وإعادة تشكيله على حد سواء الصور إلى الصور المصغرة الصغيرة (مثل 64 × 64) وقارن الصور المصغرة بكسل حسب بكسل مع عتبة معينة. إذا كانت الصور الأصلية هي نفسها تقريبا، فإن الصور المصغرة الوصله تكون مشابهة جدا أو حتى بالضبط نفس الشيء. يأخذ هذا الأسلوب رعاية الضوضاء التي يمكن أن تحدث وخاصة في مشاهد الإضاءة المنخفضة. قد يكون من الافضل لو تذهب الرمادي.

أنا أتناول على وجه التحديد مسألة كيفية حساب ما إذا كانت "مختلفة بدرجة كافية".أفترض أنه يمكنك معرفة كيفية طرح وحدات البكسل واحدة تلو الأخرى.

أولاً، أود أن ألتقط مجموعة من الصور مع لا شئ التغيير، واكتشف الحد الأقصى لمقدار تغير أي بكسل فقط بسبب الاختلافات في الالتقاط، والضوضاء في نظام التصوير، ومؤثرات ضغط JPEG، والتغيرات اللحظية في الإضاءة.ربما ستجد أنه من المتوقع حدوث اختلافات بمقدار 1 أو 2 بت حتى في حالة عدم تحرك أي شيء.

ثم بالنسبة للاختبار "الحقيقي"، فأنت تريد معيارًا مثل هذا:

  • نفس الشيء إذا كان ما يصل إلى P بكسل يختلف بما لا يزيد عن E.

لذلك، ربما، إذا كانت E = 0.02، P = 1000، فهذا يعني (تقريبًا) أنه سيكون "مختلفًا" إذا تغير أي بكسل واحد بأكثر من 5 وحدات تقريبًا (بافتراض صور ذات 8 بت)، أو إذا كان أكثر من 1000 وكان بكسل أي أخطاء على الإطلاق.

ويهدف هذا بشكل أساسي إلى أن يكون أسلوب "فرز" جيد للتعرف بسرعة على الصور القريبة بدرجة كافية بحيث لا تحتاج إلى مزيد من الفحص.الصور التي "تفشل" قد تتحول بعد ذلك إلى تقنية أكثر تفصيلاً/باهظة الثمن والتي لن تحتوي على نتائج إيجابية كاذبة إذا اهتزت الكاميرا قليلاً، على سبيل المثال، أو كانت أكثر قوة في مواجهة تغييرات الإضاءة.

أقوم بإدارة مشروع مفتوح المصدر، OpenImageIO, ، يحتوي على أداة مساعدة تسمى "idiff" تقارن الاختلافات مع الحدود مثل هذه (والأكثر تفصيلاً في الواقع).حتى إذا كنت لا ترغب في استخدام هذا البرنامج، فقد ترغب في إلقاء نظرة على المصدر لمعرفة كيف فعلنا ذلك.يتم استخدامه تجاريًا إلى حد ما وقد تم تطوير تقنية العتبة هذه حتى نتمكن من الحصول على مجموعة اختبار لبرامج العرض ومعالجة الصور، مع "صور مرجعية" قد يكون لها اختلافات بسيطة من منصة إلى أخرى أو كما أجرينا تعديلات طفيفة عليها ثا الخوارزميات، لذلك أردنا عملية "التطابق ضمن التسامح".

ومعظم الإجابات لن تتعامل مع مستويات الإضاءة.

وأود في البداية تطبيع الصورة إلى مستوى ضوء معيار قبل القيام المقارنة.

وجميلة، وهناك طريقة أخرى بسيطة لقياس التشابه بين صورتين:

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)

وإذا كان الآخرون مهتمون بطريقة أكثر قوة مقارنة صورة التشابه، لقد وضعت <لأ href = "http://douglasduhaime.com/posts/identifying-similar-images-with-tensorflow.html" يختلط = "نوفولو noreferrer"> تعليمي و التطبيق لقياس وتصور صور مماثلة باستخدام Tensorflow.

لقد واجهت مشكلة مماثلة في العمل، حيث كنت أقوم بإعادة كتابة نقطة نهاية تحويل الصورة الخاصة بنا وأردت التحقق من أن الإصدار الجديد كان ينتج نفس مخرجات الإصدار القديم أو تقريبًا نفس الناتج.لذلك كتبت هذا:

https://github.com/nicolashahn/diffimg

والذي يعمل على صور بنفس الحجم، وعلى مستوى كل بكسل، يقيس الفرق في القيم في كل قناة:تأخذ R، G، B(، A)، متوسط ​​الفرق بين تلك القنوات، ثم تقوم بحساب متوسط ​​الفرق على كل وحدات البكسل، وترجع نسبة.

على سبيل المثال، مع صورة مقاس 10x10 من البكسلات البيضاء، ونفس الصورة ولكن تم تغيير بكسل واحد إلى اللون الأحمر، يكون الفرق عند ذلك البكسل هو 1/3 أو 0.33...(RGB 0,0,0 مقابل 255,0,0) وفي جميع وحدات البكسل الأخرى هي 0.بإجمالي 100 بكسل، 0.33.../100 = اختلاف بنسبة ~0.33% في الصورة.

أعتقد أن هذا سيعمل بشكل مثالي مع مشروع OP (أدرك أن هذا منشور قديم جدًا الآن، ولكنه منشور لـ StackOverflowers المستقبلي الذي يريد أيضًا مقارنة الصور في بيثون).

هل رأيت خوارزمية للعثور على صور مماثلة السؤال؟ التحقق من ذلك لمعرفة الاقتراحات.

وأود أن أقترح تحويل المويجات الإطارات الخاصة بك (لقد كتبت تمديد C لذلك باستخدام التحول هار)؛ ثم، بمقارنة مؤشرات من أكبر (نسبيا) العوامل المويجات بين الصورتين، يجب أن تحصل على تقريب التشابه العددي.

أعتذر إذا كان الوقت قد فات للرد، ولكن بما أنني قمت بشيء مماثل، اعتقدت أنه يمكنني المساهمة بطريقة ما.

ربما باستخدام OpenCV يمكنك استخدام مطابقة القالب.على افتراض أنك تستخدم كاميرا ويب كما قلت:

  1. تبسيط الصور (ربما العتبة؟)
  2. قم بتطبيق مطابقة القالب وتحقق من max_val باستخدام minMaxLoc

نصيحة:max_val (أو min_val حسب الطريقة المستخدمة) سيعطيك أرقامًا كبيرة.للحصول على الفرق في النسبة المئوية، استخدم قالبًا مطابقًا لنفس الصورة -- وستكون النتيجة 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

نأمل أن يساعد.

<وأ href = "http://www.google.ca/search؟hl=en&safe=off&client=firefox-a&rls=org.mozilla:en-US:official&hs=HD8&pwst=1&sa=X&oi=spell&resnum=0&ct= نتيجة ومؤتمر نزع السلاح = 1 & ف = الأرض + المحرك٪ 27S + مسافة + صورة وتوضيح = 1 "يختلط =" نوفولو noreferrer "> الأرض المحركون تنأى قد يكون بالضبط ما تحتاجه. قد يكون <م> أبيت الثقيلة لتنفيذ في الوقت الحقيقي بالرغم من ذلك.

ماذا عن حساب مسافة مانهاتن من الصورتين.يمنحك ذلك قيم n * n.ثم يمكنك القيام بشيء مثل متوسط ​​الصف لتقليل القيم إلى n ووظيفة فوق ذلك للحصول على قيمة واحدة.

ولقد كان لديها الكثير من الحظ مع الصور JPG التي اتخذت مع نفس الكاميرا على ترايبود من قبل (1) تبسيط كبير (مثل الذهاب من 3000 بكسل إلى 100 بكسل أو حتى أقل) (2) تسطيح كل مجموعة JPG إلى ناقل واحد (3) زوجيا ربط صور متسلسلة مع خوارزمية المضاهاة بسيطة للحصول على معامل الارتباط (4) تربيع معامل الارتباط للحصول على ص-مربع (أي جزء من التباين في صورة واحدة وأوضحت من قبل الاختلاف في القادم) (5) عموما في طلبي لو-ص مربع <0.9، وأنا أقول الصورتين مختلفة وحدث شيء بينهما.

وهذا هو قوي وسريع في تنفيذ بلدي (الرياضيات 7)

ومن الجدير اللعب حولها مع جزء من الصورة التي ترغب في وتركز على ذلك من خلال زراعة المحاصيل جميع الصور لتلك المنطقة قليلا، وإلا تغييرا بعيد، من دون والكاميرا ولكن المهم سيتم تفويتها.

وأنا لا أعرف كيفية استخدام بيثون، ولكن واثق من أنه لا الارتباطات، أيضا، أليس كذلك؟

ويمكنك حساب الرسم البياني لكل من الصور وثم حساب باتاشاريا معامل ، هذا هو خوارزمية سريعة جدا ولقد استخدمت للكشف عن تغيرات النار في شريط فيديو الكريكيت (في C باستخدام مكتبة برمجية مفتوحة للرؤية الحاسوبية)

تحقق من كيفية تنفيذ هار المويجات عن طريق ISK-الخفي . هل يمكن استخدامه لimgdb كود C ++ لحساب الفرق بين الصور على ذبابة:

<اقتباس فقرة>   

وISK-الخفي هو مفتوح خادم قاعدة البيانات المصدر قادر على إضافة على المحتوى (البصرية) صورة البحث إلى أي موقع المرتبطة صورة أو البرامج.

     

وهذه التقنية تسمح للمستخدمين من أي موقع المتصلة صورة أو برامج ليرسم على القطعة التي الصورة التي تريد أن تجد ويكون الرد موقع لهم الصور الأكثر مماثلة أو طلب ببساطة لمزيد من الصور مماثلة في كل صفحة صورة التفاصيل.

وكان لي نفس المشكلة وكتب حدة الثعبان البسيطة التي يقارن بين الصور من نفس الحجم باستخدام ImageChops وسادة لخلق أسود / صورة فرق بيضاء ويلخص القيم الرسم البياني.

ويمكنك الحصول على أي من هذه النتيجة مباشرة، أو قيمة النسبة المئوية مقارنة كامل السوداء مقابل فرق الأبيض.

وكما أنه يحتوي على وظيفة is_equal بسيطة، مع إمكانية توفير عتبة غامض تحت (ومنها) صورة يمر على قدم المساواة كما.

وهذا النهج هو ليس معقد جدا، ولكن ربما يكون الاستخدام لأغراض أخرى هناك تعاني من نفس المشكلة.

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

ونهج إلى حد ما أكثر المبدئي هو استخدام واصف العالمي لمقارنة الصور، مثل GIST أو الوسط. ودالة البعثرة، كما هو موضح هنا أيضا يوفر حل مماثل.

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', 6))
    r = compare_image_dir_with_hash('image1\\', image2\\', 10)
    for k in r.keys():
        print(k, r.get(k))


if __name__ == '__main__':
    main()
  • انتاج:

    خطأ شنيع
    حقيقي
    image2\5.jpg image1\815.jpg
    image2\6.jpg image1\819.jpg
    image2\7.jpg image1\900.jpg
    image2\8.jpg image1\998.jpg
    image2\9.jpg image1\1012.jpg

  • الصور المثال:

    • 815.jpg
      815.jpg

    • 5.jpg
      5.jpg

وأعتقد أنك يمكن ببساطة حساب المسافة الإقليدية (أي الجذر التربيعي (مجموع المربعات من الخلافات، بكسل بكسل)) بين الإنارة من الصورتين، والنظر لهم على قدم المساواة إذا كان هذا يندرج تحت بعض عتبة التجريبية. وكنت أفضل أن تفعل ذلك التفاف وظيفة C.

وهناك العديد من المقاييس هناك لتقييم ما إذا كان صورتين تبدو مثل / كم تبدو عليه.

وأنا لن أذهب إلى أي رمز هنا، لأنني أعتقد أنه يجب أن يكون هناك مشكلة علمية، وغيرها من مشكلة فنية.

وعموما، يرتبط السؤال إلى تصور الإنسان على الصور، لذلك كل خوارزمية ديه دعمها على سمات النظام البصري الإنسان.

والمناهج الكلاسيكية هي:

والمرئية الخلافات مؤشرا: خوارزمية لتقييم الإخلاص صورة (<لأ href = "https://www.spiedigitallibrary.org/conference-proceedings-of-spie/1666/0000/Visible-differences-predictor-- على خوارزمية مقابل لتقييم ل/ 10،1117 / 12.135952.short؟ SSO = 1 "يختلط =" نوفولو noreferrer "> https://www.spiedigitallibrary.org/conference-proceedings-of-spie/1666/0000 /Visible-differences-predictor--an-algorithm-for-the-assessment-of/10.1117/12.135952.short؟SSO=1 )

وتقييم جودة الصورة: من وضوح خطأ لالهيكلية التشابه ( HTTP: //www.cns.nyu.edu/pub/lcv/wang03-reprint.pdf )

وFSIM: ميزة مؤشر التشابه لتقييم جودة الصورة ( الشبكي : //www4.comp.polyu.edu.hk/~cslzhang/IQA/TIP_IQA_FSIM.pdf )

وفيما بينها، وحركة استقلال جنوب السودان (تقييم جودة الصورة: من وضوح خطأ لالهيكلية التشابه) هو أسهل لحساب والنفقات العامة التي هي أيضا صغيرة، كما ورد في ورقة أخرى "تقييم جودة الصورة بناء على التدرج التشابه" (<لأ href = "https://www.semanticscholar.org/paper/Image-Quality-Assessment-Based-on-Gradient-Liu-Lin/2b819bef80c02d5d4cb56f27b202535e119df988" يختلط = "noreferrer نوفولو"> https://www.semanticscholar.org/paper/ --تقييم جودة صورة القائم على اساس التدرج ليو لين / 2b819bef80c02d5d4cb56f27b202535e119df988 ).

وهناك العديد من الطرق الأخرى. نلقي نظرة على الباحث العلمي من Google وبحث عن شيء من هذا القبيل "الفرق البصرية"، "تقييم جودة الصورة"، وما إلى ذلك، إذا كنت مهتما / نكترث الفن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top