सामान्य विचार
विकल्प 1: दोनों छवियों को सरणियों के रूप में लोड करें ( scipy.misc.imread
) और एक तत्व-वार (पिक्सेल-बाय-पिक्सेल) अंतर की गणना करें। अंतर के मान की गणना करें।
विकल्प 2: दोनों छवियों को लोड करें। उनमें से प्रत्येक के लिए कुछ विशेषता वेक्टर की गणना करें (जैसे हिस्टोग्राम)। छवियों के बजाय फ़ीचर वैक्टर के बीच की दूरी की गणना करें।
हालाँकि, पहले करने के लिए कुछ निर्णय हैं।
प्रशन
आपको पहले इन सवालों का जवाब देना चाहिए:
क्या एक ही आकार और आयाम के चित्र हैं?
यदि नहीं, तो आपको उनका आकार बदलने या फसल करने की आवश्यकता हो सकती है। पीआईएल लाइब्रेरी इसे पायथन में करने में मदद करेगी।
यदि उन्हें समान सेटिंग्स और समान डिवाइस के साथ लिया जाता है, तो वे संभवतः समान हैं।
क्या छवियाँ अच्छी तरह से संरेखित हैं?
यदि नहीं, तो आप पहले सबसे अच्छा संरेखण खोजने के लिए, पहले क्रॉस-सहसंबंध चलाना चाहते हैं। SciPy के पास इसे करने के लिए कार्य हैं।
यदि कैमरा और दृश्य अभी भी हैं, तो चित्र अच्छी तरह से संरेखित होने की संभावना है।
क्या छवियों का प्रदर्शन हमेशा समान होता है? (लपट / इसके विपरीत है?)
यदि नहीं, तो आप छवियों को सामान्य करना चाह सकते हैं ।
लेकिन सावधान रहें, कुछ स्थितियों में यह अच्छे से अधिक गलत कर सकता है। उदाहरण के लिए, एक अंधेरे पृष्ठभूमि पर एक एकल उज्ज्वल पिक्सेल सामान्यीकृत छवि को बहुत अलग कर देगा।
क्या रंग की जानकारी महत्वपूर्ण है?
यदि आप रंग परिवर्तनों को नोटिस करना चाहते हैं, तो आपके पास ग्रे-स्केल छवि में स्केलर मान के बजाय प्रति बिंदु रंग मानों का एक वेक्टर होगा। ऐसे कोड लिखते समय आपको अधिक ध्यान देने की आवश्यकता है।
क्या छवि में अलग-अलग किनारे हैं? क्या उनके स्थानांतरित होने की संभावना है?
यदि हाँ, आप पहले एज डिटेक्शन एल्गोरिथ्म लागू कर सकते हैं (जैसे कि सोबेल या प्रीविट ट्रांसफ़ॉर्म के साथ ढाल की गणना करें, कुछ सीमा लागू करें), फिर पहली छवि पर किनारों की तुलना दूसरे पर किनारों से करें।
क्या छवि में शोर है?
सभी सेंसर शोर की कुछ मात्रा के साथ छवि को प्रदूषित करते हैं। कम लागत वाले सेंसर में अधिक शोर होता है। आप छवियों की तुलना करने से पहले कुछ शोर कम करने की इच्छा कर सकते हैं। ब्लर यहां सबसे सरल (लेकिन सबसे अच्छा नहीं) दृष्टिकोण है।
आप किस तरह के बदलाव नोटिस करना चाहते हैं?
यह छवियों के बीच अंतर के लिए उपयोग करने के लिए आदर्श की पसंद को प्रभावित कर सकता है।
मैनहट्टन मानदंड (निरपेक्ष मानों का योग) या शून्य मानदंड (शून्य के बराबर तत्वों की संख्या) का उपयोग करने पर विचार करें कि छवि कितनी बदल गई है। पूर्व आपको बताएगा कि छवि कितनी बंद है, बाद वाला केवल यह बताएगा कि कितने पिक्सेल अलग हैं।
उदाहरण
मुझे लगता है कि आपकी छवियों को अच्छी तरह से संरेखित किया गया है, एक ही आकार और आकार, संभवतः विभिन्न जोखिम के साथ। सादगी के लिए, मैं उन्हें ग्रेस्केल में परिवर्तित करता हूं, भले ही वे रंग (आरजीबी) के चित्र हों।
आपको इन आयातों की आवश्यकता होगी:
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
2 डी 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
तीव्रता प्राप्त करने के लिए एक 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
PS संपूर्ण तुलना । स्क्रिप्ट।
अद्यतन: प्रासंगिक तकनीक
जैसा कि प्रश्न एक वीडियो अनुक्रम के बारे में है, जहां फ़्रेम लगभग समान होने की संभावना है, और आप कुछ असामान्य की तलाश करते हैं, मैं कुछ वैकल्पिक दृष्टिकोणों का उल्लेख करना चाहता हूं जो प्रासंगिक हो सकते हैं:
- पृष्ठभूमि घटाव और विभाजन (अग्रभूमि वस्तुओं का पता लगाने के लिए)
- विरल ऑप्टिकल प्रवाह (गति का पता लगाने के लिए)
- चित्र के बजाय हिस्टोग्राम या कुछ अन्य आँकड़ों की तुलना करना
मैं दृढ़ता से "OpenCV सीखना" पुस्तक, अध्याय 9 (छवि भागों और विभाजन) और 10 (ट्रैकिंग और गति) पर एक नज़र डालने की सलाह देता हूं। पूर्व पृष्ठभूमि घटाव विधि का उपयोग करना सिखाता है, उत्तरार्द्ध ऑप्टिकल प्रवाह विधियों पर कुछ जानकारी देता है। सभी विधियाँ OpenCV पुस्तकालय में कार्यान्वित की जाती हैं। यदि आप पायथन का उपयोग करते हैं, तो मेरा सुझाव है कि ओपनसीवी and 2.3, और इसके cv2
पायथन मॉड्यूल का उपयोग करें।
पृष्ठभूमि घटाव का सबसे सरल संस्करण:
- पृष्ठभूमि के प्रत्येक पिक्सेल के लिए औसत मान μ और मानक विचलन सीखें
- (pixel-2 μ, μ + 2 or) या (μ-μ, μ + σ) की श्रेणी के वर्तमान पिक्सेल मूल्यों की तुलना करें
अधिक उन्नत संस्करण हर पिक्सेल के लिए खाते की समय श्रृंखला में ले जाते हैं और गैर-स्थिर दृश्यों (जैसे कि पेड़ या घास) को संभालते हैं।
ऑप्टिकल फ्लो का विचार दो या अधिक फ्रेम लेना है, और प्रत्येक पिक्सेल (घने ऑप्टिकल प्रवाह) या उनमें से कुछ (विरल ऑप्टिकल प्रवाह) को वेग वेक्टर आवंटित करना है। विरल ऑप्टिकल प्रवाह का अनुमान लगाने के लिए, आप लुकास-कनाडे विधि का उपयोग कर सकते हैं (यह OpenCV में भी लागू किया गया है)। जाहिर है, अगर बहुत अधिक प्रवाह (वेग क्षेत्र के अधिकतम मूल्यों पर उच्च औसत) है, तो कुछ फ्रेम में आगे बढ़ रहा है, और बाद की छवियां अधिक भिन्न हैं।
हिस्टोग्राम की तुलना लगातार फ्रेम के बीच अचानक बदलाव का पता लगाने में मदद कर सकती है। इस दृष्टिकोण का उपयोग कोर्टबन एट अल, 2010 में किया गया था :
निरंतर फ्रेम की समानता। दो लगातार फ्रेम के बीच की दूरी को मापा जाता है। यदि यह बहुत अधिक है, तो इसका मतलब है कि दूसरा फ्रेम दूषित है और इस प्रकार छवि समाप्त हो गई है। Kullback-Leibler दूरी , या आपसी एन्ट्रापी, दो फ्रेम के हिस्टोग्राम पर:
जहाँ p और q तख्ते के हिस्टोग्राम होते हैं। दहलीज 0.2 पर तय की गई है।