✅در واقع، هنگام تبدیل داده ها، مشکلی پیش آمده است. شیب ها در مقیاس خاکستری با مقادیر cv2.CV_64F، هنگام تغییر از سیاه به سفید با ارزش های مثبت (شیب مثبت) بیان شده است.
در حالی که آنها با مقادیر منفی (شیب منفی) هنگام تغییر از سفید به سیاه نشان داده می شوند.
در تبدیل از cv2.CV_64F به cv2.CV_8U، تمام دامنه های منفی به 0 کاهش می یابد، و سپس اطلاعات مربوط به آن لبه ها از بین می روند. هنگامی که برنامه تصویر را نشان می دهد، لبه های سفید تا سیاه نمایش داده نخواهد شد.
✅ برای رفع این مشکل، باید داده ها را در خروجی فیلتر در cv2.CV_64F (به جای cv2.CV_8U) نگه دارید،سپس مقدار قطعی را محاسبه کنید و در نهایت تبدیل به cv2.CV_8U را انجام دهید.
💢💢💢💢💢
در حالی که آنها با مقادیر منفی (شیب منفی) هنگام تغییر از سفید به سیاه نشان داده می شوند.
در تبدیل از cv2.CV_64F به cv2.CV_8U، تمام دامنه های منفی به 0 کاهش می یابد، و سپس اطلاعات مربوط به آن لبه ها از بین می روند. هنگامی که برنامه تصویر را نشان می دهد، لبه های سفید تا سیاه نمایش داده نخواهد شد.
✅ برای رفع این مشکل، باید داده ها را در خروجی فیلتر در cv2.CV_64F (به جای cv2.CV_8U) نگه دارید،سپس مقدار قطعی را محاسبه کنید و در نهایت تبدیل به cv2.CV_8U را انجام دهید.
💢💢💢💢💢
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('blackandwhite.jpg',0)
laplacian64 = cv2.Laplacian(img, cv2.CV_64F)
sobelx64 = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely64 = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
laplacian = np.uint8(np.absolute(laplacian64))
sobelx = np.uint8(np.absolute(sobelx64))
sobely = np.uint8(np.absolute(sobely64))
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()
💢
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('blackandwhite.jpg',0)
laplacian64 = cv2.Laplacian(img, cv2.CV_64F)
sobelx64 = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely64 = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
laplacian = np.uint8(np.absolute(laplacian64))
sobelx = np.uint8(np.absolute(sobelx64))
sobely = np.uint8(np.absolute(sobely64))
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()
💢
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('CLK.PNG',0)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()
💢💢💢
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('CLK.PNG',0)
laplacian = cv2.Laplacian(img,cv2.CV_64F)
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
plt.subplot(2,2,1),plt.imshow(img,cmap = 'gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,2),plt.imshow(laplacian,cmap = 'gray')
plt.title('Laplacian'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,3),plt.imshow(sobelx,cmap = 'gray')
plt.title('Sobel X'), plt.xticks([]), plt.yticks([])
plt.subplot(2,2,4),plt.imshow(sobely,cmap = 'gray')
plt.title('Sobel Y'), plt.xticks([]), plt.yticks([])
plt.show()
💢💢💢
💢Canny Edge Detection💢
الگوریتم لبه یاب Canny
💢💢💢💢
الگوریتم لبه یاب Canny
💢💢💢💢
This media is not supported in your browser
VIEW IN TELEGRAM
💢Canny Edge Detection💢
1) مفهموم تشخیص لبه ی Canny
2) اپن سی وی ، تابع cv2.Canny()
را به کار میگیرد.
〰〰〰〰〰〰〰〰〰〰
تشخیص لبه Canny، جزء محبوترین الگوریتم های تشخیص لبه است.
✅ این الگوریتم در چند مرحله انجام میشود.
1) کاهش نویز
از آنجایی که تشخیص لبه حساس به نویز، در تصویر است، اولین گام این است که نویز را در تصویر با یک فیلتر گاوسی 5x5 حذف کنیم. قبلا این موضوع را، بررسی کردیم.
2) پیدا کردن شدت گرادیانت تصویر
بعد از صاف شدن تصویر، توسط فیلتر سوبل ،در هر دو جهت افقی و عمودی مشتق گرفته و فیلتر میشود.
از این دو تصویر، ما می توانیم گرادیانت(شیب) لبه و جهت هر پیکسل را به صورت زیر پیدا کنیم:
1) مفهموم تشخیص لبه ی Canny
2) اپن سی وی ، تابع cv2.Canny()
را به کار میگیرد.
〰〰〰〰〰〰〰〰〰〰
تشخیص لبه Canny، جزء محبوترین الگوریتم های تشخیص لبه است.
✅ این الگوریتم در چند مرحله انجام میشود.
1) کاهش نویز
از آنجایی که تشخیص لبه حساس به نویز، در تصویر است، اولین گام این است که نویز را در تصویر با یک فیلتر گاوسی 5x5 حذف کنیم. قبلا این موضوع را، بررسی کردیم.
2) پیدا کردن شدت گرادیانت تصویر
بعد از صاف شدن تصویر، توسط فیلتر سوبل ،در هر دو جهت افقی و عمودی مشتق گرفته و فیلتر میشود.
از این دو تصویر، ما می توانیم گرادیانت(شیب) لبه و جهت هر پیکسل را به صورت زیر پیدا کنیم:
python_developer
💢Canny Edge Detection💢
4.Non-maximum Suppression
پس از اندازه گیری و جهت شیب، یک اسکن کامل از تصویر برای حذف هر پیکسل ناخواسته که ممکن است لبه را تشکیل ندهد انجام می شود.
پس از اندازه گیری و جهت شیب، یک اسکن کامل از تصویر برای حذف هر پیکسل ناخواسته که ممکن است لبه را تشکیل ندهد انجام می شود.
5. Hysteresis Thresholding
این مرحله تصمیم می گیرد که کدام لبه ها واقعا لبه ها هستند و کدام نیستند.
برای این منظور، ما نیاز به دو مقدار آستانه، minVal و maxVal داریم.
✅هر لبه با گرادیان شدت بیش
از maxVal مطمئنا لبه میباشد.
وآنهاییکه زیر minVal هستند ، مطمئنا غیر لبه هستند، بنابراین دور انداخته میشوند.
آنهاییکه بین این دو آستانه می افتند، بر اساس اتصال آنها به لبه ها یا غیر لبه ها طبقه بندی می شوند. اگر آنها به پیکسل های "sure-edge" متصل شوند، آنها به عنوان بخشی از لبه ها در نظر گرفته می شوند. در غیر این صورت، آنها نیز دور انداخته می شوند. تصویر زیر را ببینید:
💢💢💢💢💢💢
این مرحله تصمیم می گیرد که کدام لبه ها واقعا لبه ها هستند و کدام نیستند.
برای این منظور، ما نیاز به دو مقدار آستانه، minVal و maxVal داریم.
✅هر لبه با گرادیان شدت بیش
از maxVal مطمئنا لبه میباشد.
وآنهاییکه زیر minVal هستند ، مطمئنا غیر لبه هستند، بنابراین دور انداخته میشوند.
آنهاییکه بین این دو آستانه می افتند، بر اساس اتصال آنها به لبه ها یا غیر لبه ها طبقه بندی می شوند. اگر آنها به پیکسل های "sure-edge" متصل شوند، آنها به عنوان بخشی از لبه ها در نظر گرفته می شوند. در غیر این صورت، آنها نیز دور انداخته می شوند. تصویر زیر را ببینید:
💢💢💢💢💢💢