پردازش تصویر در متلب: اولین گام‌ها با مثال‌های عملی

فهرست مطالب

پردازش تصویر در متلب: اولین گام‌ها با مثال‌های عملی

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

متلب (MATLAB)، با محیط برنامه‌نویسی قدرتمند و جعبه‌ابزارهای تخصصی خود، به یکی از ابزارهای محبوب و کارآمد برای محققان، مهندسان و دانشجویان در زمینه پردازش تصویر تبدیل شده است. جعبه‌ابزار پردازش تصویر (Image Processing Toolbox) متلب، مجموعه‌ای جامع از توابع و الگوریتم‌ها را برای انجام طیف وسیعی از عملیات پردازش تصویر، از مقدماتی‌ترین تا پیشرفته‌ترین، ارائه می‌دهد. این راهنما با هدف آشنایی عمیق و عملی شما با اولین گام‌های پردازش تصویر در متلب تدوین شده است. در ادامه، به بررسی مفاهیم اساسی، توابع کلیدی و مثال‌های کاربردی خواهیم پرداخت تا شما را در مسیر تبدیل شدن به یک متخصص پردازش تصویر یاری کنیم.

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

مقدمه‌ای بر جعبه‌ابزار پردازش تصویر متلب (Image Processing Toolbox)

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

برای شروع کار با این جعبه‌ابزار، اطمینان از نصب صحیح آن روی سیستم شما ضروری است. پس از نصب، می‌توانید با استفاده از دستورات متلب، به توابع آن دسترسی پیدا کنید. آشنایی با محیط متلب، شامل Command Window، Workspace، Current Folder و Editor، پیش‌نیاز اساسی برای بهره‌برداری کامل از قابلیت‌های این جعبه‌ابزار است.

تصاویر در متلب به صورت ماتریس‌های عددی ذخیره می‌شوند. نوع داده (Data Type) این ماتریس‌ها می‌تواند متفاوت باشد، از جمله `uint8` (برای تصاویر ۸ بیتی، مقادیر 0-255)، `uint16` (برای تصاویر ۱۶ بیتی، مقادیر 0-65535)، `single` یا `double` (برای محاسبات دقیق‌تر و تصاویر با عمق بیشتر). درک این تفاوت‌ها در انتخاب توابع و تنظیم پارامترها بسیار مهم است.

انواع تصاویر و نمایش آن‌ها در متلب

به طور کلی، تصاویر در متلب به چند دسته اصلی تقسیم می‌شوند:

  • تصاویر باینری (Binary Images): این تصاویر فقط دو مقدار پیکسلی دارند، معمولاً 0 (سیاه) و 1 (سفید). اغلب برای ماسک کردن یا نمایش لبه‌ها استفاده می‌شوند.
  • تصاویر خاکستری (Grayscale Images): هر پیکسل دارای یک مقدار شدت (intensity) است که معمولاً از سیاه (0) تا سفید (255 برای 8-bit) متغیر است. این تصاویر فاقد اطلاعات رنگی هستند.
  • تصاویر رنگی RGB (Truecolor Images): هر پیکسل از سه مؤلفه رنگی قرمز (Red)، سبز (Green) و آبی (Blue) تشکیل شده است. این مؤلفه‌ها به صورت سه ماتریس جداگانه یا یک ماتریس سه‌بعدی ذخیره می‌شوند.
  • تصاویر اندیس‌شده (Indexed Images): این تصاویر از یک ماتریس داده (که مقادیر پیکسلی را به صورت اندیس ذخیره می‌کند) و یک ماتریس نقشه‌رنگ (colormap) تشکیل شده‌اند. هر اندیس به یک رنگ خاص در نقشه‌رنگ اشاره دارد.

نمایش تصاویر در متلب عمدتاً با استفاده از تابع imshow() صورت می‌گیرد. این تابع قادر است انواع مختلف تصاویر را به صورت صحیح نمایش دهد. همچنین، توابعی مانند imtool() محیط تعاملی‌تری برای بررسی دقیق تصاویر فراهم می‌کند.

خواندن، نمایش و ذخیره تصاویر: عملیات پایه

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

تابع imread(): خواندن تصاویر

تابع imread() برای خواندن تصاویر از فرمت‌های مختلف (مانند JPEG, PNG, BMP, TIFF و غیره) و بارگذاری آن‌ها در حافظه متلب به عنوان یک ماتریس استفاده می‌شود.


% مثال 1: خواندن یک تصویر رنگی
img_color = imread('peppers.png'); % 'peppers.png' یک تصویر نمونه در متلب است

% مثال 2: خواندن یک تصویر خاکستری
% اگر تصویر ورودی رنگی باشد، imread آن را به صورت RGB می‌خواند.
% برای تبدیل به خاکستری می‌توان از rgb2gray استفاده کرد.
img_gray_orig = imread('cameraman.tif'); % 'cameraman.tif' یک تصویر نمونه خاکستری است

% نمایش ابعاد تصاویر
disp(['ابعاد تصویر رنگی: ', num2str(size(img_color))]);
disp(['ابعاد تصویر خاکستری: ', num2str(size(img_gray_orig))]);

خروجی imread() به نوع تصویر بستگی دارد. برای تصاویر رنگی RGB، یک ماتریس M×N×3 از نوع `uint8` (یا `uint16` و غیره) برمی‌گرداند. برای تصاویر خاکستری، یک ماتریس M×N. برای تصاویر باینری نیز یک ماتریس منطقی (logical) برمی‌گرداند.

تابع imshow(): نمایش تصاویر

تابع imshow() وظیفه نمایش تصاویر را بر عهده دارد. این تابع به طور هوشمندانه نوع تصویر را تشخیص داده و آن را به بهترین شکل ممکن نمایش می‌دهد.


% مثال 3: نمایش تصاویر خوانده شده
figure; % ایجاد یک پنجره جدید برای نمایش
subplot(1, 2, 1); % تقسیم پنجره به 1 ردیف و 2 ستون، انتخاب خانه اول
imshow(img_color);
title('تصویر رنگی اصلی');

subplot(1, 2, 2); % انتخاب خانه دوم
imshow(img_gray_orig);
title('تصویر خاکستری اصلی');

تابع imshow() همچنین امکانات پیشرفته‌تری مانند تنظیم محدوده نمایش شدت (برای تصاویر `double` یا `single`)، نمایش اطلاعات پیکسل و… را فراهم می‌کند. به عنوان مثال، imshow(img_double, []) به طور خودکار محدوده شدت را برای بهترین نمایش تنظیم می‌کند.

تابع imwrite(): ذخیره تصاویر

پس از انجام عملیات پردازش، ممکن است بخواهید تصویر خروجی را ذخیره کنید. تابع imwrite() این امکان را فراهم می‌آورد.


% مثال 4: تبدیل تصویر رنگی به خاکستری و ذخیره آن
img_gray_converted = rgb2gray(img_color); % تبدیل از RGB به خاکستری
imwrite(img_gray_converted, 'peppers_grayscale.png');
disp('تصویر خاکستری شده با موفقیت ذخیره شد: peppers_grayscale.png');

% نمایش تصویر خاکستری شده
figure;
imshow(img_gray_converted);
title('تصویر رنگی تبدیل شده به خاکستری');

imwrite() به طور خودکار فرمت فایل را بر اساس پسوند نام فایل تشخیص می‌دهد. می‌توانید پارامترهای اضافی مانند کیفیت فشرده‌سازی برای JPEG را نیز مشخص کنید.

دستکاری‌های پایه تصویر: ابعاد و موقعیت

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

تغییر اندازه تصویر با imresize()

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


% مثال 5: تغییر اندازه تصویر
% فرض کنید img_color همان تصویر peppers.png است که قبلاً خوانده‌ایم.

% کاهش اندازه به نصف
img_half_size = imresize(img_color, 0.5);

% افزایش اندازه به دو برابر (با استفاده از ابعاد پیکسل)
new_width = size(img_color, 2) * 2;
new_height = size(img_color, 1) * 2;
img_double_size = imresize(img_color, [new_height, new_width]);

% نمایش نتایج
figure;
subplot(1, 3, 1); imshow(img_color); title('اصلی');
subplot(1, 3, 2); imshow(img_half_size); title('نصف اندازه');
subplot(1, 3, 3); imshow(img_double_size); title('دو برابر اندازه');

disp(['ابعاد تصویر اصلی: ', num2str(size(img_color))]);
disp(['ابعاد تصویر نصف شده: ', num2str(size(img_half_size))]);
disp(['ابعاد تصویر دو برابر شده: ', num2str(size(img_double_size))]);

imresize() از روش‌های درون‌یابی (interpolation) مختلفی مانند نزدیک‌ترین همسایه (nearest-neighbor)، bilinear و bicubic پشتیبانی می‌کند که می‌توانید آن‌ها را به عنوان پارامتر سوم به تابع ارسال کنید.

چرخش تصویر با imrotate()

چرخاندن تصاویر برای تنظیم جهت‌گیری یا تصحیح کج‌شدگی‌ها کاربرد دارد. تابع imrotate() به شما اجازه می‌دهد تصویر را به هر زاویه‌ای بچرخانید.


% مثال 6: چرخش تصویر
% چرخش 45 درجه در جهت عقربه‌های ساعت (مقدار مثبت)
img_rotated_45 = imrotate(img_color, 45, 'bilinear', 'loose'); % 'loose' ابعاد را حفظ نمی‌کند

% چرخش 90 درجه در خلاف جهت عقربه‌های ساعت (مقدار منفی)
img_rotated_neg90 = imrotate(img_color, -90, 'bilinear', 'crop'); % 'crop' ابعاد اصلی را حفظ می‌کند و قسمت‌های اضافه را برش می‌دهد

% نمایش نتایج
figure;
subplot(1, 3, 1); imshow(img_color); title('اصلی');
subplot(1, 3, 2); imshow(img_rotated_45); title('چرخش 45 درجه');
subplot(1, 3, 3); imshow(img_rotated_neg90); title('چرخش 90- درجه (برش خورده)');

پارامتر ‘loose’ تضمین می‌کند که کل تصویر چرخانده شده قابل مشاهده باشد و ابعاد تصویر خروجی بزرگتر می‌شود. در مقابل، ‘crop’ تصویر را طوری برش می‌دهد که ابعاد آن با تصویر اصلی یکسان بماند.

برش تصویر با imcrop()

برش یا Crop کردن برای انتخاب یک ناحیه خاص از تصویر (ROI – Region of Interest) کاربرد دارد. تابع imcrop() به دو صورت قابل استفاده است: تعاملی یا با مشخص کردن مختصات.


% مثال 7: برش تصویر
% برش تعاملی: متلب منتظر می‌ماند تا شما یک مستطیل را با ماوس انتخاب کنید.
% figure; imshow(img_color);
% img_cropped_interactive = imcrop; % این خط را uncomment کنید تا تعاملی برش دهید

% برش غیرتعاملی با مختصات [x, y, width, height]
% فرض کنید می‌خواهیم یک ناحیه 100x100 پیکسلی از مختصات (50, 50) برش دهیم
x = 50; y = 50; width = 100; height = 100;
img_cropped_manual = imcrop(img_color, [x, y, width, height]);

% نمایش نتایج
figure;
subplot(1, 1, 1); imshow(img_cropped_manual); title('تصویر برش خورده دستی');

استفاده از imcrop() با مختصات به شما امکان می‌دهد برش دقیق و قابل تکراری داشته باشید، که برای اتوماسیون و پردازش دسته‌ای تصاویر ضروری است.

افزایش کیفیت تصویر: روش‌های بهبود

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

تنظیم کنتراست و روشنایی

کنتراست و روشنایی دو ویژگی اساسی بصری تصویر هستند که تأثیر زیادی بر وضوح و جزئیات آن دارند. متلب توابعی برای تنظیم این ویژگی‌ها ارائه می‌دهد، اما اغلب می‌توان با دستکاری مستقیم مقادیر پیکسلی نیز این کار را انجام داد.


% مثال 8: تنظیم کنتراست و روشنایی
% ابتدا تصویر را به نوع double تبدیل می‌کنیم تا محاسبات دقیق‌تر انجام شود و مقادیر خارج از محدوده 0-255 به مشکل نخورند.
img_double = im2double(img_gray_orig); % im2double مقادیر را به محدوده [0, 1] نرمالایز می‌کند.

% افزایش روشنایی (افزودن یک مقدار ثابت به همه پیکسل‌ها)
brightness_factor = 0.2;
img_bright = img_double + brightness_factor;
img_bright(img_bright > 1) = 1; % اطمینان از اینکه مقادیر از 1 تجاوز نکنند
img_bright(img_bright < 0) = 0; % اطمینان از اینکه مقادیر از 0 کمتر نشوند

% افزایش کنتراست (ضرب در یک مقدار ثابت)
contrast_factor = 1.5;
img_contrast = img_double * contrast_factor;
img_contrast(img_contrast > 1) = 1;
img_contrast(img_contrast < 0) = 0;

% می‌توان از تابع imadjust نیز استفاده کرد که کنترل بیشتری ارائه می‌دهد.
% img_adj = imadjust(img_gray_orig, [0.3 0.7], []); % نگاشت شدت 0.3 تا 0.7 به 0 تا 1

% نمایش نتایج
figure;
subplot(1, 3, 1); imshow(img_double); title('اصلی (Double)');
subplot(1, 3, 2); imshow(img_bright); title('افزایش روشنایی');
subplot(1, 3, 3); imshow(img_contrast); title('افزایش کنتراست');

تابع imadjust() یک روش قدرتمندتر برای نگاشت شدت پیکسلی است که امکان کنترل دقیق‌تر بر کنتراست و روشنایی را با تعریف محدوده‌های ورودی و خروجی فراهم می‌کند. همچنین، histeq() برای متعادل‌سازی هیستوگرام (Histogram Equalization) بسیار مفید است که به طور خودکار کنتراست را در تصاویر با توزیع شدت نامتوازن بهبود می‌بخشد.

متعادل‌سازی هیستوگرام با histeq()

متعادل‌سازی هیستوگرام (Histogram Equalization) یک تکنیک قدرتمند برای افزایش کنتراست تصاویر، به ویژه آنهایی که بخش زیادی از پیکسل‌هایشان در محدوده شدت خاصی متمرکز شده‌اند، می‌باشد. این روش با گسترش توزیع شدت پیکسل‌ها در سراسر محدوده ممکن، کنتراست را بهبود می‌بخشد.


% مثال 9: متعادل‌سازی هیستوگرام
img_eq = histeq(img_gray_orig);

% نمایش تصویر اصلی و تصویر متعادل شده
figure;
subplot(2, 2, 1); imshow(img_gray_orig); title('تصویر خاکستری اصلی');
subplot(2, 2, 2); imhist(img_gray_orig); title('هیستوگرام اصلی');
subplot(2, 2, 3); imshow(img_eq); title('تصویر متعادل شده');
subplot(2, 2, 4); imhist(img_eq); title('هیستوگرام متعادل شده');

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

فیلترهای فضایی برای حذف نویز: imfilter() و fspecial()

نویز (Noise) یکی از مشکلات رایج در تصاویر است که می‌تواند از منابع مختلفی مانند سنسورهای دوربین، شرایط نورپردازی نامناسب یا خطاهای انتقال داده ناشی شود. فیلترهای فضایی (Spatial Filters) راهی مؤثر برای کاهش نویز و صاف کردن تصاویر هستند. متلب توابع imfilter() و fspecial() را برای اعمال این فیلترها ارائه می‌دهد.


% مثال 10: حذف نویز با فیلتر میانگین (Average Filter) و میانه (Median Filter)

% ایجاد نویز گوسی (Gaussian Noise) مصنوعی روی تصویر
img_noisy_gaussian = imnoise(img_gray_orig, 'gaussian', 0, 0.02);

% ایجاد نویز نمک و فلفل (Salt & Pepper Noise) مصنوعی
img_noisy_sp = imnoise(img_gray_orig, 'salt & pepper', 0.05);

% 1. فیلتر میانگین (Average Filter)
% با استفاده از fspecial یک ماسک فیلتر میانگین (هموارسازی) ایجاد می‌کنیم.
h_average = fspecial('average', [3 3]); % فیلتر 3x3 میانگین
img_filtered_avg = imfilter(img_noisy_gaussian, h_average, 'replicate'); % 'replicate' برای مدیریت لبه‌ها

% 2. فیلتر میانه (Median Filter)
% فیلتر میانه به طور خاص برای نویز نمک و فلفل بسیار موثر است.
img_filtered_med = medfilt2(img_noisy_sp, [3 3]); % medfilt2 مستقیماً فیلتر میانه را اعمال می‌کند.

% نمایش نتایج
figure;
subplot(2, 3, 1); imshow(img_gray_orig); title('تصویر اصلی');
subplot(2, 3, 2); imshow(img_noisy_gaussian); title('با نویز گوسی');
subplot(2, 3, 3); imshow(img_filtered_avg); title('فیلتر میانگین (گوسی)');
subplot(2, 3, 4); imshow(img_gray_orig); title('تصویر اصلی'); % دوباره برای مقایسه
subplot(2, 3, 5); imshow(img_noisy_sp); title('با نویز نمک و فلفل');
subplot(2, 3, 6); imshow(img_filtered_med); title('فیلتر میانه (نمک و فلفل)');

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

عملیات مورفولوژی: تحلیل اشکال تصویر

عملیات مورفولوژی (Morphological Operations) مجموعه‌ای از فرآیندهای پردازش تصویر هستند که بر اساس شکل‌ها در تصویر عمل می‌کنند. این عملیات عمدتاً بر روی تصاویر باینری (سیاه و سفید) یا خاکستری اعمال می‌شوند و برای کارهایی مانند حذف نویز، تشخیص اجسام، تقسیم‌بندی و بهبود ساختارها بسیار مفید هستند. عناصر ساختاری (Structuring Elements) نقش کلیدی در این عملیات ایفا می‌کنند.

عناصر ساختاری strel()

یک عنصر ساختاری یک ماتریس یا آرایه‌ای است که در طول تصویر حرکت می‌کند و تعیین می‌کند که عملیات مورفولوژیکی چگونه بر پیکسل‌های اطراف تأثیر بگذارد. تابع strel() برای ایجاد عناصر ساختاری مختلف استفاده می‌شود.


% مثال 11: ایجاد عناصر ساختاری مختلف
se_disk = strel('disk', 3); % دیسک با شعاع 3
se_square = strel('square', 5); % مربع 5x5
se_line = strel('line', 7, 45); % خط با طول 7 و زاویه 45 درجه

disp('عنصر ساختاری دیسک:'); disp(se_disk.Neighborhood);
disp('عنصر ساختاری مربع:'); disp(se_square.Neighborhood);

فرسایش (Erosion) با imerode()

فرسایش یکی از عملیات پایه مورفولوژیکی است که "مرزهای" اجسام را در تصاویر باینری کاهش می‌دهد. این عمل می‌تواند برای حذف پیکسل‌های مجرد، جزئیات کوچک یا اتصال بخش‌های جدا از هم مفید باشد.


% مثال 12: فرسایش
% ابتدا تصویر خاکستری را به باینری تبدیل می‌کنیم
img_binary = imbinarize(img_gray_orig);

% ایجاد یک عنصر ساختاری دیسکی
se = strel('disk', 3);

% اعمال فرسایش
img_eroded = imerode(img_binary, se);

% نمایش نتایج
figure;
subplot(1, 3, 1); imshow(img_gray_orig); title('تصویر خاکستری اصلی');
subplot(1, 3, 2); imshow(img_binary); title('تصویر باینری');
subplot(1, 3, 3); imshow(img_eroded); title('تصویر فرسایش یافته');

گسترش (Dilation) با imdilate()

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


% مثال 13: گسترش
% اعمال گسترش بر روی تصویر باینری اصلی
img_dilated = imdilate(img_binary, se);

% نمایش نتایج
figure;
subplot(1, 3, 1); imshow(img_binary); title('تصویر باینری اصلی');
subplot(1, 3, 2); imshow(img_eroded); title('تصویر فرسایش یافته');
subplot(1, 3, 3); imshow(img_dilated); title('تصویر گسترش یافته');

باز شدن (Opening) با imopen() و بسته شدن (Closing) با imclose()

عملیات باز شدن (Opening) و بسته شدن (Closing) ترکیب‌هایی از فرسایش و گسترش هستند که برای حذف نویزهای خاص یا صاف کردن مرزهای اجسام استفاده می‌شوند.

  • باز شدن (Opening): ابتدا فرسایش و سپس گسترش. این عملیات می‌تواند اجسام کوچک و برجستگی‌های باریک را از بین ببرد و مرزهای اجسام را صاف کند.
  • بسته شدن (Closing): ابتدا گسترش و سپس فرسایش. این عملیات می‌تواند سوراخ‌های کوچک را پر کند، شکاف‌های باریک را ببندد و مرزهای اجسام را صاف کند.

% مثال 14: باز شدن و بسته شدن
% یک تصویر باینری با نویز "نمک و فلفل" ایجاد می‌کنیم
img_noise_binary = imnoise(false(100, 100), 'salt & pepper', 0.1);
% یک دایره در مرکز ایجاد می‌کنیم
[X, Y] = meshgrid(1:100);
R = sqrt((X-50).^2 + (Y-50).^2);
img_obj_binary = (R < 20);
img_test_morph = img_obj_binary | img_noise_binary;

% ایجاد یک عنصر ساختاری دیسکی کوچک
se_small = strel('disk', 2);

% اعمال باز شدن
img_opened = imopen(img_test_morph, se_small); % حذف نویزهای کوچک سفید

% اعمال بسته شدن
img_closed = imclose(img_test_morph, se_small); % پر کردن سوراخ‌های کوچک سیاه

% نمایش نتایج
figure;
subplot(1, 3, 1); imshow(img_test_morph); title('تصویر باینری با نویز');
subplot(1, 3, 2); imshow(img_opened); title('پس از عملیات باز شدن');
subplot(1, 3, 3); imshow(img_closed); title('پس از عملیات بسته شدن');

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

تشخیص لبه: شناسایی مرزها و ساختارها

تشخیص لبه (Edge Detection) یک گام اساسی در بسیاری از کاربردهای پردازش تصویر است که هدف آن شناسایی نقاطی در تصویر است که در آن‌ها تغییرات ناگهانی و چشمگیر در شدت روشنایی رخ می‌دهد. این تغییرات معمولاً نشان‌دهنده مرزهای اشیاء یا تغییرات مهم در بافت تصویر هستند. متلب توابع قدرتمندی برای اجرای الگوریتم‌های مختلف تشخیص لبه ارائه می‌دهد.

تابع edge(): تشخیص لبه با روش‌های مختلف

تابع edge() در متلب، پرکاربردترین تابع برای تشخیص لبه است و از الگوریتم‌های مختلفی پشتیبانی می‌کند، از جمله Sobel، Prewitt، Roberts، LoG (Laplacian of Gaussian) و Canny.


% مثال 15: تشخیص لبه با الگوریتم‌های مختلف
% از تصویر خاکستری اصلی استفاده می‌کنیم
img_gray = img_gray_orig;

% تشخیص لبه با Sobel
edges_sobel = edge(img_gray, 'sobel');

% تشخیص لبه با Canny (یکی از پیشرفته‌ترین و محبوب‌ترین روش‌ها)
edges_canny = edge(img_gray, 'canny');

% تشخیص لبه با Prewitt
edges_prewitt = edge(img_gray, 'prewitt');

% تشخیص لبه با Roberts
edges_roberts = edge(img_gray, 'roberts');

% تشخیص لبه با LoG
edges_log = edge(img_gray, 'log');

% نمایش نتایج
figure;
subplot(2, 3, 1); imshow(img_gray); title('تصویر اصلی');
subplot(2, 3, 2); imshow(edges_sobel); title('لبه‌های Sobel');
subplot(2, 3, 3); imshow(edges_canny); title('لبه‌های Canny');
subplot(2, 3, 4); imshow(edges_prewitt); title('لبه‌های Prewitt');
subplot(2, 3, 5); imshow(edges_roberts); title('لبه‌های Roberts');
subplot(2, 3, 6); imshow(edges_log); title('لبه‌های LoG');

هر یک از این الگوریتم‌ها دارای ویژگی‌ها و نقاط قوت خاص خود هستند. به عنوان مثال:

  • Sobel، Prewitt، Roberts: اینها عملگرهای گرادیان ساده‌ای هستند که به تغییرات شدت افقی و عمودی حساس هستند. Sobel معمولاً نویز را بهتر کنترل می‌کند.
  • LoG (Laplacian of Gaussian): از یک فیلتر گاوسی برای صاف کردن تصویر و سپس یک فیلتر لاپلاسی برای تشخیص لبه‌ها استفاده می‌کند. این روش به لبه‌های نازک و بسته تمایل دارد.
  • Canny: یکی از پیچیده‌ترین و کارآمدترین الگوریتم‌هاست. Canny از چند مرحله شامل صاف کردن با فیلتر گاوسی، محاسبه گرادیان، سرکوب غیرحداکثری (Non-Maximum Suppression) و آستانه‌گذاری هیسترزیس (Hysteresis Thresholding) برای تولید لبه‌های نازک و پیوسته استفاده می‌کند. این روش معمولاً بهترین نتایج را در بسیاری از کاربردها ارائه می‌دهد.

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

جداسازی تصویر (Image Segmentation): شناسایی مناطق

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

آستانه‌گذاری (Thresholding) با imbinarize()

آستانه‌گذاری یکی از ساده‌ترین و پرکاربردترین روش‌های جداسازی است که یک تصویر خاکستری را به یک تصویر باینری تبدیل می‌کند. پیکسل‌هایی که شدت آن‌ها بالاتر از یک آستانه مشخص است، به یک مقدار (مثلاً 1 یا سفید) و پیکسل‌های پایین‌تر از آن به مقدار دیگر (مثلاً 0 یا سیاه) اختصاص می‌یابند.


% مثال 16: جداسازی با آستانه‌گذاری
% از تصویر cameraman.tif استفاده می‌کنیم.
img_gray = imread('cameraman.tif');

% آستانه‌گذاری با یک مقدار ثابت
threshold_fixed = 100; % انتخاب دستی آستانه
img_binary_fixed = (img_gray > threshold_fixed);

% آستانه‌گذاری خودکار با روش Otsu (پیش‌فرض imbinarize)
img_binary_otsu = imbinarize(img_gray);

% نمایش نتایج
figure;
subplot(1, 3, 1); imshow(img_gray); title('تصویر خاکستری اصلی');
subplot(1, 3, 2); imshow(img_binary_fixed); title(['آستانه گذاری ثابت (>', num2str(threshold_fixed), ')']);
subplot(1, 3, 3); imshow(img_binary_otsu); title('آستانه گذاری Otsu');

تابع imbinarize() به طور پیش‌فرض از روش Otsu استفاده می‌کند که به طور خودکار بهترین آستانه را برای جداسازی دو کلاس پیکسل (پیش‌زمینه و پس‌زمینه) پیدا می‌کند. همچنین می‌توانید روش‌های دیگری را مانند 'adaptive' برای آستانه‌گذاری محلی (local thresholding) مشخص کنید.

جداسازی بر اساس رنگ: استفاده از فضای رنگی HSV

جداسازی اشیاء بر اساس رنگ، در تصاویر رنگی بسیار مفید است. برای این کار، معمولاً تصویر از فضای رنگی RGB به فضای رنگی HSV (Hue, Saturation, Value) تبدیل می‌شود، زیرا Hue (رنگ) یک مؤلفه مستقل از روشنایی (Value) است و برای شناسایی رنگ‌ها مناسب‌تر است.


% مثال 17: جداسازی بر اساس رنگ
% از تصویر رنگی peppers.png استفاده می‌کنیم
img_rgb = imread('peppers.png');

% تبدیل به فضای رنگی HSV
img_hsv = rgb2hsv(img_rgb);

% استخراج کانال Hue (اولین کانال)
H = img_hsv(:, :, 1);

% فرض کنید می‌خواهیم فلفل‌های قرمز و نارنجی را جدا کنیم.
% رنگ قرمز و نارنجی در محدوده H بسیار نزدیک به 0 و نزدیک به 1 (360 درجه) هستند.
% بنابراین باید هر دو طرف محدوده را شامل شویم.
% برای سادگی، یک محدوده برای رنگ‌های گرم در نظر می‌گیریم.
% Hue در متلب بین 0 و 1 نرمالایز شده است (مقادیر 0 تا 360 درجه تقسیم بر 360)
% قرمز: حدود 0 یا 1. نارنجی: حدود 0.05 تا 0.15
% یک ماسک برای رنگ‌های نزدیک به قرمز/نارنجی ایجاد می‌کنیم
low_hue1 = 0.95; high_hue1 = 1.0; % قسمت بالاتر از 0.95 (قرمز تیره)
low_hue2 = 0.0; high_hue2 = 0.1; % قسمت پایین‌تر از 0.1 (قرمز/نارنجی)

% ماسک برای Saturation (اشباع) و Value (روشنایی) نیز برای بهبود دقت
low_saturation = 0.3;
high_saturation = 1.0;
low_value = 0.2;
high_value = 1.0;

% ایجاد ماسک نهایی
mask_hue1 = (H >= low_hue1) | (H <= high_hue2);
mask_saturation = (img_hsv(:, :, 2) >= low_saturation) & (img_hsv(:, :, 2) <= high_saturation);
mask_value = (img_hsv(:, :, 3) >= low_value) & (img_hsv(:, :, 3) <= high_value);

final_mask = mask_hue1 & mask_saturation & mask_value;

% اعمال ماسک بر روی تصویر اصلی
img_segmented = img_rgb;
for c = 1:3 % برای هر کانال رنگی
    img_segmented(:, :, c) = img_segmented(:, :, c) .* uint8(final_mask);
end

% نمایش نتایج
figure;
subplot(1, 2, 1); imshow(img_rgb); title('تصویر رنگی اصلی');
subplot(1, 2, 2); imshow(img_segmented); title('فلفل‌های قرمز/نارنجی جدا شده');

جداسازی بر اساس رنگ نیازمند انتخاب دقیق محدوده‌های Hue، Saturation و Value است که می‌تواند بسته به شرایط نور و نوع رنگ متفاوت باشد. این تکنیک در کاربردهایی مانند کنترل کیفیت، رباتیک و تحلیل پزشکی کاربرد فراوان دارد.

نتیجه‌گیری و گام‌های بعدی

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

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

برای تعمیق دانش خود، توصیه می‌شود:

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

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

“تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT”

قیمت اصلی 2.290.000 ریال بود.قیمت فعلی 1.590.000 ریال است.

"تسلط به برنامه‌نویسی پایتون با هوش مصنوعی: آموزش کدنویسی هوشمند با ChatGPT"

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

ویژگی‌های کلیدی:

بدون نیاز به تجربه قبلی برنامه‌نویسی

زیرنویس فارسی با ترجمه حرفه‌ای

۳۰ ٪ تخفیف ویژه برای دانشجویان و دانش آموزان