پردازش تصویر در جاوا با کمک فریم ورک 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"); } }
تصویر ورودی و نتیجه اجرای هر الگوریتم رو تصویر:
منبع:
http://marvinproject.sourceforge.net/en/howto/howToEdgeDetection.html
لطقا توضیح کامل بدید که import چجوری انجام بشه چون من تو این قسمت مشکل دارم
با سلام و معذرت به خاطر تاخیر در پاسخگویی. لطفا به بخش اول آموزش مراجعه فرمایید. توضیحات در آن بخش ذکر شده است.
https://javacup.ir/%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D8%AA%D8%B5%D9%88%DB%8C%D8%B1-%D8%AF%D8%B1-%D8%AC%D8%A7%D9%88%D8%A7-%D8%A8%D8%A7-%DA%A9%D9%85%DA%A9-%D9%81%D8%B1%DB%8C%D9%85-%D9%88%D8%B1%DA%A9-marvin-%D9%82/#comment-1579