مقدمه
الگوریتم های لبه یابی- انسان مي تواند بسیاري از اشیاء را از روي تصویر خطوط آنها شناسایي كند. بهترین مثال برای آن تصاویر کارتنی است. سیستم بینایي انسان قبل از بازشناسي رنگ یا شدت روشنایي نوعی كشف لبه انجام مي دهد. بنابراین انجام كشف لبه قبل از تفسیر تصاویر در سیستمهاي خودكار منطقي به نظر مي رسد. انجام عملیات كشف لبه پردازش مهمي در بسیاري از سیستمهاي بینایي مصنوعي محسوب مي شود. هدف اصلی لبه یابی کاهش حجم داده ها در تصویر به همراه حفظ ساختار و شکل اصلی تصویر است. مرزماند سایه یک واقعیت فیزیکی نیست و عبارت است از جایی که بخشی از تصویر شروع یا تمام میشود. لبه را میتوان به عنوان جایی که صفحات افقی و عمودی جسم به هم میرسند در نظر گرفت.
یکی از متداولترین اعمال در تحلیل تصویر تشخیص لبه می باشد به این دلیل که لبه مرز میان یک شی و زمینهء آن است به عبارت دیگر لبه تغییر دو سطح خاکستري یا مقادیر مربوط به روشنایی دو پیکسل مجاور است که در مکان خاصی از تصویر رخ می دهد.هر چه این تغییر در سطح بیشتر باشد تشخیص لبه ساده تر خواهد بود.
نقاطي از تصویر كه داراي تغییرات روشنایي ناگھاني ھستند اغلب لبه یا نقاط لبه نامیده مي شوند. نقاط لبه معمولا ً شامل مرزھاي اشیاء و دیگر انواع تغییرات روشنایي و ھمچنین لبه ھاي نویزي مي باشند.
انواع لبه:
انواع الگوریتم های لبه یابی
1- الگوریتم soble
این متد لبه ها را با استفاده از تخمین زدن مشتق پیدا می کند، که لبه ها را در آن نقاطی بر می گرداند که گرادیان تصویر I ، max است. در فیلتر سوبل دو ماسک به صورت زیر وجود دارد:
ماسک سوبل افقی بیشتر لبه هاي افقی را مشخص میکند و ماسک سوبل عمودي،لبه هاي عمودي را مشخص میکند.
براي مشخص شدن کلیه لبه ها:
اگر Gx و Gy تصاویر فیلتر شده به وسیله ماسک افقی و عمودي باشند، آنگاه تصویر لبه هاي تصویر را بهتر نشان میدهد. روال فوق به عملگر یا الگورریتم سوبل موسوم است.
در عمل، به منظور کاهش هزینه محاسبات، به جاي میتوان از تقریب [Gx] + [Gy] استفاده میشود. توجه شود که نتیجه این دو فرمول تقریبا یکسان است ولی فرمول دوم با هزینه کمتري قابل محاسبه است.
کد الگوریتم Sobel در Matlab:
clc; clear; close all; warning off; I=imread('lena.bmp'); I=im2double(I); I=imnoise(I, 'gaussian', 0, 0.001); figure(1); imshow(I);title('org img'); [height width R]=size(I); for i=2:height-1 for j=2:width-1 Dx(i,j)=[I(i+1,j-1)-I(i-1,j-1)]+2*[I(i+1,j)-I(i-1,j)]+[I(i+1,j+1)-I(i-1,j+1)]; Dy(i,j)=[I(i-1,j+1)-I(i-1,j-1)]+2*[I(i,j+1)-I(i,j-1)]+[I(i+1,j+1)-I(i+1,j-1)]; S(i,j)=sqrt(Dx(i,j)^2+Dy(i,j)^2); if Dx(i,j)<1 Dx(i,j)=0; else Dx(i,j)=1; end if Dy(i,j)<1 Dy(i,j)=0; else Dy(i,j)=1; end end end figure(2); imshow(Dx,[]); figure(3); imshow(Dy,[]); for i=1:255 for j=1:255 if (S(i,j)<1) S(i,j)=0; else S(i,j)=1; end end end
الگوریتم سوبل به زبان متلب
رمز فایل : behsanandish.com
2- الگوریتم Canny
لبه یاب کنی توسط جان اف کنی در سال 1986 ایجدداد شد و هنوز یک لبه یاب استاندارد و با دقت و کیفیت بالا میباشد.الگوریتم لبه یابی کنی یکی از بهترین لبه یابها تا به امروز است. این الگوریتم لبه یابی از سه بخش اصلی زیر تشکیل شده است:
- تضعیف نویز
- پیدا کردن نقاطی که بتوان آنها را به عنوان لبه در نظر گرفت
- حذب نقاطی که احتمال لبه بودن آنها کم است
معیارهایی که در لبه یا کنی مطرح است:
1 -پایین آوردن نرخ خطا- یعنی تا حد امکان هیچ لبه ای در تصویر نباید گم شود و هم چنین هیچ چیزی که لبه نیست نباید به جای لبه فرض شود. لبه هان پیدا شده تا حد ممکن به لبه ها اصلی
نزدیک باشند.
2 -لبه در مکان واقعی خود باشد- یعنی تا حد ممکن لبه ها کمترین فاصله را با مکان واقعی خود داشته باشند.
3 -بران هر لبه فقط یک پاسخ داشته باشیم.
4 -لبه ها کمترین ضخامت را داشته باشند- (در صورت امکان یک پیکسل).
لبه یاب کنی بخاطر توانایی در تولید لبه های نازک تا حد یک ییکسل برای لبه های پیوسته معروف شده است. این لبه یاب شامل چهار مرحله و چهار ورودی زیر است:
یک تصویر ورودی
یک پارامتر به نام سیگما جهت مقدار نرم کنندگی تصویر
یک حد آستانه بالا (Th)
یک حد آستانه پایین (Tl)
و مراحل شامل
1- در ابتدا باید تصویر رنگی را به جهت لبه یابی بهتر به یک تصویر سطح خاکسترن تبدیب کرد.
2- نویز را از تصویر دریافتی حذف کرد. بدلیل اینکه فیلتر گاوسین از یک ماسک ساده برای حذف نویز استفاده می کند لبه یاب کنی در مرحله اول برای حذف نویز آن را بکار میگیرد.
3- در یک تصویر سطح خاکستر جایی را که بیشترین تغییرات را داشته باشند به عنوان لبه در نظر گرفته می شوند و این مکانها با گرفتن گرادیان تصویر با استفاده عملگر سوبل بدست می آیند. سپس لبه های مات یافت شده به لبه های تیزتر تبدیل می شوند.
4- برخی از لبه های کشف شده واقعا لبه نیستند و در واقع نویز هستند که باید آنها توسط حد آستانه هیسترزیس فیلتر شوند.هیسترزیس از دو حد آستانه بالاتر (Th) و حد آستانه پایین تر (Tl) استفاده کرده و کنی پیشنهاد می کند که نسبت استانه بالا به پایین سه به یک باشد.
این روش بیشتر به کشف لبه های ضعیف به درستی می پردازد و کمتر فریب نویز را می خورد و از بقیه روش ها بهتر است.
clear; clc; close all; warning off; I=imread('siahosefid.bmp'); I=imnoise(I, 'gaussian', 0, 0.001); figure(1) imshow(I); A=filter2(fspecial('average',3),I)/255; figure(2) imshow(A); gauss_I=I; Isize=size(I); ans=zeros(size(I)); dir=zeros(size(I)); I=double(I); gauss_I=double(gauss_I); fx=0; fy=0; for i=2:Isize(1)-1 for j=2:Isize(2)-1 fx=gauss_I(i,j)+gauss_I(i,j+1)-gauss_I(i+1,j)-gauss_I(i+1,j+1); fy=gauss_I(i,j)+gauss_I(i+1,j)-gauss_I(i,j+1)-gauss_I(i+1,j+1); ans(i,j)=sqrt(fx*fx+fy*fy); dir(i,j)=atan(fy/fx); end end figure(3) imshow(ans) for i=2:Isize(1)-1 for j=2:Isize(2)-1 if dir(i,j)>=-pi/8 & dir(i,j)<pi/8</pre> <pre> if ans(i,j)<=ans(i,j-1) | ans(i,j)<=ans(i,j+1) ans(i,j)=0; end end if dir(i,j)>=pi/8 & dir(i,j)<3*pi/8 if ans(i,j)<=ans(i-1,j+1) | ans(i,j)<=ans(i+1,j-1) ans(i,j)=0; end end if dir(i,j)>=3*pi/8 | dir(i,j)<-3*pi/8 if ans(i,j)<=ans(i-1,j) | ans(i,j)<=ans(i+1,j) ans(i,j)=0; end end if dir(i,j)<-pi/8 & dir(i,j)>=3*pi/8 if ans(i,j)<=ans(i-1,j-1) | ans(i,j)<=ans(i+1,j+1) ans(i,j)=0; end end if ans(i,j)<40 ans(i,j)=0; else ans(i,j)=255; end end end figure(4) imshow(ans)
دانلود کد فوق از طریق لینک زیر:
رمز فایل : behsanandish.com
3- الگوریتم Roberts
این الگوریتم به نویز حساسیت زیادی دارد وپیکسل های کمتری را برای تقریب گرادیان بکار می برد،درضمن نسبت به الگوریتم canny هم قدرت کمتری دارد.
clc; clear; close all; warning off; I=imread('siahosefid.bmp'); I=imnoise(I, 'gaussian', 0, 0.001); I=im2double(I); figure(1); imshow(I); [height width R]=size(I); for i=2:height-1 for j=2:width-1 R(i,j)=abs(I(i+1,j+1)-I(i,j))+abs(I(i+1,j)-I(i,j+1)); Z(i,j)=abs(I(i+1,j+1)-I(i,j)); X(i,j)=abs(I(i+1,j)-I(i,j+1)); end end for i=1:height-1 for j=1:width-1 if (R(i,j)<0.25) R(i,j)=0; else R(i,j)=1; end if (Z(i,j)<0.25) Z(i,j)=0; else Z(i,j)=1; end if (X(i,j)<0.25) X(i,j)=0; else X(i,j)=1; end end end figure(2); imshow(Z,[]); figure(3); imshow(X,[]); figure(4); imshow(R,[]);
دانلود کد فوق از طریق لینک زیر:
Robert in Matlab
رمز فایل : behsanandish.com
4- الگوریتم Prewitt
این الگوریتم شباهت زیادی با الگوریتم sobel دارد با این تفاوت که ضرایب ماسک آنها با هم فرق می کند.
I=imread('siahosefid.bmp'); I=im2double(I); I=imnoise(I, 'gaussian', 0, 0.001); figure(1); imshow(I,[]); [height width R]=size(I); for i=2:height-1 for j=2:width-1 Dx(i,j)=[I(i+1,j-1)-I(i-1,j-1)]+[I(i+1,j)-I(i-1,j)]+[I(i+1,j+1)-I(i-1,j+1)]; Dy(i,j)=[I(i-1,j+1)-I(i-1,j-1)]+[I(i,j+1)-I(i,j-1)]+[I(i+1,j+1)-I(i+1,j-1)]; P(i,j)=sqrt(Dx(i,j)^2+Dy(i,j)^2); if Dx(i,j)<0.5 Dx(i,j)=0; else Dx(i,j)=1; end if Dy(i,j)<0.5 Dy(i,j)=0; else Dy(i,j)=1; end end end figure(2); imshow(Dx,[]); figure(3); imshow(Dy,[]); for i=1:height-1 for j=1:width-1 if (P(i,j)<0.5) P(i,j)=0; else P(i,j)=1; end end end figure(4); imshow(P,[]);
دانلود کد فوق از طریق لینک زیر:
Prewitt In Matlab
رمز فایل : behsanandish.com
5- الگوریتم Zerocross
این الگوریتم قسمت هایی از لاپلاس یک تصویر را جستجو می کند که مقدار لاپلاس از صفر می گذرد. به عبارت دیگر نقاطی که لاپلاس علامت را تغییر می دهد.
[BW,threshOut] =edge(graypic,'zerocross') [BW,threshOut] = edge(graypic,'zerocross',sensitive,filter name);
دانلود کد فوق از طریق لینک زیر:
Zerocross In Matlab
رمز فایل : behsanandish.com
6- الگوریتم LOG)Laplacian of gaussian)
لاپلاس یک اندازه گیری ایزوتروپیک دوبعدی از مشتق فضایی مرتبه دوم از یک تصویر است. لاپلاس یک تصویر، مناطق تغییرات شدت سریع را نشان می دهد و بنابراین اغلب برای تشخیص لبه استفاده می شود.
clc; clear; close all; warning off; f=imread('siahosefid.bmp'); %f=imnoise(f, 'gaussian', 0, 0.001); k=double(f); figure(1) imshow(f) [m,n]=size(f); k=[zeros(m,1) k zeros(m,1)]; k=[zeros(1,n+2);k;zeros(1,n+2)]; T=30; for i=2:m+1 for j=2:n+1 g(i,j)=k(i-1,j)+k(i+1,j)+k(i,j-1)+k(i,j+1)-4*k(i,j); end end for i=2:m+1 for j=2:n+1 if g(i,j)<T g(i,j)=0; else g(i,j)=1; end end end figure(2) imshow(g)
دانلود کد فوق از طریق لینک زیر:
LOG In Matlab
رمز فایل : behsanandish.com