دانستنی‌ها

پردازش تصویر در جاوا با کمک فریم ورک marvin (قسمت دوم : کشف لبه) (جشنواره عید تا عید)

(این مطلب توسط خانم مریم موسوی برای جشنواره عید تا عید جاواکاپ ارسال شده است و محتوای این مطلب لزوماً موردتأیید جاواکاپ نیست)

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

لبه چیست؟ به تغییرات ناگهانی در روشنایی تصویر لبه گفته می شود. لبه عموما در مرز دو ناحیه اتفاق می افتد و ویژگی مهمی در پردازش تصویر است.

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

الگوریتم های متفاوتی برای آشکارسازی لبه وجود دارد. بعضی از آنها توسط Marvin ارائه شده است.

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

الگوریتم   prewitt: این الگوریتم شباهت زیادی با الگوریتم sobel دارد با این تفاوت که ضرایب ماسک آنها با هم فرق می کند.

الگوریتم Roberts :  این الگوریتم به نویز حساسیت زیادی دارد و پیکسل های کمتری را برای تقریب گرادیان به کار می برد. این الگوریتم به اندازه canny قوی نیست.

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

اول از همه کلاس MarvinPluginCollection   را  static import  کنید برای اینکه به متدهای static روی آن کلاس مستقیما دسترسی داشته باشید.

 

import static marvin.MarvinPluginCollection.*;

 

ابتدا تصویر ورودی را  لود کنید و سپس شی تصویر دیگری برای خروجی ایجاد کنید.

MarvinImage image = MarvinImageIO.loadImage("f:/mickey_britto.jpg");

            MarvinImage imageOut = new MarvinImage(image.getWidth(), image.getHeight());



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

//Prewitt

prewitt(image, imageOut);

MarvinImageIO.saveImage(imageOut, "f:/mickey_britto_prewitt.jpg");

 

کد الگوریتم Sobel :

//Sobel:

imageOut.clear(0xFF000000);

sobel(image, imageOut);

MarvinImageIO.saveImage(imageOut, "f:/mickey_britto_sobel.jpg");

 

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

//Roberts:

imageOut.clear(0xFF000000);

roberts(image, imageOut);

MarvinImageIO.saveImage(imageOut, "f:/mickey_britto_roberts.jpg");



 

کد الگوریتم Black lines :

 

thresholding(…)    و   invertColors(…)  می توانند برای بدست آوردن لبه ها در یک رنگ تکی استفاده شوند.

thresholding(imageOut, 40);

invertColors(imageOut);

MarvinImageIO.saveImage(imageOut, "f:/mickey_britto_black_lines.jpg");





کد برنامه به طور کامل:

import static marvin.MarvinPluginCollection.*;

import marvin.image.MarvinImage;

import marvin.io.MarvinImageIO;

public class EdgeDetection {



      public static void main(String[] args) {

            MarvinImage image = MarvinImageIO.loadImage("f:/mickey_britto.jpg");

            MarvinImage imageOut = new MarvinImage(image.getWidth(), image.getHeight());

            //Prewitt

            prewitt(image, imageOut);

            MarvinImageIO.saveImage(imageOut, "f:/mickey_britto_prewitt.jpg");



            //Sobel:

            imageOut.clear(0xFF000000);

            sobel(image, imageOut);

            MarvinImageIO.saveImage(imageOut, "f:/mickey_britto_sobel.jpg");



            //Roberts:

            imageOut.clear(0xFF000000);

            roberts(image, imageOut);

            MarvinImageIO.saveImage(imageOut, "f:/mickey_britto_roberts.jpg");



            thresholding(imageOut, 40);

            invertColors(imageOut);

            MarvinImageIO.saveImage(imageOut, "f:/mickey_britto_black_lines.jpg");

      }



}

 

تصویر ورودی و نتیجه اجرای هر الگوریتم رو تصویر:

mickey_britto

 

2nd

منبع:

http://marvinproject.sourceforge.net/en/howto/howToEdgeDetection.html

 

 

 

 

 

نوشته های مشابه

‫2 دیدگاه ها

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا