PDA

View Full Version : علت تفاوت زمانی زیاد توابع لبه یابی کتابخانه ای با توابع دست نویس !



sha8046
جمعه 06 دی 1392, 02:33 صبح
سلام .
زمان اجرای فیلتر سوبل و کنی تو متلب 1 تا 3 ثانیه برای یک عکس ساده تو لپ تاپم درمیاد
ولی همین عکس رو من میخوام همه پیکسلهاشو بخونم و عملیات ساده انجام بدم چندبرابر زمان میبره .

مگه این الگوریتم های پیشرفته همه پیکسل ها رو چندین بار پردازش نمیکنن چرا زمانشون کمتر درمیاد ؟

Imaaan
جمعه 06 دی 1392, 16:01 عصر
سلام .
زمان اجرای فیلتر سوبل و کنی تو متلب 1 تا 3 ثانیه برای یک عکس ساده تو لپ تاپم درمیاد
ولی همین عکس رو من میخوام همه پیکسلهاشو بخونم و عملیات ساده انجام بدم چندبرابر زمان میبره .

مگه این الگوریتم های پیشرفته همه پیکسل ها رو چندین بار پردازش نمیکنن چرا زمانشون کمتر درمیاد ؟

سلام
فانکشن های خود متلب طوری نوشته شدن که در کمترین زمان ممکن اجرا بشن. اگه کد اصلی رو با دستور open یا edit باز کنین، متلب برای پیاده سازی این دو از imfilter استفاده کرده. وقتی یه ماسکی رو بخواین روی تصویر پیکسل به پیکسل حرکت بدین، استفاده از کانولوشن (دستورهایی مثل imfilter - conv2 - filter2) میتونه سرعت اجرای کد رو خیلی بالا ببره:

clear;
img = imread('cameraman.tif');
Sobel = [1 2 1;0 0 0;-1 -2 -1];

edge_x = conv2(double(img),Sobel','same');
edge_y = conv2(double(img),Sobel,'same');
Image_edge = sqrt(edge_x.^2 + edge_y.^2);
Image_edge = Image_edge ./ max(Image_edge(:));

figure;
set(gcf,'Position',get(0,'ScreenSize'))
subplot(221)
imshow(img)
title('Image','FontSize',14)
subplot(222)
imshow(Image_edge)
title('Sobel Edge Ditector','FontSize',14)
subplot(223)
imshow(abs(edge_x),[])
title('Sobel in Horizontal Direction','FontSize',14)
subplot(224)
imshow(abs(edge_y),[])
title('Sobel in Vertical Direction','FontSize',14)


توی imfilter از فایل mex برای افزایش سرعت استفاده شده، فایل های mex معمولا به زبان C یا ++C نوشته میشن، بعد هم به فرمتی در میان که متلب بتونه اجراشون کنه. توی ورژن های جدید متلب از CUDA برای بعضی از فانکشن ها استفاده کرده، ولی خوب خیلی از کارت گرافیک ها CUDA ندارن.
خیلی وقت ها میشه حلقه رو حذف کرد. مقدار دهی اولیه متغیر ها قبل از حلقه هم میتونه خیلی به سرعت کمک کنه (یعنی سایز متغیر داخل حلقه تغییر نکنه).