مجله علمی تخصصی الکترونیک

پردازش تصویر

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

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

تصویر دیجیتالی چیست ؟
یک تصویر را می توان توسط تابع دوبعدی f(x,y) نشان داد که در آن X و Y را مختصات مکانی و مقدار f در هر نقطه را شدت روشنایی تصویر درآن نقطه می نامند. اصطلاح سطح خاکستری نیز به شدت روشنایی تصاویر مونوکروم اطلاق میشود . تصاویر رنگی نیز از تعدادی تصویر دوبعدی تشکیل می شود. زمانی که مقادیر X و Y و مقدار f(x,y) با مقادیر گسسته و محدود بیان شوند ، تصویر را یک تصویر دیجیتالی می نامند. دیجیتال کردن مقادیر X و Y را Sampling و دیجیتال کردن مقدار f(x,y) را quantization گویند. برای نمایش یک تصویر M * N از یک آرایه دو بعدی ( ماتریس) که M سطر و N ستون دارد استفاده می کنیم .
مقدار هر عنصر از آرایه نشان دهنده شدت روشنایی تصویر در آن نقطه است. هر عنصر آرایه یک مقدار 8 بیتی است که می تواند مقداری بین 0 و 255 داشته باشد. مقدار صفر نشان دهنده رنگ تیره ( سیاه ) و مقدار 255 نشان دهنده رنگ روشن ( سفید ) است.
به عنوان مثال تصویر روبرو که سایز آن 288 * 265 است از یک ماتریس که دارای 288 سطر و 265 ستون است برای نمایش تصویر استفاده می کند . هر پیکسل از این تصویر نیز مقداری بین 0 و 255 دارد . نقاط روشن مقادیری نزدیک به 255 و نقاط تیره مقادیر نزدیک به 0 دارد. همه توابع پردازش تصویر از این مقادیر استفاده کرده و اعمال لازم را بر روی تصویر انجام می دهند.

پردازش تصویر در MATLAB :
خواندن تصویر در محیط MATLAB با استفاده از تابع imread و نمایش آن توسط تابع imshow انجام می پذیرد. به عنوان مثال دستور زیر تصویر rice.png را خوانده و ماتریس مربوط به تصویر را در اختیار ما قرار می دهد(در مثال زیر این ماتریس با نام im مشخص شده است). مقدار هر عنصر در این ماتریس شدت روشنایی تصویر در آن نقطه را نشان می دهد :
 
خاکستری (Grayscale) کردن تصویر
در رایج ترین مدل رنگ گرافیک کامیوتری، رنگ ها از ترکیب سه رنگ قرمز، سبز و آبی به وجود می آیند که در مجموع 16581375 رنگ متفاوت توسط این سه مولفه می توان تولید کرد. این مدل رنگ در گرافیک کامپیوتری با نام RGB شناخته می شود. در کنار مدل رنگ RGB مدل های دیگری همچون CMYK ، HSI ، HSV و Grayscale نیز وجود دارد که هریک از آن ها به روش متفاوتی به نمایش رنگ ها می پردازند. در این بین مدل رنگ Grayscale از اهمیت ویژه ای برای ما برخوردار است. چرا که در بیشتر کاربردها نیازی به یک تصویر رنگی نمی باشد و داشتن تنها یک تصویر خاکستری کافی خواهد بود. در میان عموم ، تصویر خاکستری با نام تصویر سیاه و سفید شناخته می شود (البته استفاده از نام سیاه سفید به جای خاکستری اشتباه است و در اینجا فقط برای روشن تر شدن مطلب از این نام استفاده کرده ایم)

یک تصویر RGB متشکل از سه ماتریس است که هریک از آنها مقادیر Red ( قرمز ) ، Green ( سبز ) و Blue ( آبی ) تصویر رنگی را نگه می دارند. نمایش تصویر بر روی صفحه نمایش نیز از ترکیب مقادیر درآیه های متناظر در سه ماتریس انجام می پذیرد. همانطور که در ابتدا یادآور شدیم ، در بیشتر کاربردها نیازی به تصویر رنگی نداریم و استفاده از یک تصویر خاکستری کافی خواهد بود. یک پیکسل زمانی مقدار خاکستری خواهد داشت که مولفه های R ، G و B آن مقادیر یکسانی داشته باشند. با توجه به این تعریف، در مواردی که تصویر ورودی یک تصویر RGB است، برای Grayscale کردن آن از فرمول زیر می توانیم استفاده می کنیم :

                                      S_R(x, y) = S_G(x, y) = S_B(x, y) = [R(x, y) + G(x, y) + B(x, y)] / 3

در این فرمول S_X مولفه های تصویر خروجی و R ، G و B هر یک به تریبب ماتریس مولفه های سبز قرمز و آبی تصویر ورودی می باشند. شبه کد زیر نحوه Grayscale کردن یک تصویر RGB با سایز M * N را نشان می دهد :
Procedure Grayscale( output , input As Bitmap )
Begin
  For I = 1 to M Do
    For J = 1 To N Do
      Temp = ( input.R( I,J ) + input.G( I,J ) + input.B( I,J ) ) / 3
      Output.R ( I,J ) = Temp
      Output.G ( I,J ) = Temp
      Output.B ( I,J ) = Temp
    End For
  End For
End

شکل زیر یک تصویر RGB را به همراه تصویر خاکستری آن نشان می دهد :
 
 
از آنجا که مقادیر ماتریس های R , G , B پس از Grayscale کردن تصویر باهم برابر هستند ، بنابراین می توان تنها از یک ماتریس برای نشان دادن مقادیر استفاده کرد. در الگوریتم های بعدی که برای پردازش تصویر ارائه خواهند شد از تصاویر Grayscale استفاده خواهیم کرد . بنابراین عملیات نیز بر روی تنها یک ماتریس انجام خواهد پذیرفت.

پردازش تصویر در MATLAB :
برای خاکستری کردن یک تصویر RGB می توان از تابع rgb2gray استفاده کرد. به عنوان مثال تکه کد زیر یک تصویر رنگی را خوانده و آن را به تصویر خاکستری تبدیل می کند:
 
>> im = imread('onion.png');
>> imshow(im);
>> imGray = rgb2gray(im);
>> imshow(imGray);
تفریق دو تصویر
تفریق دو تصویر هم اندازه بدین مفهوم است که شدت روشنایی پیکسل های متناظر دو تصویر را از هم کم کنیم . فرض کنید می خواهیم تغییرات مغز افرادی را بررسی کنیم که دچار بیماری آلزایمر هستند. برای این منظور می توانیم تصویری از یک مغز سالم را در مراحل مختلف با تصویر مغز فردی که دچار بیماری آلزایمر است ، مقایسه کنیم . با اعمال عملگر فوق بر روی دو تصویر مذکور نقاطی از مغز که در آن نقاط مغر دچار تغییر شده است مشخص می شوند .  تصویر زیر عکس اسکن PET مغز نرمال و بیمار را  به همراه حاصل تفریق آن ها نشان می دهد :
 
تصویر نویزدار تصویر نویزدار تصویر بدون نویز

 شبه کد زیر نحوه پیاده سازی عملگر تفریق را نشان می دهد :
 
Procedure Subtract (image1, image2 : Byte[][])
Begin
  result :Byte[][]
  sub:integer
  For i = 1 To Height Do
    For j = 1 To Width Do
      sub = image1[i, j] - image2[i, j]
      result[i, j] = sub < 0 ? 0 : sub
    End For
  End For
  Return result
End

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

پردازش تصویر در MATLAB :
برای تفریق دو تصویر هم اندازه از تابع imsubtract در MATLAB می توان استفاده کرد. به عنوان مثال مجموعه دستورات زیر دو تصویر را خوانده و حاصل تفریق آن ها را نشان می دهد.
 
>> im = imread('rice.png');
>> imshow(im);
>> imBack = imread('background.png');
>> imshow(imBack);
>> res = imsubtract(im,imBack);

>> im = imread('rice.png');
>> imshow(im);
جمع دو تصویر
جمع دو تصویر بدین مفهموم است که در دوتصویر ، شدت روشنایی پیکسل های متناظر دو تصویر را از باهم جمع کنیم . تصاویر زیر نتیجه اعمال عملگر جمع را نشان می دهند: 
حاصل جمع دو تصویر تصویر دوم تصویر اول

 شبه کد زیر نحوه پیاده سازی عملگر جمع را نشان می دهد :
 
Procedure Add (image1, image2 : Byte[][])
Begin
  result :Byte[][]
  sub:integer
  For i = 1 To Height Do
    For j = 1 To Width Do
      sub = image1[i, j] + image2[i, j]
      result[i, j] = sub > 255 ? 255 : sub
    End For
  End For
  Return result
End

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

پردازش تصویر در MATLAB :
برای تفریق دو تصویر هم اندازه از تابع imadd در MATLAB می توان استفاده کرد. به عنوان مثال مجموعه دستورات زیر دو تصویر را خوانده و حاصل جمع آن ها را نشان می دهد.
>> im = imread('rice.png');
>> imshow(im);
>> imBack = imread('background.png');
>> imshow(imBack);
>> res = imadd(im,imBack);

 

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

 شبه کد زیر نحوه پیاده سازی عملگر میانگین را نشان می دهد :
 
Procedure Average( bmp1 , bmp2 :Image)
Begin
  Result:Image
  For 1 To Height Do
    For 1 To Width Do
      Result.Pixels[ i , j] = ( bmp1.Pixels[ i , j ] + bmp2.Pixels[ i , j ] ) /2
    End For
  End For
End

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

پردازش تصویر در MATLAB :
برای میانگین گیری از تصویر در محیط MALTAB به صورت زیر می توان عمل کرد :
 
>> im = imread('cameraman.tif');
>> imshow(im);
>> im1 = imread('rice.png');
>> imshow(im1);
>> imAvg = imadd(im,im1) ./ 2;
>> imshow(imAvg);

هیستوگرام تصویر
هیستوگرام تصویر نموداری است که توسط آن تعداد پیکسل های هر سطح روشنایی در تصویر ورودی مشخص می شود. فرض کنید تصویر ورودی یک تصویر Grayscale با 256 سطح روشنایی باشد ، بنابراین هریک از پیکسل های تصویر مقداری در بازه [255...0] می توانند داشته باشند.

برای به دست آوردن هیستوگرام تصویر ،کافی است با پیمایش کل پیکسل های تصویر ، تعداد پیکسل های هر سطح روشنایی را محاسبه می کنیم . هیستوگرام نرمال نیز از تقسیم کردن مقادیر هیستوگرام به تعداد کل پیکسل های تصویر به دست می آید. نرمال سازی هیستوگرام موجب می شود که مقادیر هیستوگرام در بازه [0,1] قرار گیرند. شکل روبرو تصویری را به همراه هیستوگرام نرمال آن نشان می دهد .

یکی از کاربـردهـای هیستوگرام در فوکوس خودکـار دوربین های دیجیتالی است. بـدین صورت 

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

تعدیل هیستوگرام
یکی دیگر از کاربردهای هیستورگرام در افزایش کنتراست تصاویر با کنتراست پایین است. زمانی که می گوییم کنتراست تصویری کم است این بدان معنا است که اختلاف بین کمترین و بیشتری شدت روشنایی تصویر کم است. هم تعدیل سازی هیستوگرام موجب می شود که کنتراست تصویر ورودی تا حد ممکن افزایش یابد.  به عنوان مثال شکل زیر تصویری را قبل و بعد از تعدیل سازی هیستوگرام نشان می دهد:
 
تصویر خروجی پس از تعدیل هیستوگرام تصویر ورودی و هیستوگرام آن

الگوریتم زیر روش تعدیل سازی هیستوگرام را نشان می دهد :
     1 ) هیستوگرام تصویر را محاسبه می کنیم. فرض کنید مقادیر هیستوگرام در آرایه hist قرار گیرد.
     2 ) با استفاده از فرمول زیر فراوانی هیستوگرام را محاسبه می کنیم :
                                histCum[ i ] = histCum[ i-1 ] + hist[ i ]
      3 ) از فرمول زیر استفاده کرده و هیستوگرام تعدیل شده را محاسبه می کنیم :
                                eqHist[i] = Truncate( [(L * histCum[i]) – N]/N )
      4 ) در مرحله نهایی مقادیر جدید پیکسل ها را به صورت زیر مقدار دهی می کنیم :
                                Result[ i , j ] = eqHist[ input[ i , j ] ]
 
که در این فرمول L تعداد سطوح خاکستری و N تعداد کل پیکسل ها، Result تصویر خروجی و input تصویر ورودی را نشان می دهند.

پردازش تصویر در MATLAB
تعدیل سازی هیستوگرام در MATLAB با استفاده از تابع histeq و به شکل زیر انجام می پذیرد :
 
>> I = imread('tire.tif');
>> J = histeq(I);
>> figure, imshow(I), figure, imshow(J);

ارتقای تصویر و عملگر کانولوشن
ارتقای تصویر در دو حوزه مکانی و فرکانسی انجام می پذیرد که در حوزه مکانی با استفاده از مقادیر پیکسل های همسایه و در حوزه فرکانسی توسط بسط فوریه تصویر دیجیتالی ، تصویر ارتقا می یابد. در این بخش ارتقای تصویر در حوزه مکانی را مورد بررسی قرار می دهیم. علاوه برای روش های ریاضی همانند ضرب کردن تصویر در عدد ثابت، لگاریتم گیری و اعمال مشابه دیگر که برای ارتقای می توان انجام داد، ارتقای تصویر در حوزه مکانی با استفاده از رابطه زیر انجام می گیرد :
s = convolution( r, w )
که در آن s تصویر ارتقا یافته ، r تصویر ورودی و convolution تایعی است که بر روی تصویر ورودی اعمال می شود. w نیز یک ماسک n * m است که باید بر روی همه پیکسل های تصویر اعمال می شود. شکل زیر تصویر یک نمونه از ماسک اعمالی بر روی تصویر ورودی در نقطه ( x , y ) را نشان می دهد.

در واقع ماسک را می توان پنجره ای در نظر گرفت که بر روی تک تک پیکسل های تصویر حرکت کرده و در هر نقطه با توجه به مقادیر ماسک، مقدار شدت روشنایی پیکسل مرکزی ( نقطه ( x , y ) در شکل ) در تصویر خروجی محاسبه می شود. البته مقادیری که در ماسک قرار می گیرند، ضرایبی می باشند که نشان می دهند هر یک از پیکسل های همسایه تا چه حد در تعیین مقدار شدت روشنایی پیکسل مرکزی تاثیر گذارند. 
برای محاسبه مقدار پیکسل تصویر خروجی در نقطه ( x , y ) با استفاده از یک ماسک 3 * 3 از فرمول زیر استفاده می کنیم ( w ماتریس 3 * 3ماسک و f ماتریس M * N تصویر است ):
 
G( x , y ) = w(x-1,y-1 ) * f( x-1 , y-1 ) + w( x-1 , y ) * f( x-1 , y ) + w( x-1 , y+1 ) * f( x-1 , y+1 ) + w( x , y-1 ) * f( x , y-1 ) + w( x , y ) * f( x , y ) + w( x , y+1 ) * f( x , y+1 ) + w( x+1 , y-1 ) * f( x+1 , y-1 ) + w( x+1 , y ) * f( x+1 , y ) + w( x+1 , y+1 ) * f( x+1 , y+1 )

در این رابطه w مقدار ماسک در نقطه ( m , n ) و همچنین f مقدار پیکسل تصویر در نقطه ( i , j ) و g مقدار پیکسل تصویر خروجی در نقطه ( i , j ) را نشان می دهند . با حرکت دادن ماسک بر روی تصویر و محاسبه مقدار هریک از پیکسل ها با استفاده از فرمول یاد شده ، تصویر خروجی حاصل می شود. پس در یک تعریف کلی می توان چنین گفت که حرکت دادن پیکسل به پیکسل ماسک بر روی تصویر برای تولید تصویر خروجی را کانولوشن می نامیم ( توجه داشته باشید که این ساده ترین شکل تعریف عمل کانولوشن می باشد ). عمل کانولوشن به طور معمول برای فیلترکردن تصویر به کار می رود. حال این سوال مطرح می شود که منظور از فیلتر کردن تصویر چیست؟  در مقاله بعدی به بررسی این مفهوم پرداخته ایم.

فیلتر کردن تصویر
در کل پیکسل های تصویر را به دوسته می توان تقسیم کرد: 1) پیکسل های تیز و 2) پیکسل های آرام. به عنوان مثال شکل زیر را در نظر بگیرید:
پیکسل های زیر ناحیه های قرمز در این تصویر را در دسته پیکسل های تیز قرار می دهیم. پیکسل هایی از تصویر را که اختلاف شدت روشنایی آنها ( مقدار پیکسل ) با پیکسل های همسایه خود زیاد باشند، پیکسل های تیز می نامیم. پیکسل های تیز معمولا یا نشان دهنده لبه های اشیای موجود در تصویر هستند یا نشان دهنده نویزهای یک تصویر هستند و در حالت کلی می توان گفت که جزئیات تصویر با
استفاده از پیکسل های تیز استخراج می شوند. به عنوان مثال، تصاویری که هنگام شب توسط موبایل یا یک وب کم گرفته می شوند، دارای نویز معروف فلفل-نمکی هستند. تصویر زیر گویای این مطلب است:
 

در مقابل پیکسل های تیز، پیکسل های آرام تصویر قرار دارند ( ناحیه های آبی رنگ در مثال فوق ). پیکسل هایی از تصویر که اختلاف شدت روشنایی آنها با پیکسل های همجوار خود کم است، پیکسل های آرام تصویر می نامیم. حال با توجه به این مطالب به شرح فیلتر کردن تصویر می پردازیم. در حوزه مکانی فیلترها به دسته تقسیم می شوند:  1) فیلترهای آرام کننده  2)فیلترهای تیزکننده
فیلترهای آرام کننده با اعمال تغییر در شدت روشنایی پیکسل های تیز تصویر موجب تولید تصاویر آرام تری می شود. همچنین این فیلترها تاثیر چندانی بر روی پیکسل های آرام تصویر نمی گذارند. آرام شدن تصویر بدین معنی است که بخشی از جزئیات تصویر از بین می رود. به عنوان مثال اعمال یک فیلتر آرام کننده بر روی یک تصویر نویزدار موجب کاهش شدت نویزها خواهد شد. یک مثال کاربردی ساده از فیلتر های آرام کننده را می توان حذف چین و چروک ها از تصاویر صورت بیان کرد (قابل توجه دختر خانما ;-) ) .  تصاویر روبرو گویای این مطلب هستند.

ساده ترین فیلترهای آرام کننده تصویر فیلترهای میانگین هستند. یک فیلتر میانگین m*n، ماسکی است که مقدار هریک از عناصر آن برابر با عدد 1/(m.n) است. به عبارت دیگر مقدار هر پیکسل در تصویر خروجی برابر است با میانگین مقدار شدت روشنایی پیکسل جاری و پیکسل های همسایه پیکسل جاری. برای آرام کردن تصویر فوق از یک فیلتر میانگین 3*3 استفاده کرده ایم که هریک از عناصر این فیلتر دارای مقداری برابر با 1/9 هستند.  سپس با استفاده از کانولوشن این فیلتر را بر وی تصویر بالا اعمال
کرده و تصویر پایین را تولید کرده ایم. برخلاف فیلترهای آرام کننده، فیلترهای تیز کننده با اعمال تغییر بر روی پیکسل های آرام تصویر موجب استحراج جزئیات بیشتری از تصویر می شوند. در برخی موارد می بینیم که تصویر داری حالتی بلور مانند است ( جزئیات نمایان نیستند) . در چنین مواردی برای حذف خاصیت بلوری، از فیلترهای تیز کننده تصویر استفاده می کنیم:
تصویر تیز شده تصویر اصلی

در شکل فوق برای افزایش جزئیات تصویر و به دست آوردن تصویر واضح تر، فیلتر تیز کننده ای را بر روی تصویر سمت چپ اعمال کرده و تصویر سمت راست را تولید کرده ایم.

پردازش تصویر در MATLAB
اعمال فیلتر در محیط MATLAB با استفاده از دستور imfilter انجام می پذیرد. این تابع ، فیلتر مورد نظر را بر روی تصویر مشخص شده در دیگر پارامتر تابع اعمال کرده و نتیجه را به صورت ماتریسی بر می گرداند. مجموعه دستورات زیر آرام کردن ( بلور کردن ) تصویر را با استفاده از تابع imfilter نشان می دهند.
>> im = imread('rice.png');
>> filter = ones(3,3) .* 0.11;
>> imFilt = imfilter(im,filter);
>> imshow(im),figure,imshow(imFilt);
فیلترهای آرام کننده حوزه مکانی
برای انجام تبدیلات در هر دو حوزه مکانی از فیلترها استفاده می کنیم .فیلترها در به دو دسته تقسیم می شوند:
     • فیلترهای پایین گذر ( Low Pass Filter ) : که با عبور از پیکسل های با فرکانس کم ، بر روی پیکسل های با فرکانس بالا تغییرات ایجاد می کنند.
     • فیلترهای بالاگذر ( High Pass Filter ) : که با عبور از پیکسل های با فرکانس بالا ، بر روی پیکسل های با فرکانس پایین تغییرات ایجاد می کنند.

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

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

فیلترهای پایین گذر میانگین:
ساده ترین نوع فیلترهای پایین گذر فیلترهای میانگین می باشند. یک فیلتر میانگین m * n شامل ضرایبی مثبت می باشند که همه این ضرایب بر عکس مجموع کل ضرایب فیلتر ضرب می شوند به عبارت دیگر همه عناصر ماسک مقداری برابر با 1/mn خواهند داشت. به عنوان مثال یک فیلتر میانگین 3 * 3 به صورت زیر مشخص می شود:

تصویر آرام شده مذکور با استفاده از همین ماسک صورت گرفته است. برای بلور کردن بیشتر تصویر از ماسک های بزرگتری با سایز m * n باید استفاده کرد که مقادیر همه عناصر ماسک برابر با مقدار 1/mn خواهد بود. بدیهی است هرچه اندازه ماسک بزرگتر باشد ، زمان بیشتری برای پردازش تصویر نیاز خواهد بود. به نظر شما از نظر محاسباتی 2 بار کانولوت کردن ماسک 3*3 زمان بیشتری را مطلبد یا اعمال کردن 1 بار ماسک 5*5 ؟ در زیر فیلتر آرام کننده دیگری که به فیلتر پایین گذر گاوس ( Gaussian ) مشهور است ، نمایش داده شده است :

شبه کد زیر نحوه تولید فیلتر آرام کننده گاوسین را نشان می دهد :
Function Gaussian( maskWidth, maskHeight )
Begin
  filter = double[maskHeight, maskWidth]
  For I = 1 to maskWidth Do
    For J = 1 To maskHeight Do
      filter[J,I] = g(I,J)
    End For
  End For
  Return filter
End

همانند  دیگر فیلترهای حوزه مکانی ، فیلتر گاوسین نیز  با استفاده از عملگر کانولوشن بر روی تصویر اعمال می شود.

فیلتر میانه ( Median )
فیلتر پایین گذر دیگری که نسبت به فیلترهای دیگر به زمان پردازش بیشتری نیاز دارد ، فیلتر میانه است. فیلتر پایین گذر میانه از یک همسایگی m * n استفاده می کند و روش کار آن نیز به این صورت است که کل همسایگی ها را به صورت صعودی مرتب کرده و عنصر وسط اعداد مرتب شده را انتخاب و جایگزین پیکسل مرکزی می کند. لازم به ذکر است که فیلتر پایین گذر میانه برای حذف نویز فلفل نمکی ( Salt & Pepper ) می تواند مورد استفاده قرار گیرد. شکل زیر تصویر نویزداری ( نویز فلفل نمکی ) را نشان می دهد که با استفاده از فبلتر میانه ارتقا یافته است:
 
نتیجه اعمال فیلتر میانه تصویر اصلی
 
  در مقاله بعدی نیز به معرفی برخی از فیلترهای تیزکننده پرکاربرد در پردازش تصویر اشاره  کرده ایم.
 
فیلترهای تیز کننده حوزه مکانی
برای انجام تبدیلات در هر دو حوزه مکانی از فیلترها استفاده می کنیم .فیلترها در به دو دسته تقسیم می شوند:
     • فیلترهای پایین گذر ( Low Pass Filter ) : که با عبور از پیکسل های با فرکانس کم ، بر روی پیکسل های با فرکانس بالا تغییرات ایجاد می کنند.
     • فیلترهای بالاگذر ( High Pass Filter ) : که با عبور از پیکسل های با فرکانس بالا ، بر روی پیکسل های با فرکانس پایین تغییرات ایجاد می کنند.

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

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

فیلتر تیرکننده :
همانطور که بررسی کردیم ، فیلترهای تیز کننده برای نمایان کردن بیشتر جزئیات تصویر به کار می روند. ساده ترین فیلتر تیزکننده یک ماسک 3*3 است که مقادیر آن به صورت زیر تعیین می گردند:

فیلترهای تیز کننده لاپلاسین دو نوع فیلتر تیزکننده دیگر نیز وجود دارد که از آن ها می توان برای تیز کردن تصاویر استفاده کرد. این فیلتر ها که آن ها را فیلترهای لاپلاسین ترکیبی می نامیم به صورت زیر هستند:
فیلتر تیزکننده لاپلاس 1 فیلتر تیزکننده لاپلاس 2

فیلترهای تیزکننده لاپلاس نسبت به روش اول جزئیات بیشتری از تصویر را مشخص می کنند. به عنوان مثال تصاویر زیر نتیجه اعمال فیلترهای تیزکننده مذکور را نشان می دهند:
   
  تصویر اصلی  
فیلتر تیزکننده اول لاپلاس ترکیبی 1 لاپلاس ترکیبی 2
 
شکل شناسی  - عملگرهای مجموعه ای
یکی از مهمترین مراحل در پیش پردازش تصویر ، پردازش شکل شناسی می باشد. در این قسمت تنها به بررسی شکل شناسی برای تصاویر دودویی خواهیم پرداخت. منظور از تصاویر دودویی ، تصاویر با دو سطح روشنایی 0 یا 1 می باشد که در آن منظور از 0 رنگ سیاه و منظور از 1 رنگ سفید می باشد.

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

عملگرهای مجموعه ای پایه :
این عملگر ها شامل عملگر اجتماع ، اشتراک ، تفاضل دو مجموعه می باشد. اگر هر تصویر باینری را یک مجموعه در نظر بگیریم ، اجتماع دو تصویر باینری هم اندازه ، همانطور که در شکل روبرو مشاهده می کنید تصویری خواهد بود که در این تصویر هر
پیکسلی که در تصویر اول یا تصویر دوم مقدار 1 داشته باشد ، مقدار 1 خواهد داشت. برای پیاده سازی عملگر اجتماع برای دو تصویر باینری ، می توانیم پیکسل های متناظر را در دو تصویر باهم ORبیتی کنیم.
اشتراک دو تصویر باینری هم اندازه ، نیز تصویری خواهد بود که در این تصویر هر پیکسلی که در تصویر اول و دوم مقدار 1 داشته باشد ، مقدار 1 خواهد داشت. برای پیاده سازی عملگر اشتراک برای دو تصویر باینری ، می توانیم پیکسل های متناظر را در دو تصویر باهم ANDبیتی کنیم.
تفاضل دو تصویر باینری هم اندازه ، تصویری خواهد بود که در این تصویر پیکسل هایی از تصویر اول با مقدار 1 که در تصویر دوم مقدارشان 1 نباشد ، مقدار 1 خواهند داشت. تفاضل را به شکل اشتراک تصویر دوم و مکمل تصویر اول نیز می توان تعریف کرد.
   
همچنین عملگر تک عملوندی مکمل نیز عملگری است که پس از اعمال آن بر روی تصویر باینری ، در تصویر حاصل شده ، مقادیر 1 به 0 و مقادیر 0 به 1 تغییر می یابند. برای پیاده سازی عملگر مکمل می توانیم هر پیکسل از تصویر بانری را NOT بیتی کنیم .
 
 
گسترش باینری مورفولوژیکی
همانطور که از نام عملگر پیداست ، این عملگر باعث گسترش نقاط 1 در تصویر می شود. در عملگر گسترش نیز از یک ماسک ( نفاب ، پنجره ) - همانند آنچه که در "تعریف عمل فیلتر کردن" هست – استفاده می کنیم. در اینجا به جای ماسک به آن عنصر ساختمانی می گوییم که مقادیر عنصر ساختمانی 1 یا صفر می تواند باشد. گسترش تصویر A با عنصر ساختمانی B به صورت زیر تعریف می شود:

              

که در اینجا reflection عنصر ساختمانی B را حول مرکز خود قرینه می کند. به عبارت دیگر گسترش A با عنصر ساختمانی B بدین معنی است که اگر عنصر ساختمانی B را بر روی پیکسل های A حرکت دهیم ، و در هربار حرکت اشتراک عنصر ساختمانی با محدوده زیر عنصر ساختمانی در تصویر A تهی نباشد ، مقدار پیکسل مرکزی که عنصر ساختمانی بر روی آن قرار گرفته است ، برابر 1 خواهد شد. شکل روبور خروجی تصویری را پس از گسترش تصویر با عنصر ساختمانی 3*3 تمام 1 نشان می دهد.

پردازش تصویر در MATLAB
تصویر اصلی
حاصل گسترش تصویر

اعمال عملگر مورفولوژیکی گسترش در محیط MATLAB با استفاده تابع imdilate انجام می پذیرد.
>> BW1 = imread('circbw.tif');
>> SE = strel('rectangle',[5 5]);
>> BW2 = imdilate(BW1,SE);
>> imshow(BW1),figure,imshow(BW2)
سایش باینری مورفولوژیکی
همانطور که از نام عملگر پیداست ، این عملگر باعث سایش نقاط 1 در تصویر می شود. همانند عملگر گسترش ، درعملگر سایش نیز از یک عنصر ساختمانی استفاده می کنیم که مقادیر عنصر ساختمانی 1 یا صفر می تواند باشد. به ازای هر پیکسل ، مرکز عنصر ساختمانی را روی پیکسل قرار داده و عملگر سایش را با توجه به مقادیر عنصر ساختمانی در مورد آن پیکسل اعمال می کنیم. سایش تصویر A با عنصر ساختمانی B به صورت زیر تعریف می شود:

                       

به عبارت دیگر گسترش A با عنصر ساختمانی B بدین معنی است که اگر عنصر ساختمانی B را بر روی پیکسل های A حرکت دهیم ، و در هربار حرکت همه نقاطی که در زیر مقادیر 1 از عنصر ساختمانی قرار گرفته اند نیز ، مقدار یک داشته باشند ، مقدار پیکسل حاصل نیز 1 خواهد بود. شکل روبرو خروجی تصویر را پس از سایش تصویر با عنصر ساختمانی 3*3 تمام 1 نشان می دهد.

پردازش تصویر در MATLAB
تصویر اصلی
حاصل گسترش تصویر
اعمال عملگر مورفولوژیکی سایش در محیط MATLAB با استفاده تابع imerode انجام می پذیرد.
>> BW1 = imread('circbw.tif');
>> SE = strel('rectangle',[5 5]);
>> BW2 = imerode(BW1,SE);
>> imshow(BW1),figure,imshow(BW2)

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

در حالت کلی الگوریتم های استخراج اسکلت الگو بر پایه دو استراتژی مختلف هستند.


در استراتزی اول از همه پیکسل های تصویر و در استراتژی دوم از پیکسل های کانتور تصویر برای این منظور استفاده می شود. روشی که ما در اینجا بررسی خواهیم کرد روش مبتنی بر پیکسل های تصویر بوده و به نام Hilditch معروف است که بر روی تصاویر دو سطحی ( باینری ) اعمال می کنیم.

تعاریف اولیه :
همسایه های هشتگانه پیسکل P1 را در نظر بگیرید : 

هدف این است که در مورد حذف پیکسل P1 یا ماندن آن به عنوان یک پیکسل بر روی اسکلت تصمیم بگیریم. برای این منظور همسایه های هشتگانه آن را در جهت عقربه های ساعت مرتب کرده و دو تابع زیر را برای P1 تعریف می کنیم :
     • تابع  B: تعداد همسایه های غیرصفر P1 را برمی گرداند.
    • تابع A : تعداد الگوهای 1،0 در لیست P2,P3,P4,P5,P6,P7,P8,P9,P2 را بر می گرداند. الگوی 0,1 بدین معنی است که با در نظر گرفتن دو همسایه پشت سرهم مثل P6 و P7، مقدار P6 صفر بوده و P7 مقدار 1 داشته باشد. به عنوان مثال :
 

الگوریتم اسکلت بندی :
الگوریتم Hilditch از یک پنجره 3*3 استفاده کرده و تازمانی تغییری در تصویر به وجود آید، به طور مداوم همه پیکسل های تصویر را بررسی می کند و به ازای هر پیکسل در صورتی که چهار شرط زیر برقرار شود، پیکسل جاری از تصویر حذف می گردد :
 

شبه کد زیر نحوه اعمال این الگوریتم را نشان می دهد :
     1. تازمانی که تغییر دیگری حاصل نشود :
           a. کل تصویر پیمایش شده و پیکسل هایی که هر چهار شرط فوق برای آنها صادق باشد کاندیدای حذف شدن می شوند.
           b. پیکسل های کاندیدای حذف شدن ، از تصویر حذف می شوند

تتوجه داشته باشید که الگوریتم Hilditch الگوریتم کاملی نمی باشد چرا که بر روی برخی از انواع الگوها به درستی عمل نمی کند. به عنوان مثال الگوریتم Hilditch باعث ساییده شدن کامل الگوهای زیر می شود :
 

در زیر اسکلت استخراج شده برای تعدادی تصویر با استفاده از الگوریتم Hilditch نشان داده شده است :/tr>

پردازش تصویر در MATLAB
استخراج اسکلت تصویر در MATLAB با استفاده از تابع bwmorph انجام می پذیرد.
>> BW1 = imread('circbw.tif');
>> BW2 = bwmorph(BW1,'skel',Inf);
>> imshow(BW1),figure, imshow(BW2)

منابع:‌‌‌‌‌‌‌‌‌‌‌‌image processing

Tom Grimm, Michele Grimm

 Rafael C. Gonzalez, Steven L. Eddins -

Chris Tarantino

signal processing

 S. V. Narasimhan, S. Veena -

نقل از:

گروه تحقیقاتی AISRG


 


+ نوشته شده در  یکشنبه 1389/11/10ساعت 12:35  توسط دانشجویان الکترونیک 88 دانشگاه بیرجند  |