بررسی معادل بودن دو تصویر در OpenCV

یکی از مهمترین مسئله ای که در پردازش تصویر وجود دارد، بررسی این است که آیا دو تصویر معادل یکدیگر هستند یا نه؟ در این مطلب می خواهیم به شما یاد دهیم که چگونه معادل بودن دو تصویر را بررسی کنید همچنین متد ()countNonZero را معرفی می کنیم. همچنین لازم است با متدهای ()subtract و ()split نیز آشنا باشید.

متد subtract در OpenCV برای تفریق دو تصویر

جداسازی تصویر بر اساس کانال های آن توسط متد ()split

پیش از هر چیز باید دو تصویر را با متد ()imread بخوانید تا پس از آن بتوانیم ماتریس های دو تصویر را با یکدیگر بررسی کنیم. در مطلب های پیشین در مورد خصوصیت shape صحبت کردیم و گفتیم اندیس شماره صفر برابر با تعداد ستون ها، اندیس شماره ۱ برابر با تعداد سطرها و اندیس شماره ۲ برابر با تعداد کانال تصویر است.

خصوصیت های تصویر با پایتون و OpenCV

بنابراین نخستین کاری که باید انجام دهیم، بررسی این است که دو تصویر دارای تعداد سطر و ستون یکسان باشند و همچنین بررسی این که آیا دو تصویر دارای تعداد کانال برابر هستند یا نه؟ تصویرهای خاکستری تک کانالی و تصویرهای رنگی RGB دارای سه کانال هستند. پس در کد زیر می بینید که دو تصویر را تنها از دید این سه ویژگی بررسی کرده ایم.

پس از آن باید ماتریس دو تصویر را از هم تفریق کنیم تا متوجه شویم که آیا دو تصویر پیکسل به پیکسل با یکدیگر برابر هستند. برای این منظور از متدی به نام ()subtract استفاده خواهیم کرد. در خط ۸ از کد زیر، نام دو متغیر به متد ()subtract فرستاده شده است که هر کدام به ماتریس تصویرها اشاره می کنند.

حاصل اجرای متد ()subtract خود نیز یک ماتریس (تصویر) جدید است که در خط ۹ در متغیری به نام diff ذخیره شده است. در صورتی دو تصویر برابر هم باشند، تمامی درایه های ماتریس جدید، برابر با مقدار پیکسل صفر است و به این معنی است که تصویر جدید کاملا سیاه رنگ است. دلیل آن، این است که متد ()subtract، پیکسل به پیسکل از دو تصویر را در مکان های متناظر (x,y) در دو تصویر را از هم کم می کند و اگر مقدار پیکسل دو موقعیت متناظر با هم برابر باشند، پس حاصل تفریق آنها عدد صفر است.

پس از تفریق ماتریس دو تصویر و بدست آمدن ماتریسی جدید، باید توسط متد ()split کانل های آنرا از هم جدا کنیم تا بتوانیم پس از آن و توسط متدی به نام ()countNonZero می خواهیم بررسی کنیم که آیا تمامی مقدارهای پسکیل در هر سه کانال BGR برابر با صفر هستند یا نه؟

در واقع خروجی متد ()countNonZero تعداد درایه های غیر صفر یک ماتریس است، پس در واقع متد ()countNonZero یک ماتریس (نوع numpy.ndarray) را دریافت و سپس تعداد درایه های غیر صفر آن را برگشت می دهد. در صورتی که هیچ درایه غیر صفری وجود نداشته باشد، پس خروجی متد عدد صفر است.

بنابراین اگر تمامی درایه های هر یک از کانال های جدا شده b و g و r برابر با صفر باشند، پس می توان نتیجه گرفت که هر دو مقدار پیسکل متناظر برابر بوده اند. توجه کنید که در کدهای بالا و سپس از اجرای متد ()split هر یک از سه متغیر b و g و r از نوع numpy.ndarray هستند.

روش دوم – استفاده از کتابخانه NumPy

در کد زیر بوسیله متد ()any از کتابخانه NumPy می خواهیم به گونه ای دیگر بررسی معادل بودن دو تصویر را پیدا کنیم. متد ()any درون یک آرایه NumPy (ماتریس) می گردد و بررسی می کند که تک تک درایه های آن True (غیر صفر) باشند، پس می توانیم از آن برای بررسی اینکه ایا تمامی درایه های ماتریس حاصل از اجرای ()subtract صفر هستند یا نه استفاده کنیم.

خط بالا معادل خط ۱۱ از قطعه کد زیر است و نشان می دهد که مقدار برگشتی متد ()any یا True یا False است که توانسته ایم نتجه برگشتی را توسط عملگر not معکوس کنیم. به عبارت دیگر اگر تمامی درایه های ماتریس صفر (False) باشند، پس مقدار False برگشت داده می شود ولی اگر تنها یک مقدار غیر صفر (True) وجود داشته باشد، مقدار True برگشت داده می شود.

بنابراین چون ما به دنبال بررسی صفر بودن تمامی درایه های ماتریس هستیم، و در این صورت خروجی متد ()any برابر با False است، پس در خط بالا (خط ۱۱ کد زیر)، نتیجه برگشتی را توسط عملگر not عکس کرده ایم. قطعه کد زیر تمامی کدهای مورد استفاده توسط متد ()any را نشان می دهد.

توجه کنید که ما در تشخیص اینکه دو تصویر معادل هم هستند یا نه، به جز بررسی اندازه و تعداد کانال های تصویر، به دنبال این هستیم که ببینیم آیا هر دو پیسکل در موقعیت های متناظر در ماتریس دوتصویر مقدار برابر دارند یا نه و برای این منظور توسط متد ()subtract مقدار پیکسل های متناظر را از هم کم می کنیم و اگر تمامی پیکسل ها یکسان باشند، پس ماتریس جدیدی ایجاد می شود که تمامی درایه های آن صفر هستند.

چگونه دو تصویر را توسط کتابخانه Pillow مقایسه کنیم

مقایسه دو تصویر با کتابخانه Pillow در پایتون

پیدا کردن تفاوت های دو تصویر با ماژول diffimg