- 1. छवि रूपांतरण - Affine और गैर-Affine परिवर्तन
- 2. छवि अनुवाद - छवि को ऊपर, नीचे, बाएँ और दाएँ ले जाना
- 3. इमेज का घूमना - इमेज को स्पिन करना
- 4. स्केलिंग, रिसाइज़िंग और इंटरपोल
- 5. छवि पिरामिड - आकार बदलने का दूसरा तरीका
- 6. फसल - इच्छित छवि क्षेत्र को काटकर
- 7. छवियों के ब्राइटनिंग और डार्कनिंग के लिए अंकगणितीय संचालन
पिछले ट्यूटोरियल में, हमने OpenCV के बारे में जाना है और ग्रे स्केलिंग, कलर सैचुरेशन, हिस्टोग्राम, कलर स्पेस, RGB कंपोनेंट आदि जैसे इसे इस्तेमाल करते हुए कुछ बेसिक इमेज प्रोसेसिंग की है। जैसा कि पिछले ट्यूटोरियल में बताया गया है, OpenCV ओपन सोर्स कम्यूटर विजन लाइब्रेरी है जो सी ++, पायथन और जावा इंटरफेस और विंडोज, लिनक्स, मैक ओएस, आईओएस और एंड्रॉइड का समर्थन करता है। तो यह आसानी से अजगर और लिनक्स वातावरण के साथ रास्पबेरी पाई में स्थापित किया जा सकता है। और OpenCV और संलग्न कैमरे के साथ रास्पबेरी पाई का उपयोग कई वास्तविक समय छवि प्रसंस्करण अनुप्रयोगों जैसे फेस डिटेक्शन, फेस लॉक, ऑब्जेक्ट ट्रैकिंग, कार नंबर प्लेट डिटेक्शन, होम सिक्योरिटी सिस्टम आदि बनाने के लिए किया जा सकता है।
इस ट्यूटोरियल में, हम यह देखने जा रहे हैं कि हम OpenCV का उपयोग करके छवि को कैसे हेरफेर करने जा रहे हैं । यहां हम OpenCV का उपयोग करके एक छवि पर निम्नलिखित फ़ंक्शन लागू करना सीखेंगे:
- छवि रूपांतरण - Affine और गैर-Affine परिवर्तन
- छवि अनुवाद - छवि को ऊपर, नीचे, बाएँ और दाएँ ले जाना
- छवि का रोटेशन - छवि को स्पिन करना
- स्केलिंग, रीसाइज़िंग और इंटरपोलेशन
- छवि पिरामिड - आकार बदलने का दूसरा तरीका
- फसल - आप चाहते हैं कि छवि क्षेत्र में कटौती
- छवियों के ब्राइटनिंग और डार्कनिंग के लिए अंकगणितीय संचालन
1. छवि रूपांतरण - Affine और गैर-Affine परिवर्तन
रूपांतरण एक छवि पर बनाए गए ज्यामितीय विकृतियां हैं, विकृतियां निश्चित रूप से यहां गलतियों का मतलब नहीं है, लेकिन उस बिंदु से उत्पन्न होने वाले परिप्रेक्ष्य मुद्दों को ठीक करने के लिए एक सुधार प्रकार है जहां छवि पर कब्जा कर लिया गया था। छवि परिवर्तन दो प्रकार के होते हैं - Affine और Non-Affine
Affine transformations तीन प्रकार के स्केलिंग, रोटेशन और ट्रांसलेशन के होते हैं, affine परिवर्तनों में महत्वपूर्ण बात यह है कि इमेज ट्रांसफॉर्मेशन से पहले और बाद में लाइनें समानांतर होती हैं।
गैर-Affine परिवर्तनों या प्रक्षेपवक्र परिवर्तनों समानांतरता, लंबाई या कोण को संरक्षित नहीं करता है, लेकिन यह collinearity और घटना को संरक्षित करता है, collinearity का मतलब है कि दो बिंदु एक ही सीधी रेखा पर स्थित हैं।
गैर-Affine परिवर्तनों कंप्यूटर दृष्टि में बहुत आम हैं और विभिन्न कैमरा कोणों से उत्पन्न होते हैं। गैर-प्रतिबाधा या प्रक्षेप्य परिवर्तनों को होमोग्राफी भी कहा जाता है ।
2. छवि अनुवाद - छवि को ऊपर, नीचे, बाएँ और दाएँ ले जाना
यदि हम एक ही समय में x और y अनुवाद लागू करते हैं, तो छवि अनुवाद छवि को ऊपर, नीचे, बाएं और दाएं और यहां तक कि विकर्ण पर ले जा रहा है।
अब छवि अनुवाद करने के लिए हम opencv के warpAffine फ़ंक्शन का उपयोग करते हैं, cv2.warpAffine का उपयोग इन अनुवादों को लागू करने के लिए किया जाता है, लेकिन इसके लिए हमें अनुवाद मैट्रिक्स की आवश्यकता होती है।
अनुवाद मैट्रिक्स, टी = 1 0 टीएक्स
0 1 ty
T X, T y वे दिशाएँ हैं जिनमें छवि का बदलाव होता है।
जिसमें टी एक्स को एक्स-एक्सिस (क्षैतिज) के साथ शिफ्ट किया जाता है
T Y, Y- अक्ष (वर्टिकल) के साथ शिफ्ट होता है
# यह एक रूपांतरण है जो बस एक छवि की स्थिति को बदल देता है # हम अपने परिवर्तनों को लागू करने के लिए cv2.warpAffine का उपयोग करते हैं। आयात cv2 एनपी छवि के रूप में सुन्न आयात = cv2.imread ('input.jpg') # छवि ऊंचाई, चौड़ाई = छवि.शैप प्रिंट (छवि.शैप) quater_height, qu__width = ऊंचाई / 4, चौड़ाई / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (छवि, T, (चौड़ाई, ऊँचाई)) प्रिंट (T) cv2.imshow ('ओरिजनल पेजेज', छवि) cv2.waitKey (0) cv2.imshow (' अनुवाद ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
कंसोल आउटपुट - (183, 275) - ऊंचाई और चौड़ाई
- टी मैट्रिक्स
]
3. इमेज का घूमना - इमेज को स्पिन करना
छवि का रोटेशन छवि के केंद्र में बिंदु या बिंदु के बारे में एक छवि को घुमा रहा है, जिस तरह घूर्णन बिंदु धुरी की तरह कार्य करता है।
जैसा कि अनुवाद में हमारे पास टी मैट्रिक्स है, रोटेशन में संभावना है कि हमारे पास एम मैट्रिक्स है
रोटेशन मैट्रिक्स, एम मैट्रिक्स = Cosθ -S matrix matrix
पाप करना Cosθ
जहां anti रोटेशन का कोण है, एंटी-क्लॉकवाइज दिशा में मापा जाता है ।
यह भी ध्यान देने वाली एक बात है कि OpenCV आपको फ़ंक्शन, cv2.getRotationMatrix2D (रोटेशन_center_x , रोटेशन_सेंटर_y, रोटेशन के कोण, स्केल) का उपयोग करके एक ही समय में छवि को बेचने और घुमाने की अनुमति देता है।
हम छवि के रोटेशन को प्राप्त करने के लिए अभी भी opencv के warpAffine फ़ंक्शन का उपयोग करते हैं, लेकिन अनुवाद मैट्रिक्स के बजाय पिछले मामले में यहां हम रोटेशन मैट्रिक्स का उपयोग करते हैं।
आयात cv2 एनपी छवि के रूप में सुन्न आयात = cv2.imread ('input.jpg') ऊँचाई, चौड़ाई = image.shape # 2 से ऊँचाई और चौड़ाई को बढ़ाएँ। छवि को केंद्र रोटेशन_मेट्रिक्स =v2.getRotationMatrix2D ((चौड़ाई / 2) के बारे में बदलने के लिए, ऊंचाई / 2), 90,1) घुमाया हुआ = दशमलव = cv2.warpAffine (छवि, रोटेशन_मेट्रिक्स, (चौड़ाई, ऊंचाई)) cv2.imshow ('मूल छवि', छवि) cv2.waitKey (0) cv2.imshow ('घुमाया गया चित्र) ', रोटेट_इमेज) cv2.waitKey (0) cv2.destroyAllWindows ()
अब छवि को 90 डिग्री तक घुमाया जाता है, यह कैनवास के आकार के कारण क्रॉप होता है, क्योंकि कैनवास का आकार समान रहता है, लेकिन रोटेशन के कारण छवि का आकार कैनवास के आकार में फिट नहीं होता है। स्केलिंग कारक को नकारात्मक पर सेट करके इसे समायोजित किया जा सकता है, लेकिन यह छवि के पीछे एक काली पृष्ठभूमि की अनुमति देता है।
इसलिए आप छवि की ऊँचाई और चौड़ाई का अनुमान लगाकर या उसका अनुमान लगा सकते हैं या छवि को घुमाने का कोई अन्य तरीका है, इसे ट्रांसपोज़ करके, लेकिन यह छवि को 90 डिग्री के गुणकों द्वारा एंटी-क्लॉकवाइज़ दिशा में घुमाएगा।
4. स्केलिंग, रिसाइज़िंग और इंटरपोल
स्केलिंग और आकार बदलना समरूप परिवर्तन हैं, छवि का आकार बदलना है जो हमने काफी समय किया है और हमने प्रक्षेप से भी निपटा है, जैसे जब आप छवि को बड़े आकार में आकार दे रहे हैं जिसमें हम पिक्सेल का विस्तार कर रहे हैं, तो कुछ अंतराल हैं पिक्सल और यही वह जगह है जहां इंटरपोलेशन आता है।
यह छवि के आकार को छोटे से बड़े तक बढ़ाने या छवि के आकार को बड़े से कम करने पर हो सकता है।
तकनीकी रूप से, प्रक्षेपित ज्ञात डेटा बिंदुओं के असतत सेट के भीतर नए डेटा पॉइंट (पिक्सेल) के निर्माण की एक विधि है।
हैं प्रक्षेप तरीकों के विभिन्न प्रकार के OpenCV में की तरह
cv2.INTER_AREA - सिकुड़ने या नीचे नमूना लेने के लिए अच्छा है
cv2.INTER_NEAREST - सबसे तेज़
cv2.LINEAR - जूमिंग या अप सैंपलिंग (डिफ़ॉल्ट) के लिए अच्छा है
cv2.CUBIC - बेहतर
cv2.INTER_LANCZOS4 - सर्वोत्तम
# resizing cv2.resize फ़ंक्शन का उपयोग करना बहुत आसान है, इसके तर्क # cv2.resize (छवि, dsize (आउटपुट छवि आकार), x_scale, y_scale, प्रक्षेप) आयात हैं nv छवि = cv2.imread ('इनपुट) के रूप में आयात करें । jpg ') cv2.imshow (' ओरिजिनल_इमेज ', इमेज) cv2.waitKey (0) # आइए इमेज को 3/4 बनाते हैं, ऑरिजनल इमेज साइज यानी स्केल टू डाउन 75% image_scaled - cv2.resize (इमेज, कोई नहीं, fx =) 0.75, fy = 0.75) #since रैखिक प्रक्षेप खुले cv के लिए डिफ़ॉल्ट विधि है, हमें इसे फ़ंक्शन के रूप में लागू करने की आवश्यकता नहीं है। cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # चलो हमारी छवि का आकार दोगुना करते हैं img_double = cv2.resize (छवि, कोई नहीं, fx = 2, fy = 2, प्रक्षेप = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # के सटीक आयामों से आकार बदलने करते हैं image_resize cv2.resize = (छवि, (200,300), प्रक्षेप = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. छवि पिरामिड - आकार बदलने का दूसरा तरीका
पिरामिडिंग इमेज या तो अपसंस्कृति (इमेजों को बढ़ाना) या डाउनस्केलिंग (सिकुड़ती हुई छवियों) को संदर्भित करती है।
यह बस आकार बदलने का एक अलग तरीका है जो हमें आसानी से और जल्दी से पैमाने पर छवियों की अनुमति देता है, नई छवि की ऊंचाई और चौड़ाई को आधे से कम कर देता है।
ऑब्जेक्ट डिटेक्टर बनाते समय यह उपयोगी होता है जो प्रत्येक बार किसी ऑब्जेक्ट के लिए छवियों को देखता है।
आयात cv2 छवि = cv2.imread ('input.jpg') छोटा = cv2.pyrDown (छवि) बड़ा = cv2.pyrUp (छोटा) cv2.imshow ('मूल', छवि) cv2.waitKey (0) cv2.imshow ( ) 'छोटा', छोटा) cv2.waitKey (0) cv2.imshow ('बड़ा', बड़ा) cv2.waitKey (0) cv2.destroyAllWindows ()
बड़ी छवि में आप देखेंगे कि अभी भी मूल छवि का एक ही आकार इसकी छोटी धुंधली है क्योंकि इसकी छोटी छवि से सीधे बड़ी छवि में परिवर्तित किया जा रहा है। लेकिन अगर हम इसे प्रक्षेपित करते हैं, तो छवि की गुणवत्ता पिछले एक के रूप में बेहतर हो जाती है क्योंकि छवि के बड़े होने पर रिक्त स्थान को भरते समय प्रक्षेप का अनुमान पिक्सेल से होता है।
अब एक ही कोड चलाना लेकिन क्यूबिक इंटरपोल के साथ बड़ी छवि का बेहतर गुणवत्ता देता है। नीचे दी गई छवियां मूल छवि के बीच तुलना, छवि के स्केल किए गए संस्करण, छोटी छवि और छोटी छवि के घन प्रक्षेपित संस्करण को दिखाती हैं।
आयात cv2 छवि = cv2.imread ('input.jpg') छोटा = cv2.pyrDown (छवि) बड़ा = cv2.pyrUp (छोटा) cv2.imshow ('मूल', छवि) cv2.waitKey (0) cv2.imshow ( ) 'छोटा', छोटा) cv2.waitKey (0) cv2.imshow ('बड़ा', बड़ा) cv2.waitKey (0) # क्यूब इंटरपोलेशन img_double = cv2.resize (छोटा) का उपयोग करके छोटी छवि से परिवर्तित बड़ी छवि की गुणवत्ता में वृद्धि। कोई नहीं, fx = 2, fy = 2, प्रक्षेप = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
नोट: यदि आप आकार में छोटी और छोटी होती जा रही छवियों की कई छोटी प्रतियां बनाना चाहते हैं या छवियों की कई बड़ी प्रतियां लगातार आकार में बढ़ रही हैं, तो हमलूप्स के लिए उपयोग कर सकते हैंया जबकि पिरामिड या पिरामिड फ़ंक्शन केअंदर लूप्स काउपयोग कर सकते हैं।
6. फसल - इच्छित छवि क्षेत्र को काटकर
क्रॉपिंग इमेज से तात्पर्य इमेज के एक सेगमेंट को निकालने से है।
OpenCV सीधे समारोह फसल नहीं है, लेकिन यह आसानी से किया जा सकता है numpy का उपयोग कर कोड के नीचे
फसली = छवि
हम छवि सरणी डालते हैं और अनुक्रमण में उपकरण या विधि का उपयोग करते हैं, हम पंक्ति को अंतिम पंक्ति और स्तंभ को अंत तक परिभाषित करते हैं, जो एक अल्पविराम द्वारा अलग किए गए स्तंभ को शुरू करते हैं जो उस आयत को निकालता है जिसे हम छवि प्राप्त करना चाहते हैं।
आयात cv2 आयात np छवि = cv2.imread ('input.jpg') ऊंचाई, चौड़ाई = image.shape # के रूप में सुन्न आयात करते हैं चलो शुरू पिक्सेल निर्देशांक (क्रॉपिंग आयत के शीर्ष बाएं) start_row, start_col = int (ऊंचाई *.25) प्राप्त करें।, int (चौड़ाई *.25) # चलो पिक्सेल निर्देशांक (नीचे दाएं) अंत_रो, अंत_कोल (ऊंचाई *.75) प्राप्त करें, int (चौड़ाई *.75) #simply का उपयोग करें अनुक्रमणिका को क्रॉप करने के लिए अनुक्रमणिका का उपयोग करें जिसे हमने काट दिया है =। छवि cv2.imshow ("मूल छवि", छवि) cv2.waitKey (0) cv2.imshow ("फसली छवि", फसली) cv2.waitKey (0) cv2.destroyAllWindows ()
नोट आप start_col या start_row के बजाय सीधे पिक्सेल मानों का उपयोग कर सकते हैं, वे केवल उपयोगकर्ता के लिए आसान पहचान प्राप्त करने के लिए दिए गए हैं।
7. छवियों के ब्राइटनिंग और डार्कनिंग के लिए अंकगणितीय संचालन
OpenCV में अंकगणितीय संचालन मूल रूप से मैट्रिक्स को छवि में जोड़ते या घटाते हैं, मैट्रिक्स को जोड़ने या घटाने से चमक बढ़ने या घटने पर प्रभाव पड़ता है।
इसलिए मैट्रिक्स को जोड़ने या घटाने के लिए हमें उन्हें बनाना होगा और सुन्न में एक फ़ंक्शन है जिसे np.ones कहा जाता है जो हमारी छवि के समान 1 के आकार के मैट्रिक्स देता है।
आयात cv2 एनपी छवि के रूप में सुन्न आयात = cv2.imread ('input.jpg') #create एक का एक मैट्रिक्स, फिर इसे 100 के स्केलर से गुणा करें ' # np.ones एक मैट्रिक्स देता है जिसमें हमारी छवि के समान है। इस मामले में मान 100 होने के कारण M = np.ones (image.shape, dtype = "uint8") * * 100 # का उपयोग हम इस मैट्रिक्स M को हमारी छवि में जोड़ने के लिए करते हैं। # चमक में वृद्धि = cv2.add (छवि), M) cv2.imshow ("जोड़ा गया", जोड़ा गया) cv2.waitKey (0) #likewise हम घटाई गई चमक में #notice = cv2.subtract (छवि, M) cv2.imshow ("घटाया") घटा सकते हैं।) cv2.waitKey (0) cv2.destroyAllWindows ()
यह है कि OpenCV का उपयोग छवि पर कई अलग-अलग छवि प्रसंस्करण कार्यों को लागू करने के लिए किया जा सकता है। हम अगले ट्यूटोरियल में अन्य छवि हेरफेर कार्यों के साथ जारी रखेंगे।