ओपनसीवी और पायथन के साथ इमेज प्रोसेसिंग के लिए एक शुरुआती गाइड

स्रोत नोड: 1074439

इस लेख के एक भाग के रूप में प्रकाशित किया गया था डेटा साइंस ब्लॉगथॉन

परिचय

एक छवि के अंदर बहुत सारी जानकारी छिपी हो सकती है और हम इसकी विभिन्न तरीकों और दृष्टिकोणों से व्याख्या कर सकते हैं। तो, एक छवि क्या है, और एक छवि से कैसे निपटें? सरल शब्दों में, हम कह सकते हैं कि एक छवि किसी चीज़ का एक दृश्य प्रतिनिधित्व है और इसे कंप्यूटर दृष्टि (मशीन सीखने के दृष्टिकोण से) का उपयोग करके आसानी से निपटा जा सकता है। वीडियो के बारे में क्या? एक वीडियो को छवियों या निरंतर फ़्रेमों के चलते हुए सेट की रिकॉर्डिंग के रूप में वर्णित किया जा सकता है। लेकिन हम दूसरे ब्लॉग में कंप्यूटर विजन का उपयोग करके वीडियो से निपट सकते हैं! 🙂

आप में से कुछ लोग अब तक कंप्यूटर विजन के बारे में पहले से ही जानते होंगे और इस पैराग्राफ को छोड़ सकते हैं, लेकिन जिन्हें इसके बारे में कोई जानकारी नहीं है, उनके लिए कंप्यूटर विजन, जिसे ज्यादातर संक्षिप्त रूप 'सीवी' में जाना जाता है, को एक क्षेत्र के रूप में कहा जा सकता है। आर्टिफिशियल इंटेलिजेंस जो चिकित्सा क्षेत्र, मोटर वाहन, विनिर्माण, कृषि, आदि सहित इस आधुनिक युग में लगभग सभी डोमेन से उपयोगी जानकारी निकालता है।

ओपनसीवी के साथ इमेज प्रोसेसिंग | कंप्यूटर दृष्टि

छवि 1

एक इंसान के रूप में, जो इस समय इस पोस्ट को पढ़ रहा है, आप किसी छवि में मौजूद चीजों या तत्वों के बीच अंतर करने में सक्षम होंगे। लेकिन, मशीनों का क्या? क्या वे इसे अपने आप में अलग करने के लिए देख और सोच सकते थे? नहीं? तो चलिए आपकी मशीन से करते हैं।

इस ब्लॉग में, आप अपने आप को पायथन का उपयोग करके कंप्यूटर विज़न की मूल बातों से परिचित कराएंगे।

मेरा मानना ​​​​है कि आपने अजगर में प्रोग्राम करने के लिए पहले से ही Python Shell/Jupyter Notebook/PyCharm या Visual Studio Code (कुछ का नाम) स्थापित कर लिया है। आरंभ करने के लिए व्यापक रूप से उपयोग किए जाने वाले पैकेज (ओपनसीवी) को स्थापित करें और हम ज्यूपिटर नोटबुक में प्रत्येक सेल में कोड चलाने जा रहे हैं।

इमेज प्रीप्रोसेसिंग के लिए OpenCV पैकेज इंस्टॉल करना

ओपनसीवी एक प्री-बिल्ट, ओपन-सोर्स सीपीयू-ओनली लाइब्रेरी (पैकेज) है जिसका व्यापक रूप से कंप्यूटर विजन, मशीन लर्निंग और इमेज प्रोसेसिंग एप्लिकेशन के लिए उपयोग किया जाता है। यह पायथन सहित विभिन्न प्रकार की प्रोग्रामिंग भाषाओं का समर्थन करता है।

OpenCV पैकेज का उपयोग करके स्थापित करें:

पाइप ओपनसीवी-पायथन स्थापित करें

OR

पाइप opencv-contrib-python स्थापित करें

इनमें से कोई भी आदेश अपने टर्मिनल पर चलाएँ या यदि आप एनाकोंडा नेविगेटर - ज्यूपिटर नोटबुक का उपयोग कर रहे हैं, तो आप "पाइप" को "कोंडा" कमांड से बदल सकते हैं और इसे स्थापित कर सकते हैं।

पैकेज आयात करना

पायथन में एक पैकेज क्या है? पायथन में एक पैकेज मॉड्यूल का एक संग्रह है जिसमें पूर्व-लिखित स्क्रिप्ट होती हैं। ये पैकेज हमें पूरी तरह से या अलग-अलग मॉड्यूल आयात करने में मदद करते हैं। हम इस तरह "cv2" मॉड्यूल को कॉल करके पैकेज आयात कर सकते हैं:

आयात cv2

एक छवि पढ़ना

डिजिटल छवियों को वर्गीकृत किया जा सकता है; रंग छवियां, ग्रे-स्केल छवियां, बाइनरी छवियां और मल्टीस्पेक्ट्रल छवियां। एक रंगीन छवि में प्रत्येक पिक्सेल के लिए रंग की जानकारी शामिल होती है। ग्रे के रंगों वाली छवियां उनके एकमात्र रंग ग्रेस्केल छवियां हैं जबकि एक बाइनरी छवि में दो रंग होते हैं, ज्यादातर काले और सफेद पिक्सेल। मल्टीस्पेक्ट्रल छवियां ऐसी छवियां होती हैं जो कुछ विशिष्ट तरंग दैर्ध्य के भीतर विद्युत चुम्बकीय स्पेक्ट्रम में छवि डेटा को कैप्चर करती हैं।

आइए कोडिंग भाग पर वापस जाएं और एक छवि पढ़ें, उदाहरण के लिए, छवि नीचे दिखाई गई है:

पढ़ने की छवि | OpenCV के साथ इमेज प्रोसेसिंग

यह एक मैंड्रिल की छवि है। मैं वर्तमान में अपने स्थानीय निर्देशिका से छवि पढ़ रहा हूँ।

# cv2.imread (पथ_to_image_with_file_extension, ध्वज)

उपयोग कोड इसे पसंद करता है:

img = cv2.imread ("mandrill.jpg", 1)

यहाँ हम छवि को पढ़ने के लिए cv2 पैकेज की "imread" विधि का उपयोग कर रहे हैं और पहला पैरामीटर छवि के फ़ाइल नाम और एक्सटेंशन के साथ छवि के पथ से मेल खाता है, और दूसरा वह ध्वज है जिसे आप सेट कर सकते हैं जो रास्ता बताता है, इमेज में कैसे पढ़ें। यदि आप चाहें, तो आप यहां छवि के पूर्ण पथ को बदल सकते हैं और इसे अपने स्थानीय कंप्यूटर या इंटरनेट से भी पढ़ने का प्रयास कर सकते हैं! यदि छवि आपकी वर्तमान कार्यशील निर्देशिका में मौजूद है, तो आपको केवल छवि नाम को उसके एक्सटेंशन प्रकार के साथ निर्दिष्ट करने की आवश्यकता है।

जहां तक ​​दूसरे पैरामीटर का संबंध है, यदि आप इसे ग्रेस्केल छवि के रूप में पढ़ना पसंद करते हैं, तो आप छवि को अपरिवर्तित पढ़ने के लिए पैरामीटर को 0, -1 पर निर्दिष्ट कर सकते हैं (छवि को अल्फा या पारदर्शिता चैनल के रूप में पढ़ता है यदि यह वहां है) और डिफ़ॉल्ट रूप से, यह रंग छवि के रूप में 1 है। आप इस लिंक से अन्य पैरामीटर भी आज़मा सकते हैं:

https://docs.opencv.org/4.5.2/d8/d6a/group__imgcodecs__flags.html#ga61d9b0126a3e57d9277ac48327799c80

इमरेडमोड्स के तहत।

एक छवि के गुण

आकार:

प्रत्येक छवि का एक आकार होता है। चित्र द्वारा प्रदर्शित सीमाओं की लंबाई को आकार यानी ऊंचाई और चौड़ाई के रूप में संदर्भित किया जा सकता है। अब जब आप जानते हैं कि छवि को कैसे पढ़ा जाता है, तो हम छवि के आकार की जांच कैसे करें?

प्रिंट (img.shape)

छवि के आकार को प्रिंट करने का मूल तरीका है, लेकिन हम इसका उपयोग करके आकृति को निकाल सकते हैं:

h, w, c = img.shape प्रिंट ("छवि का आयाम है: nnHeight:", h, "pixelsnWidth:", w, "pixelsnNumber of Channels:", c)

एक बेहतर समझ पाने के लिए।

रंग और अपरिवर्तित मोड के लिए, यह छवि में मौजूद ऊंचाई, चौड़ाई और चैनलों की संख्या सहित 3 मान लौटाएगा। यदि आपने ग्रेस्केल मोड का उपयोग किया है, तो आकार 2 होगा, जो छवि की ऊँचाई और चौड़ाई लौटाएगा, लेकिन तब आपको केवल h और w चर का उपयोग करना होगा ("c" का उपयोग छोड़कर), अन्यथा आप प्राप्त कर सकते हैं एक मान त्रुटि कह रही है "अनपैक करने के लिए पर्याप्त मान नहीं है (अपेक्षित 3, 2 मिला)"।

प्रकार

हम "टाइप" विधि का उपयोग करके छवि के प्रकार को जान सकते हैं। इस पद्धति का उपयोग करने से हमें यह जानने में मदद मिलती है कि छवि डेटा का प्रतिनिधित्व कैसे किया जाता है। कोड को निम्नानुसार चलाएँ:

प्रिंट (प्रकार (आईएमजी))

नतीजा ऐसा हो सकता है:

छवि प्रकार के रूप में। यह एक ही प्रकार और आकार की वस्तुओं का एक बहुआयामी कंटेनर है। आप निम्न लिंक पर एन-आयामी सरणी के बारे में अधिक जानकारी प्राप्त कर सकते हैं:

https://numpy.org/doc/stable/reference/arrays.ndarray.html

आपके द्वारा अभी-अभी पढ़ी गई छवि का डेटा प्रकार:

चूंकि छवि एक एन-आयामी सरणी है, हम छवि के डेटा प्रकार की जांच कर सकते हैं:

प्रिंट (img.dtype)

छवि पिक्सेल मान:

हम एक छवि को छोटे नमूनों के समूह के रूप में सोच सकते हैं। इन नमूनों को पिक्सेल कहा जाता है। बेहतर समझ के लिए, छवि को जितना हो सके ज़ूम इन करने का प्रयास करें। हम एक ही को विभिन्न वर्गों में विभाजित देख सकते हैं। ये पिक्सल होते हैं और जब ये आपस में जुड़ जाते हैं तो एक इमेज बनाते हैं।

एक छवि का प्रतिनिधित्व करने के सरल तरीकों में से एक मैट्रिक्स के रूप में है। हम एक मैट्रिक्स का उपयोग करके एक छवि भी बना सकते हैं और इसे सहेज सकते हैं! आपको दिखाएंगे कि कैसे, बाद में इस पोस्ट में। नीचे दी गई इस तस्वीर पर एक नज़र डालें:

छवि पिक्सेल मान | OpenCV के साथ इमेज प्रोसेसिंग

छवि 2

यह चित्र इस बात का उदाहरण है कि किसी छवि का मैट्रिक्स प्रतिनिधित्व कैसा दिखता है। बाईं ओर, लिंकन की एक छवि है, बीच में, पिक्सेल मान 0 से 255 तक की संख्या के साथ लेबल किए गए हैं, जो उनकी तीव्रता या चमक को दर्शाते हैं और दाईं ओर, मैट्रिक्स में संख्याएँ स्वयं बनती हैं। मैट्रिक्स में प्रत्येक मान एक पिक्सेल से मेल खाता है, जो एक छवि में मौजूद सूचना का सबसे छोटा तत्व है। केवल वेरिएबल को प्रिंट करके इमेज पिक्सेल मान देखें, जिसे आपने इमेज लोड किया है!

प्रिंट (आईएमजी)

छवि वियोजन:

छवि रिज़ॉल्यूशन को एक छवि में मौजूद पिक्सेल की संख्या के रूप में परिभाषित किया जा सकता है। पिक्सेल की संख्या बढ़ने पर छवि की गुणवत्ता बढ़ जाती है। हमने पहले देखा है, छवि का आकार जो पंक्तियों और स्तंभों की संख्या बताता है। इसे उस छवि का संकल्प कहा जा सकता है। कुछ मानक संकल्प हैं जो लगभग सभी जानते हैं 320 x 240 पिक्सेल (ज्यादातर छोटे स्क्रीन उपकरणों पर उपयुक्त), 1024 x 768 पिक्सेल (मानक कंप्यूटर मॉनीटर पर देखने के लिए उपयुक्त), 720 x 576 पिक्सेल (मानक परिभाषा टीवी पर देखने के लिए अच्छा) 4:3 आस्पेक्ट रेश्यो वाले सेट), 1280 x 720 पिक्सल (वाइडस्क्रीन मॉनिटर पर देखने के लिए), 1280 x 1024 पिक्सल (5:4 आस्पेक्ट रेशियो वाले एलसीडी मॉनिटर पर फुल-स्क्रीन साइज में देखने के लिए अच्छा), 1920 x 1080 पिक्सल (एचडी टीवी पर देखने के लिए) और अब हमारे पास 4K, 5K, और 8K रिज़ॉल्यूशन भी हैं जो क्रमशः 3840 x 2160 पिक्सेल, 5120 × 2880 पिक्सेल और 7,680 x 4,320 पिक्सेल हैं जो अल्ट्रा हाई डेफिनिशन मॉनिटर और टेलीविज़न द्वारा समर्थित हैं।

जब हम स्तंभों की संख्या और पंक्तियों की संख्या को गुणा करते हैं, तो हम छवि में मौजूद पिक्सेल की कुल संख्या प्राप्त कर सकते हैं। उदाहरण के लिए, एक 320 x 240 छवि में, इसमें मौजूद पिक्सेल की कुल संख्या 76,800 पिक्सेल है।

छवि देखना

आइए देखें कि विंडो में छवि को कैसे प्रदर्शित किया जाए। उसके लिए, हमें स्क्रीन पर छवि प्रदर्शित करने के लिए एक GUI विंडो बनानी होगी। पहला पैरामीटर जीयूआई विंडो स्क्रीन का शीर्षक होना चाहिए, जिसे स्ट्रिंग प्रारूप में निर्दिष्ट किया गया है। हम cv2.imshow () विधि का उपयोग करके छवि को पॉप-अप विंडो में दिखा सकते हैं। लेकिन, जब आप इसे बंद करने का प्रयास करते हैं, तो आपको इसकी विंडो में अटका हुआ महसूस हो सकता है। तो इससे निपटने के लिए, हम एक सरल "वेटके" विधि का उपयोग कर सकते हैं। इस कोड भाग को नए सेल में आज़माएं:

cv2.imshow('मैनड्रिल', img) k = cv2.waitKey(0) अगर k == 27 या k == ord('q'): cv2.destroyAllWindows()

यहां, हमने विंडो को तब तक खुला रखने के लिए "प्रतीक्षा कुंजी" में पैरामीटर '0' निर्दिष्ट किया है जब तक हम इसे बंद नहीं करते। (आप 0 के बजाय मिलीसेकंड में भी समय दे सकते हैं, यह निर्दिष्ट करते हुए कि इसे कितना समय खोला जाना चाहिए।) उसके बाद, जब हम 'ESC' कुंजी या 'कुंजी' दबाते हैं तो हम विंडो को बंद करने के लिए वेरिएबल असाइन कर सकते हैं। क्यू'। cv2.destroAllWindows () पद्धति का उपयोग स्क्रीन/मेमोरी से जीयूआई विंडो को बंद करने या हटाने के लिए किया जाता है।

छवि सहेजा जा रहा है

इमेज को सेव करने से पहले, इमेज को ग्रेस्केल में बदलने और फिर उसे सेव करने के बारे में क्या ख्याल है? छवि का उपयोग करके ग्रेस्केल में बदलें:

ग्रे = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)

अब हम छवि को सहेज सकते हैं:

cv2.imwrite ('मैंड्रिल_ग्रे.जेपीजी', ग्रे)

और वर्तमान कार्यशील निर्देशिका में सहेजी जा रही छवि की जाँच करें। पहला पैरामीटर उस फ़ाइल के नाम से मेल खाता है जिसमें छवि को सहेजा जाना है और दूसरा पैरामीटर वह चर है जिसमें छवि (पिक्सेल जानकारी) शामिल है।

छवि बिट विमानों को निकालना और उनका पुनर्निर्माण करना

हम एक इमेज को बिट प्लेन के विभिन्न स्तरों में विभाजित कर सकते हैं। उदाहरण के लिए, किसी छवि को 8-बिट (0-7) तलों में विभाजित करें, जहां अंतिम कुछ तलों में छवि के लिए अधिकांश जानकारी होती है।

बिट योजनाएँ

छवि 3

ऐसा करने के लिए, हम दो और पैकेज आयात कर सकते हैं:

आयात matplotlib.pyplot plt के रूप में np के रूप में numpy आयात करें

यदि आपको किसी पैकेज को आयात करते समय कोई त्रुटि मिलती है, तो आप उनका उपयोग कर स्थापित कर सकते हैं:

कोंडा इंस्टाल -c कोंडा-फोर्ज matplotlib कोंडा इंस्टाल -c एनाकोंडा numpy

अब हम छवि के 8 स्तर बिट विमानों में से प्रत्येक को निकालने के लिए एक फ़ंक्शन को परिभाषित कर रहे हैं।

डीईएफ़ एक्सट्रेक्ट_बिट_प्लेन (सीडी): # सभी बिट को एक-एक करके निकालना # पहली से आठवीं तक चर में # क्रमशः c1 से c8 तक c1 = np.mod (cd, 8) c1 = np.mod (np.floor (cd/2) , 2) c2 = np.mod(np.floor(cd/2), 3) c4 = np.mod(np.floor(cd/2), 4) c8 = np.mod(np.floor(cd/2) ), 5) c16 = np.mod(np.floor(cd/2), 6) c32 = np.mod(np.floor(cd/2), 7) c64 = np.mod(np.floor(cd/) 2), 8) # मूल ग्रेस्केल छवि के समतुल्य बनाने के लिए फिर से छवि का संयोजन cc = 128 * (2 * (2 * c2 + c2) + c8) # 7 सबसे महत्वपूर्ण बिट विमानों के साथ छवि का पुनर्निर्माण करना to_plot = [cd, c6, c3 , c1, c2, c3, c4, c5, c6, cc] fig, axes = plt.subplots(nrows=7, ncols=8,figsize=(2, 5), subplot_kw={'xticks': [], ' yticks': []}) fig.subplots_adjust(hspace=10, wspace=8) for ax, i in zip(axes.flat, to_plot): ax.imshow(i, cmap='gray') plt.tight_layout() plt.show() रिटर्न सीसी

अब हम फंक्शन को कॉल करने के लिए तैयार हैं।

पुनर्निर्मित_इमेज = एक्सट्रेक्ट_बिट_प्लेन (ग्रे)

हमने पिछले तीन बिट विमानों यानी छठे, सातवें और आठवें विमानों का उपयोग करके छवि (लगभग समान) का पुनर्निर्माण किया है। और नतीजा ऐसा दिखता है:

छवि का पुनर्निर्माण | OpenCV के साथ इमेज प्रोसेसिंग

कैसे हम अपने आप एक छोटी छवि बनाते हैं? आइए इसे अभी आज़माएं!

एक छोटी सिंथेटिक छवि का निर्माण

हम चार अलग-अलग पिक्सेल तीव्रता मूल्यों के साथ चार संकेंद्रित वर्गों वाली एक सिंथेटिक छवि उत्पन्न करने का प्रयास कर सकते हैं,

40, 80, 160, और 220.

con_img = np.zeros([256, 256]) con_img[0:32, :] = 40 # ऊपरी पंक्ति con_img[:, :32] = 40 #बायां स्तंभ con_img[:, 224:256] = 40 # दायां स्तंभ con_img[224:, :] = 40 # निचली पंक्ति con_img[32:64, 32:224] = 80 # ऊपरी पंक्ति con_img[64:224, 32:64] = 80 # बायां स्तंभ con_img[64:224, 192: 224] = 80 # दायां स्तंभ con_img[192:224, 32:224] = 80 # निचली पंक्ति con_img[64:96, 64:192] = 160 # ऊपरी पंक्ति con_img[96:192, 64:96] = 160 # बायां स्तंभ con_img[96:192, 160:192] = 160 # दायां स्तंभ con_img[160:192, 64:192] = 160 # निचली पंक्ति con_img[96:160, 96:160] = 220 plt.imshow(con_img)

परिणामी छवि इस तरह दिखेगी:

उत्पादन

हम अन्य लेख में छवियों पर विभिन्न फिल्टर और परिवर्तनों का उपयोग करने पर विचार कर सकते हैं।

लेख पढ़ने के लिए धन्यवाद.

मेम

छवि 4

टिप्पणियों के तहत अपने सुझाव जोड़ने के लिए स्वतंत्र महसूस करें और अगर आपको यह लेख पसंद आया तो साझा करें। इस लेख में वर्णित ज्यूपिटर नोटबुक में पूरा पायथन प्रोग्रामिंग कोड मेरे जीथब रिपॉजिटरी पर उपलब्ध है:

https://github.com/jissdeodates/Beginner-s-Guide-to-Computer-Vision

सन्दर्भ:

  1. छवि 1 - https://seevisionc.blogspot.com/2013/09/computer-vision-is-everywhere.html
  2. इमेज 2- https://towardsdatascience.com/everything-you-ever-wanted-to-know-about-computer-vision-heres-a-look-why-it-s-so-awesome-e8a58dfb641e
  3. Image 3- https://nptel.ac.in/content/storage2/courses/117104069/chapter_8/8_13.html
  4. इमेज 4- https://memegenerator.net/instance/21508026/willy-wonka-oh-so-you-created-a-computer-vision-algorithm-you-must-never-lose-the-remote

https://docs.opencv.org/4.5.2/d1/dfb/intro.html

https://docs.opencv.org/4.5.2/db/deb/tutorial_display_image.html

इस लेख में दिखाया गया मीडिया एनालिटिक्स विद्या के स्वामित्व में नहीं है और लेखक के विवेक पर उपयोग किया जाता है।

स्रोत: https://www.analyticsvidhya.com/blog/2021/09/a-beginners-guide-to-image-processing-with-opencv-and-python/

समय टिकट:

से अधिक एनालिटिक्स विधा