بایگانی برچسب برای: Edge detection

مقدمه

الگوریتم های لبه یابی- انسان مي تواند بسیاري از اشیاء را از روي تصویر خطوط آنها شناسایي كند. بهترین مثال برای آن تصاویر کارتنی است. سیستم بینایي انسان قبل از بازشناسي رنگ یا شدت روشنایي نوعی كشف لبه انجام مي دهد. بنابراین انجام كشف لبه قبل از تفسیر تصاویر در سیستمهاي خودكار منطقي به نظر مي رسد. انجام عملیات كشف لبه پردازش مهمي در بسیاري از سیستمهاي بینایي مصنوعي محسوب مي شود. هدف اصلی لبه یابی کاهش حجم داده ها در تصویر به همراه حفظ ساختار و شکل اصلی تصویر است. مرزماند سایه یک واقعیت فیزیکی نیست و عبارت است از جایی که بخشی از تصویر شروع یا تمام میشود. لبه را میتوان به عنوان جایی که صفحات افقی و عمودی جسم به هم میرسند در نظر گرفت.

یکی از متداولترین اعمال در تحلیل تصویر تشخیص لبه می باشد به این دلیل که لبه مرز میان یک شی و زمینهء آن است به عبارت دیگر لبه تغییر دو سطح خاکستري یا مقادیر مربوط به روشنایی دو پیکسل مجاور است که در مکان خاصی از تصویر رخ می دهد.هر چه این تغییر در سطح بیشتر باشد تشخیص لبه ساده تر خواهد بود.

نقاطي از تصویر كه داراي تغییرات روشنایي ناگھاني ھستند اغلب لبه یا نقاط لبه نامیده مي شوند. نقاط لبه معمولا ً شامل مرزھاي اشیاء و دیگر انواع تغییرات روشنایي و ھمچنین لبه ھاي نویزي مي باشند.

انواع لبه:

انواع لبه در لبه یابی

انواع الگوریتم های لبه یابی

1- الگوریتم soble

این متد لبه ها را با استفاده از تخمین زدن مشتق پیدا می کند، که لبه ها را در آن نقاطی بر می گرداند که گرادیان تصویر I ، max است. در فیلتر سوبل دو ماسک به صورت زیر وجود دارد:

ماسک سوبل عمودی         ماسک سوبل افقی

ماسک سوبل افقی بیشتر لبه هاي افقی را مشخص میکند و ماسک سوبل عمودي،لبه هاي عمودي را مشخص میکند.

براي مشخص شدن کلیه لبه ها:
اگر Gو 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) استفاده کرده و کنی پیشنهاد می کند که نسبت استانه بالا به پایین سه به یک باشد.

 این روش بیشتر به کشف لبه های ضعیف به درستی می پردازد و کمتر فریب نویز را می خورد و از بقیه روش ها بهتر است.

 

الگوریتم Canny    عملکرد الگوریتم Canny

 

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 هم قدرت کمتری دارد.

 

الگوریتم Robertsعملکرد الگوریتم Roberts

 

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 دارد با این تفاوت که ضرایب ماسک آنها با هم فرق می کند.

 

الگوریتم Prewittعملکرد الگوریتم Prewitt

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

این الگوریتم قسمت هایی از لاپلاس یک تصویر را جستجو می کند که مقدار لاپلاس از صفر می گذرد. به عبارت دیگر نقاطی که لاپلاس علامت را تغییر می دهد.

 

الگوریتم Zerocrossعملکرد الگوریتم Zerocross

 

[BW,threshOut] =edge(graypic,'zerocross')
[BW,threshOut] = edge(graypic,'zerocross',sensitive,filter name);
sensitive -> حساسیت
بین 0 و 1 و حساس ترین حالت 0

 

دانلود کد فوق از طریق لینک زیر:

Zerocross In Matlab

رمز فایل : behsanandish.com

 


6- الگوریتم  LOG)Laplacian of gaussian)

لاپلاس یک اندازه گیری ایزوتروپیک دوبعدی از مشتق فضایی مرتبه دوم از یک تصویر است. لاپلاس یک تصویر، مناطق تغییرات شدت سریع را نشان می دهد و بنابراین اغلب برای تشخیص لبه استفاده می شود.

 

الگوریتم LOGعملکرد الگوریتم LOG-2

 

 

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

 

تشخیص لبه در تصاویر

آشکارسازی لبه یکی از مفاهیم پردازش تصاویر است. هدف آشکارسازی لبه نشان‌گذاری نقاطی از یک تصویر است که در آنها شدت روشنایی به تندی تغییر می‌کند. تغییرات تند در خصوصیات تصویر معمولاً نمایندهٔ رویدادهای مهم و تغییرات در خصوصیات محیط هستند. شناسایی لبه یک محدودهٔ تحقیقاتی در پردازش تصویر و استخراج ویژگی است.

ویژگی‌های لبه

لبه‌ها ممکن است وابسته به دیدگاه باشند – یعنی می‌توانند با تغییر نقطه دید تغییر کنند، و نوعاً هندسه صحنه، اجسامی که جلوی همدیگر را گرفته‌اند و مانند آن را نشان می‌دهند یا ممکن استنابسته به دیدگاه باشند – که معمولاً نمایانگر ویژگی‌های اجسام دیده‌شده همچون نشان‌گذاری‌ها و شکل سطح باشند. در دو بعد و بالاتر مفهوم تصویر باید در نظر گرفته شود.

یک لبه نوعی ممکن است(برای نمونه) مرز میان یک بخش قرمزرنگ و یک بخش سیاه‌رنگ باشد؛ حال آنکه یک خط می‌تواند تعداد کمی پیکسل‌های ناهمرنگ در یک زمینه یکنواخت باشد. در هر سوی خط یک لبه وجود خواهد داشت. لبه‌ها نقش مهمی در کاربردهای پردازش تصویر دارند.

آشکارسازی لبه

لبه مرز بین نواحی با خواص نسبتاً متفاوت سطح خاکستری است. نظریهٔ پایه در بیشتر روش‌های آشکارسازی لبه، محاسبه یک عملگر مشتق محلی است. در این مقطع توجه شود که لبه (گذر از تاریک به روشن) به صورت یک تغییر آرام، نه سریع، سطح خاکستری مدل می‌شود. این مدل نشان می‌دهد که معمولاً لبه‌های تصاویر رقمی بر اثر نمونه‌برداری، کمی مات می‌شوند. مشتق اول مقطع سطح خاکستری در لبه جلویی گذر، مثبت است، در لبه عقبی آن منفی است و همان طور که مورد انتظار است، در نواحی با سطح خاکستری ثابت صفر است. مشتق دوم برای قسمتی از گذر که در طرف تیره لبه است، مثبت است، برای قسمت دیگر گذر که در طرف روشن لبه است، منفی است، و در نواحی با سطح خاکستری ثابت، صفر است.

بنابراین، از بزرگی مشتق اول می‌توان برای تعیین این که آیا پیکسل در روی لبه قرار دارد، استفاده کرد. مشتق دوم در نقطه وسطی هر گذر سطح خاکستری یک عبور از صفر دارد. عبور از صفرها راهی قوی برای تعیین محل لبه‌های تصویر فراهم می‌آورند. اندازهٔ مشتق اول تصویر در هر نقطه برابر بزرگی گرادیان می باشد. مشتق دوم نیز با استفاده از لاپلاسین به دست می‌آید. اگر یک لبه را به عنوان تغییر در شدت روشنایی که در طول چند پیکسل دیده می‌شود در نظر بگیریم، الگوریتم‌های آشکارسازی لبه به طور کلی مشتقی از این تغییر شدت روشنایی را محاسبه می‌کنند. برای ساده‌سازی، به آشکارسازی لبه در یک بعد می‌پردازیم. در این نمونه، داده‌های ما می‌تواند یک تک‌خط از شدت روشنایی پیکسل‌ها باشد. برای نمونه بین پیکسل‌های چهارم و پنجم در داده‌های ۱-بعدی زیر به روشنی می‌توان لبه‌ای را آشکار کرد

 5  7  6  4  152  148  149

محاسبه مشتق اول

تعداد زیادی از عملگرهای آشکارسازی لبه بر پایه مشتق اول شدت روشنایی کار می‌کنند، یعنی با گرادیان شدت روشنایی داده‌های اصلی سروکار داریم. با این اطلاعات می‌توانیم تصویری را برای قله‌های گرادیان روشنایی جستجو کنیم.

اگر I(x) نماینده شدت روشنایی پیکسل x، و I′(x) نماینده مشتق اول(گرادیان شدت روشنایی) در پیکسل x باشد، بنابراین داریم:

{\displaystyle I'(x)=-1\cdot I(x-1)+0\cdot I(x)+1\cdot I(x+1).\,}

برای پردازش تصویر با عملکرد بهتر، مشتق اول را می‌توان(در یک بعد) با چرخاندن با ماسک زیر روی تصویر بدست آورد:

−1 0 1

محاسبهٔ مشتق دوم

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

اگر I(x) نمایشگر شدت نور در نقطه x و I′′(x) مشتق دوم در نقطه x باشد:

{\displaystyle I''(x)=1\cdot I(x-1)-2\cdot I(x)+1\cdot I(x+1).\,}

اینجا نیز بیشتر الگوریتم‌ها از یک ماسک پیچش برای پردازش سریع داده‌های تصویر سود می‌برند:

+1 −2 +1

آستانه‌گیری

پس از محاسبه مشتق، گام بعدی عبارت است از: اعمال‌کردن یک آستانه برای کشف نقاطی که بخشی از یک لبه هستند. هر چه آستانه کمتر باشد، خط‌های بیشتری آشکارسازی می‌گردند و نتایج بیشتر نسبت به نویز، و ویژگی‌های نامرتبط تصویر حساس می‌شوند، از سوی دیگر یک آستانه زیاد ممکن است خط‌های ضعیف یا بخش‌هایی از خط‌ها را از دست بدهد.

یک مصالحه معمول آستانه‌گیری با پسماند است. این روش از چندین آستانه برای جستن لبه‌ها سود می‌جوید. با آستانه بالایی جستجو را برای پیدا کردن ابتدای خط‌ها آغاز می‌کنیم. هنگامی که یک نقطه آغاز داریم، مسیر لبه را درون تصویر پیکسل به پیکسل با نشانه‌گذاری پیکسل‌هایی که از آستانه پایینی بالاترند پی می‌گیریم. تنها هنگامی که مقدار از آستانه پایینی پایین‌تر رود آن را پایان می‌دهیم. این رهیافت بر اساس این گمان است که لبه‌ها به احتمال زیاد در مسیرهای پیوسته قرار دارند و دنبال کردن بخش ضعیفی از لبه‌ای که از پیش دیده‌ایم ممکن می‌کند، بدون آنکه پیکسل‌های نویزی را به عنوان لبه نشانه‌گذاری کنیم.

عملگرهای آشکارسازی لبه

  • مرتبه نخست: رابرتز، پرویت، سوبل، کنی، اسپیسک
  • مرتبه دوم: لاپلاسی، مار-هیلدرث

اکنون، عملگر کنی و پس از آن مار-هیلدرث بیشترین کاربرد را دارد. عملگرهای زیادی تاکنون منتشر شده‌اند اما هیچیک برتری قابل ملاحظه‌ای بر عملگر کنی در شرایط کلی نداشته‌اند. کار بر روش‌های چندمقیاسی هنوز بیشتر در آزمایشگاه‌هاست.

اخیراً عملگر جدیدی منتشر شده که اجازه جداسازی لبه‌ها را با دقت زیرپیکسل می‌دهد، چیزی که آن را از عملگر کنی نیز بهتر می‌سازد. برای اطلاعات بیشتر مقاله زیر ببینید:

(استجر، ۱۹۹۸)An Unbiased Detector of Curvilinear Structure