OpenCV اور Python کے ساتھ امیج پروسیسنگ کے لیے ایک ابتدائی رہنما

ماخذ نوڈ: 1074439

اس مضمون کے ایک حصے کے طور پر شائع کیا گیا تھا۔ ڈیٹا سائنس بلاگتھون

تعارف

تصویر کے اندر بہت سی معلومات چھپی ہو سکتی ہیں اور ہم اس کی مختلف طریقوں اور تناظر میں تشریح کر سکتے ہیں۔ تو، تصویر کیا ہے، اور تصویر سے کیسے نمٹا جائے؟ سادہ الفاظ میں، ہم کہہ سکتے ہیں کہ تصویر کسی چیز کی بصری نمائندگی ہے اور اسے کمپیوٹر ویژن (مشین لرننگ کے نقطہ نظر سے) استعمال کرتے ہوئے آسانی سے نمٹا جا سکتا ہے۔ ویڈیوز کے بارے میں کیا خیال ہے؟ ایک ویڈیو کو تصویروں کے متحرک سیٹ یا مسلسل فریموں کی ریکارڈنگ کے طور پر بیان کیا جا سکتا ہے۔ لیکن ہم کسی دوسرے بلاگ میں کمپیوٹر وژن کا استعمال کرتے ہوئے ویڈیوز سے نمٹ سکتے ہیں! 🙂

آپ میں سے کچھ لوگ کمپیوٹر ویژن کے بارے میں پہلے ہی جان چکے ہوں گے اور وہ اس پیراگراف کو چھوڑ سکتے ہیں، لیکن ان لوگوں کے لیے جو اس کے بارے میں کچھ نہیں جانتے، کمپیوٹر ویژن، جو زیادہ تر مختصر شکل 'CV' میں جانا جاتا ہے، کہا جا سکتا ہے مصنوعی ذہانت جو اس جدید دور کے تمام ڈومینز بشمول طبی میدان، آٹوموٹو، مینوفیکچرنگ، زراعت وغیرہ کو مفید معلومات حاصل کرتی ہے۔

OpenCV کے ساتھ امیج پروسیسنگ | کمپیوٹر وژن

تصویری 1

بحیثیت انسان، جو فی الحال اس پوسٹ کو پڑھ رہا ہے، آپ تصویر میں موجود چیزوں یا عناصر کے درمیان فرق کر سکیں گے۔ لیکن، مشینوں کا کیا ہوگا؟ کیا وہ خود ہی اس کی تمیز کو دیکھ اور سوچ سکتے تھے؟ نہیں؟ پھر آئیے آپ کی مشین کو ایسا کرنے دیں۔

اس بلاگ میں، آپ python کا استعمال کرتے ہوئے کمپیوٹر ویژن کی بنیادی باتوں سے اپنے آپ کو واقف کرائیں گے۔

مجھے یقین ہے کہ آپ نے ازگر میں پروگرام کرنے کے لیے Python Shell/Jupyter Notebook/PyCharm یا Visual Studio Code (کچھ کے نام کے لیے) انسٹال کر لیا ہے۔ آئیے شروع کرنے کے لیے وسیع پیمانے پر استعمال ہونے والے پیکیج (اوپن سی وی) کو انسٹال کریں اور ہم ہر سیل میں کوڈز کو Jupyter نوٹ بک میں چلانے جا رہے ہیں۔

امیج پری پروسیسنگ کے لیے اوپن سی وی پیکج انسٹال کرنا

اوپن سی وی ایک پہلے سے تعمیر شدہ، اوپن سورس سی پی یو صرف لائبریری (پیکیج) ہے جو بڑے پیمانے پر کمپیوٹر ویژن، مشین لرننگ، اور امیج پروسیسنگ ایپلی کیشنز کے لیے استعمال ہوتی ہے۔ یہ Python سمیت پروگرامنگ زبانوں کی ایک اچھی قسم کو سپورٹ کرتا ہے۔

اوپن سی وی پیکیج کو استعمال کرتے ہوئے انسٹال کریں:

pip install opencv-python

OR

pip install opencv-contrib-python

ان میں سے کسی بھی کمانڈ کو اپنے ٹرمینل پر چلائیں یا اگر آپ ایناکونڈا نیویگیٹر – Jupyter Notebook استعمال کر رہے ہیں، تو آپ "conda" کمانڈ کے ساتھ "pip" کو تبدیل کر کے اسے انسٹال کر سکتے ہیں۔

پیکج درآمد کرنا

Python میں ایک پیکیج کیا ہے؟ Python میں ایک پیکیج ماڈیولز کا ایک مجموعہ ہے جس میں پہلے سے لکھی گئی اسکرپٹ ہوتی ہیں۔ یہ پیکجز ہمیں مکمل طور پر یا انفرادی طور پر بھی ماڈیول درآمد کرنے میں مدد کرتے ہیں۔ ہم "cv2" ماڈیول کو اس طرح کال کر کے پیکج کو درآمد کر سکتے ہیں:

درآمد cv2

تصویر پڑھنا

ڈیجیٹل تصاویر میں درجہ بندی کی جا سکتی ہے؛ رنگین امیجز، گرے اسکیل امیجز، بائنری امیجز، اور ملٹی اسپیکٹرل امیجز۔ رنگین تصویر میں ہر پکسل کے لیے رنگ کی معلومات شامل ہوتی ہے۔ وہ تصاویر جن کا صرف رنگ کے طور پر بھوری رنگ کے شیڈز ہوتے ہیں وہ گرے اسکیل امیجز ہوتے ہیں جبکہ ایک بائنری امیج میں بالکل دو رنگ ہوتے ہیں، زیادہ تر سیاہ اور سفید پکسلز۔ ملٹی اسپیکٹرل امیجز وہ تصاویر ہیں جو کچھ مخصوص طول موج کے اندر برقی مقناطیسی سپیکٹرم میں تصویری ڈیٹا کو حاصل کرتی ہیں۔

آئیے کوڈنگ والے حصے پر واپس جائیں اور ایک تصویر پڑھیں، مثال کے طور پر، تصویر نیچے دکھائی گئی ہے۔

پڑھنے کی تصویر | OpenCV کے ساتھ امیج پروسیسنگ

یہ مینڈرل کی تصویر ہے۔ میں فی الحال اپنی مقامی ڈائریکٹری سے تصویر پڑھ رہا ہوں۔

# cv2.imread(file_extension کے ساتھ_path_to_image_with, flag)

استعمال کا کوڈ اس طرح نظر آتا ہے:

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

ImreadModes کے تحت۔

ایک تصویر کی خصوصیات

سائز:

ہر تصویر کی ایک شکل ہوتی ہے۔ تصویر کے ذریعہ دکھائے گئے حدود کی لمبائی کو شکل یعنی اونچائی اور چوڑائی کہا جاسکتا ہے۔ اب جب کہ آپ جانتے ہیں کہ تصویر کو کیسے پڑھنا ہے، تو ہم تصویر کی شکل کو کیسے چیک کریں؟

پرنٹ (img.shape)

تصویر کی شکل پرنٹ کرنے کا بنیادی طریقہ ہے، لیکن ہم اس کا استعمال کرتے ہوئے شکل نکال سکتے ہیں:

h, w, c = img.shape پرنٹ("تصویر کے طول و عرض ہے:nnHeight:", h, "pixelsnWidth:", w, "pixelsnNumber of channels:", c)

بہتر تفہیم حاصل کرنے کے لیے۔

رنگ اور غیر تبدیل شدہ موڈ کے لیے، یہ تصویر میں موجود اونچائی، چوڑائی اور چینلز کی تعداد سمیت 3 اقدار واپس کرے گا۔ اگر آپ نے گرے اسکیل موڈ استعمال کیا ہے، تو شکل 2 ہوگی، جو تصویر کی اونچائی اور چوڑائی کو لوٹائے گی، لیکن پھر آپ کو صرف h اور w متغیر استعمال کرنا ہوں گے ("c" استعمال کرنے کو چھوڑ دیں)، ورنہ آپ کو حاصل ہو سکتا ہے۔ قدر کی خرابی یہ کہتی ہے کہ "پیک کھولنے کے لیے کافی قدریں نہیں ہیں (متوقع 3، حاصل 2)"۔

قسم:

ہم "ٹائپ" طریقہ استعمال کرکے تصویر کی قسم جان سکتے ہیں۔ اس طریقہ کو استعمال کرنے سے ہمیں یہ جاننے میں مدد ملتی ہے کہ تصویری ڈیٹا کی نمائندگی کیسے کی جاتی ہے۔ کوڈ کو اس طرح چلائیں:

پرنٹ(قسم(img))

نتیجہ اس طرح ہو سکتا ہے:

تصویر کی قسم کے طور پر. یہ ایک ہی قسم اور سائز کی اشیاء کا کثیر جہتی کنٹینر ہے۔ آپ درج ذیل لنک پر N-dimensional array کا مزید حوالہ دے سکتے ہیں۔

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

تصویر کی ڈیٹا کی قسم جو آپ نے ابھی پڑھی ہے:

چونکہ تصویر ایک N-dimensional array ہے، اس لیے ہم تصویر کے ڈیٹا کی قسم کو چیک کر سکتے ہیں:

پرنٹ (img.dtype)

تصویری پکسل کی قدریں:

ہم ایک تصویر کو چھوٹے نمونوں کے سیٹ کے طور پر سوچ سکتے ہیں۔ ان نمونوں کو پکسلز کہا جاتا ہے۔ بہتر تفہیم کے لیے، جتنا ممکن ہو کسی تصویر کو زوم کرنے کی کوشش کریں۔ ہم اسی کو مختلف مربعوں میں تقسیم دیکھ سکتے ہیں۔ یہ پکسلز ہیں اور جب ان کو ایک ساتھ ملایا جاتا ہے تو وہ ایک تصویر بناتے ہیں۔

تصویر کی نمائندگی کرنے کا ایک آسان طریقہ میٹرکس کی شکل میں ہے۔ ہم میٹرکس کا استعمال کرتے ہوئے ایک تصویر بھی بنا سکتے ہیں اور اسے محفوظ کر سکتے ہیں! بعد میں اس پوسٹ میں آپ کو دکھائیں گے کہ کیسے۔ ذیل میں اس تصویر پر ایک نظر ڈالیں:

تصویری پکسل ویلیوز | OpenCV کے ساتھ امیج پروسیسنگ

تصویری 2

یہ تصویر بجائے اس کی ایک مثال ہے کہ تصویر کی میٹرکس نمائندگی کیسی دکھتی ہے۔ بائیں طرف، لنکن کی تصویر ہے، بیچ میں، پکسل کی اقدار کو 0 سے 255 تک کے نمبروں کے ساتھ لیبل کیا گیا ہے، جو ان کی شدت یا چمک کو ظاہر کرتا ہے اور دائیں طرف، میٹرکس میں نمبر خود بنتے ہیں۔ میٹرکس میں ہر قدر ایک پکسل کے مساوی ہے، جو تصویر میں موجود معلومات کا سب سے چھوٹا عنصر ہے۔ صرف اس متغیر کو پرنٹ کرکے تصویری پکسل ویلیوز کو چیک کریں جس پر آپ نے تصویر لوڈ کی ہے!

پرنٹ (img)

تصویری قرارداد:

تصویری ریزولوشن کو تصویر میں موجود پکسلز کی تعداد کے طور پر بیان کیا جا سکتا ہے۔ جب پکسلز کی تعداد بڑھ جاتی ہے تو تصویر کا معیار بڑھ جاتا ہے۔ ہم پہلے دیکھ چکے ہیں، تصویر کی شکل جو قطاروں اور کالموں کی تعداد دیتی ہے۔ یہ اس تصویر کی قرارداد کے طور پر کہا جا سکتا ہے. معیاری ریزولوشنز میں سے کچھ یہ ہیں کہ تقریباً سبھی جانتے ہیں کہ 320 x 240 پکسلز (زیادہ تر چھوٹی اسکرین والے آلات پر موزوں ہیں)، 1024 x 768 پکسلز (معیاری کمپیوٹر مانیٹر پر دیکھنے کے لیے موزوں)، 720 x 576 پکسلز (اسٹینڈرڈ ڈیفینیشن ٹی وی پر دیکھنے کے لیے اچھا ہے۔ 4:3 اسپیکٹ ریشو والے سیٹ، 1280 x 720 پکسلز (وائیڈ اسکرین مانیٹر پر دیکھنے کے لیے)، 1280 x 1024 پکسلز (5:4 اسپیکٹ ریشو والے LCD مانیٹر پر فل سکرین سائز پر دیکھنے کے لیے اچھا)، 1920 x 1080 پکسلز (ایچ ڈی ٹی وی پر دیکھنے کے لیے) اور اب ہمارے پاس 4K، 5K، اور 8K ریزولوشنز بھی ہیں جو بالترتیب 3840 x 2160 پکسلز، 5120 × 2880 پکسلز اور 7,680 x 4,320 پکسلز ہیں جو الٹرا ہائی ڈیفینیشن مانیٹر اور ٹیلی ویژن کے ذریعے تعاون یافتہ ہیں۔

جب ہم کالموں کی تعداد اور قطاروں کی تعداد کو ضرب دیتے ہیں، تو ہم تصویر میں موجود پکسلز کی کل تعداد حاصل کر سکتے ہیں۔ مثال کے طور پر، ایک 320 x 240 تصویر میں، اس میں موجود پکسلز کی کل تعداد 76,800 پکسلز ہے۔

تصویر دیکھنا

آئیے دیکھتے ہیں کہ تصویر کو ونڈو میں کیسے ڈسپلے کیا جائے۔ اس کے لیے ہمیں اسکرین پر تصویر دکھانے کے لیے ایک GUI ونڈو بنانا ہوگی۔ پہلا پیرامیٹر GUI ونڈو اسکرین کا عنوان ہونا چاہیے، جو سٹرنگ فارمیٹ میں بیان کیا گیا ہے۔ ہم cv2.imshow() طریقہ استعمال کرکے تصویر کو پاپ اپ ونڈو میں دکھا سکتے ہیں۔ لیکن، جب آپ اسے بند کرنے کی کوشش کرتے ہیں، تو آپ کو اس کی کھڑکی سے پھنسا محسوس ہو سکتا ہے۔ تو اس کا مقابلہ کرنے کے لیے، ہم ایک سادہ "waitKey" طریقہ استعمال کر سکتے ہیں۔ اس کوڈ کے حصے کو نئے سیل میں آزمائیں:

cv2.imshow('Mandrill', img) k = cv2.waitKey(0) اگر k == 27 یا k == ord('q'): cv2.destroyAllWindows()

یہاں، ہم نے "waitKey" میں پیرامیٹر '0' کو واضح کیا ہے تاکہ ونڈو کو اس وقت تک کھلا رکھا جائے جب تک کہ ہم اسے بند نہ کر دیں۔ (آپ 0 کی بجائے ملی سیکنڈ میں بھی وقت دے سکتے ہیں، یہ بتاتے ہوئے کہ اسے کتنا وقت کھولنا چاہیے۔) اس کے بعد، جب ہم 'ESC' کلید یا 'کی' کو دباتے ہیں تو ہم ونڈو کو بند کرنے کے لیے متغیر کو تفویض کر سکتے ہیں۔ q' cv2.destroAllWindows() طریقہ GUI ونڈوز کو اسکرین/میموری سے بند کرنے یا حذف کرنے کے لیے استعمال کیا جاتا ہے۔

تصویر کو محفوظ کرنا

تصویر کو محفوظ کرنے سے پہلے، تصویر کو گرے اسکیل میں تبدیل کرنے اور پھر اسے محفوظ کرنے کے بارے میں کیا خیال ہے؟ اس کا استعمال کرتے ہوئے تصویر کو گرے اسکیل میں تبدیل کریں:

گرے = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

اب ہم تصویر کو محفوظ کر سکتے ہیں:

cv2.imwrite('Mandrill_grey.jpg'، گرے)

اور موجودہ ورکنگ ڈائرکٹری میں محفوظ ہونے والی تصویر کو چیک کریں۔ پہلا پیرامیٹر اس فائل کے نام سے مطابقت رکھتا ہے جس میں تصویر کو محفوظ کیا جانا ہے اور دوسرا پیرامیٹر وہ متغیر ہے جس میں تصویر (پکسل کی معلومات) شامل ہے۔

امیج بٹ طیاروں کو نکالنا اور ان کی تشکیل نو کرنا

ہم ایک تصویر کو بٹ طیاروں کی مختلف سطحوں میں تقسیم کر سکتے ہیں۔ مثال کے طور پر، ایک تصویر کو 8 بٹ (0-7) طیاروں میں تقسیم کریں، جہاں آخری چند طیاروں میں تصویر کے لیے زیادہ تر معلومات ہوتی ہیں۔

تھوڑا سا منصوبہ

تصویری 3

ایسا کرنے کے لیے، ہم مزید دو پیکجز درآمد کر سکتے ہیں:

matplotlib.pyplot درآمد کریں بطور plt درآمد numpy بطور np

اگر آپ کو کسی بھی پیکج کو درآمد کرتے وقت کوئی خرابی محسوس ہوتی ہے، تو آپ اسے استعمال کرکے انسٹال کر سکتے ہیں:

conda install -c conda-forge matplotlib conda install -c anaconda numpy

اب ہم تصویر کے 8 لیول بٹ طیاروں میں سے ہر ایک کو نکالنے کے لیے ایک فنکشن کی وضاحت کر رہے ہیں۔

def extract_bit_plane(cd): # تمام بٹ کو ایک ایک کرکے نکالنا # متغیر میں پہلی سے آٹھویں تک # 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) ax, i in zip(axes.flat, to_plot): ax.imshow(i, cmap='gray') plt.tight_layout() plt.show() واپسی cc

اب ہم فنکشن کو کال کرنے کے لیے تیار ہیں۔

reconstructed_image = extract_bit_plane(گرے)

ہم نے آخری تین بٹ طیاروں یعنی چھٹے، ساتویں اور آٹھویں طیاروں کا استعمال کرتے ہوئے تصویر (تقریباً ملتی جلتی) کو دوبارہ بنایا ہے۔ اور نتیجہ اس طرح لگتا ہے:

تصویر کی تشکیل نو | 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.img(con_img)

نتیجے کی تصویر اس طرح نظر آئے گی:

پیداوار

ہم ایک اور مضمون میں تصاویر پر مختلف فلٹرز اور تبدیلیوں کے استعمال پر نظر ڈال سکتے ہیں۔

مضمون پڑھنے کے لیے آپ کا شکریہ۔

meme

تصویری 4

تبصرے کے نیچے اپنی تجاویز شامل کرنے کے لئے آزاد محسوس کریں اور اگر آپ کو یہ مضمون پسند ہے تو شیئر کریں۔ Jupyter Notebook میں مکمل Python پروگرامنگ کوڈ، جس کا اس مضمون میں ذکر کیا گیا ہے میرے Github ذخیرہ پر دستیاب ہے:

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-wesome-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

اس مضمون میں دکھایا گیا میڈیا Analytics ودھیا کی ملکیت نہیں ہے اور مصنف کی صوابدید پر استعمال کیا جاتا ہے۔

ماخذ: https://www.analyticsvidhya.com/blog/2021/09/a-beginners-guide-to-image-processing-with-opencv-and-python/

ٹائم اسٹیمپ:

سے زیادہ تجزیات ودھیا