Morphological Transformations
ما عملیات مختلف مورفولوژیکی مانند فرسایش ، کشیده شدن ، باز شدن ، بسته شدن و غیره را یاد خواهیم گرفت.
توابع مختلفی مانند: cv.erode () ، cv.dilate () ، cv.morphologyEx () و غیره را مشاهده خواهیم کرد.
تئوری
دگرگونی های ریختشناختی چند عمل ساده بر اساس شکل تصویر است. به طور معمول بر روی تصاویر باینری انجام می شود. به دو ورودی احتیاج دارد ، یکی تصویر اصلی ماست ، دیگری عنصر یا هسته ساختاردهنده است که ماهیت کار را تعیین می کند. دو عملگر اصلی ریخت شناسی فرسایش و باز شدن هستند. سپس فرم های مختلف آن مانند Opening ، Closing ، Gradient و غیره نیز نشان داده می شوند. با کمک تصویر زیر یکی یکی آنها را خواهیم دید:
1. فرسایش یا Erosion
ایده اصلی فرسایش فقط مانند فرسایش خاک است ، مرزهای جسم پیش زمینه را از بین می برد (همیشه سعی کنید Foreground یا پیش زمینه را به رنگ سفید نگه دارید). بنابراین چه کاری انجام می دهد؟ هسته از طریق تصویر اسلاید می کند (همانند Convolutional 2D). یک پیکسل در تصویر اصلی (1 یا 0) فقط 1 در نظر گرفته می شود اگر تمام پیکسل های زیر هسته 1 باشد ، در غیر این صورت فرسایش می یابد (صفر می شود).
بنابراین آنچه اتفاق می افتد این است که ، تمام پیکسل های نزدیک به مرز بسته به اندازه هسته کنار گذاشته می شوند. بنابراین ضخامت یا اندازه جسم پیش زمینه کاهش می یابد یا به سادگی منطقه سفید در تصویر کاهش می یابد. که برای از بین بردن نویز های کوچک سفید مفید است.
در اینجا ، به عنوان مثال ، من از هسته 5x5 استفاده می کنم. بیایید ببینیم که چگونه کار می کند:
import cv2
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv.erode(img,kernel,iterations = 1)
cv2.imshow("erosion ",erosion )
خروجی قطعه کد بالا:
2. کشیده شدن یا Dilation
این دقیقاً در مقابل فرسایش قرار دارد. در اینجا ، اگر حداقل یک پیکسل زیر هسته "1" باشد ، یک عنصر پیکسل "1" است. بنابراین باعث افزایش ناحیه سفید در تصویر می شود یا اندازه جسم پیش زمینه افزایش می یابد. به طور معمول ، در مواردی مانند حذف نویز ، فرسایش با اتساع یا وسعت انجام می شود. زیرا ، فرسایش ، نویز های سفید را از بین می برد ، اما جسم ما را نیز کوچک می کند. بنابراین آن را وسیع و کشیده می کنیم. از آنجا که نویز ها از بین رفته است ، بر نمی گردند ، اما منطقه جسم ما افزایش می یابد. همچنین در اتصال قطعات شکسته یک جسم نیز مفید است.
import cv2
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(img,kernel,iterations = 1)
cv2.imshow("dilation",dilation )
خروجی قطعه کد بالا:
3. باز شدن یا Opening
باز شدن فقط نام دیگری از فرسایش و به دنبال آن کشیدگی است. همانطور که در بالا توضیح دادیم در حذف نویز مفید است. در اینجا ما از تابع cv.morphologyEx () استفاده می کنیم
import cv2
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
cv2.imshow("opening ",opening )
خروجی قطعه کد بالا:
4. بستن یا Closing
بستن معکوس openning ، اتساع و به دنبال آن فرسایش است. در بستن حفره های کوچک داخل اجسام پیش زمینه ، یا نقاط سیاه کوچک روی جسم مفید است.
import cv2
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
closing = cv.morphologyEx(img, cv.MORPH_CLOSE, kernel)
cv2.imshow("closing ",closing )
خروجی قطعه کد بالا:
5. گرادیان ریخت شناسی یا Morphological Gradient
این تفاوت بین اتساع و فرسایش یک تصویر است. نتیجه شبیه رئوس مطالب جسم خواهد بود.
import cv2
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
cv2.imshow("gradient",gradient)
خروجی قطعه کد بالا:
6. top hat
این تفاوت بین تصویر ورودی و openning تصویر است. مثال زیر برای یک هسته 9x9 انجام شده است.
import cv2
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
cv2.imshow("tophat ",tophat )
خروجی قطعه کد بالا:
7. black hat
این تفاوت بین بسته شدن تصویر ورودی و تصویر ورودی است.
import cv2
import numpy as np
img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
cv2.imshow("blackhat ",blackhat )
خروجی قطعه کد بالا: