آموزش گام به گام پردازش سیگنال و تصویر در نرم افزار متلب

در این مطلب مطالبی کاربردی راجب موضوع پردازش سیگنال و پردازش تصویر در نرم افزار متلب را به شما آموزش می دهیم. در واقع نرمافزار متلب در دنیای مهندسی و ریاضیات، مانند یک آزمایشگاه بسیار پیشرفته و مجهز برای تحلیل دادهها عمل میکند. پردازش سیگنال و تصویر در این نرمافزار، به معنای دریافت دادههای خام، انجام عملیات ریاضی روی آنها و استخراج اطلاعات مفید است.
در ادامه، این دو مفهوم را بدون ورود به مباحث پیچیده ریاضی بررسی میکنیم:
پردازش سیگنال در متلب
سیگنال در مفهوم علمی خود، جریانی از دادههاست که در طول زمان یا فضا تغییر میکند و حامل پیام یا اطلاعات خاصی است. متلب برای مدیریت و تحلیل این جریانهای داده، ابزارهای تخصصی قدرتمندی دارد.
کارهای اصلی که متلب روی سیگنالها انجام میدهد شامل موارد زیر است:
-
پاکسازی و فیلتر کردن: در دنیای واقعی، دادهها همیشه با اختلال و نویز همراه هستند. متلب ابزارهایی دارد که بخشهای مزاحم و مخرب داده را شناسایی و حذف میکند تا ماهیت اصلی اطلاعات شفاف شود.
-
تحلیل محتوا و فرکانس: متلب میتواند یک موج داده پیچیده را به اجزای سازنده آن بشکافد. این کار کمک میکند تا نوسانات پنهان و الگوهای تکرارشونده در دل دادهها کشف شوند.
-
فشردهسازی: گاهی حجم دادههای دریافتی بسیار بالاست. ابزارهای پردازشی میتوانند بدون آسیب رساندن به مفهوم اصلی اطلاعات، حجم آنها را برای ذخیرهسازی یا انتقال کاهش دهند.
پردازش تصویر در متلب
از نگاه انسان، یک تصویر مجموعهای از رنگها و شکلهاست، اما از نگاه نرمافزار متلب، هر تصویر صرفاً یک جدول (ماتریس) بسیار بزرگ از اعداد است. هر سلول از این جدول نشاندهنده یک نقطه کوچک (پیکسل) است و عدد درون آن، میزان روشنایی و نوع رنگ آن نقطه را مشخص میکند.
عملیات پردازش تصویر در متلب بر پایه تغییر همین اعداد استوار است و شامل اهداف زیر میشود:
-
بهبود بصری: تغییر دادن اعداد ماتریس برای افزایش وضوح، تنظیم کنتراست، رفع تاری و روشنتر کردن بخشهای تاریک.
-
تشخیص الگو و استخراج ویژگی: جستجو در میان اعداد جدول برای پیدا کردن لبهها، مرزها، و هندسههای خاص. نرمافزار میتواند تفاوتهای ناگهانی در مقادیر اعداد را به عنوان لبه یا مرز یک شیء شناسایی کند.
-
بخشبندی (Segmentation): جدا کردن بخشهای مهم از پسزمینه. نرمافزار با گروهبندی اعدادی که مقادیر مشابهی دارند، اجزای مختلف را از یکدیگر تفکیک میکند.
نکته کلیدی: دلیل محبوبیت متلب در این دو حوزه، وجود بستههای نرمافزاری آمادهای به نام «جعبهابزار» (Toolbox) است. این جعبهابزارها حاوی محیطهای کاربری بصری و الگوریتمهای از پیش نوشته شدهای هستند که به کاربر اجازه میدهند بدون درگیر شدن با محاسبات پایه، مستقیماً روی تحلیل دادهها و رسیدن به نتیجه نهایی تمرکز کند.
و اما مثالها و روشهای انجام
محاسبه چرخشی سری x و y با استفاده از سری فوریه
% use the Fourier convolution thm
z = real( ifft( fft(x).*fft(y) ) );
نمایش نتیجه fft با فرکانس صفر
x = peaks(256);
imagesc( real( fftshift( fft2(x) ) ) );
تغییر سایز یک تصویر
[p,q] = size(M); % the original image
[X,Y] = meshgrid( (0:p-1)/(p-1), (0:q-1)/(q-1) );
% new sampling location
[XI,YI] = meshgrid( (0:p1-1)/(p1-1) , (0:q1-1)/(q1-1) );
M1 = interp2( X,Y, M, XI,YI ,’cubic’); % the new image
حتما بخوانید: آموزش گام به گام Array در متلب به زبان کاملا ساده
ساخت واریانس تک بعدی
x = -1/2:1/(n-1):1/2;
f = exp( -(x.ˆ۲)/(۲*sˆ۲) );
f = f / sum(sum(f));
ساخت واریانس دو بعدی
x = -1/2:1/(n-1):1/2;
[Y,X] = meshgrid(x,x);
f = exp( -(X.ˆ۲+Y.ˆ۲)/(۲*sˆ۲) );
f = f / sum(f(:));
انجام یک سری تک بعدی برای سیگنال f و با فیلتر سیگنال h
n = length(x); p = length(h);
if mod(p,2)==1
d1 = (p-1)/2; d2 = (p-1)/2;
else
d1 = p/2-1; d2 = p/2;
end
xx = [ x(d1:-1:1); x; x(end:-1:end-d2+1) ];
y = conv(xx,h);
y = y( (2*d1+1):(2*d1+n) );
حتما بخوانید: آموزش انواع داده ها در متلب به زبان کاملا ساده
مشابه عملیات قبلی برای دو بعدی
n = length(x); p = length(h);
if mod(p,2)==1
d1 = (p-1)/2; d2 = (p-1)/2;
else
d1 = p/2-1; d2 = p/2;
end
xx = [ x(d1:-1:1,:); x; x(end:-1:end-d2+1,:) ];
xx = [ xx(:,d1:-1:1), xx, xx(:,end:-1:end-d2+1) ];
y = conv2(xx,h);
y = y( (2*d1+1):(2*d1+n), (2*d1+1):(2*d1+n) );
استخراج تصویر منحنی های سطح صفر
c = contourc(M,[0,0]);
k = 0; p = 1;
while p < size(c, 2) % parse the result
lc = c(2,p); % length of the curve
cc = c(:,(p+1):(p+lc));
p = p+lc+1;
k = k+1;
c listk = cc;
end
محاسبه سریع انتگرال منحنی دو بعدی
curve is assumed in [0, 1]2)
cs = c*(n-1) + 1; % scale to [1,n]
I = round(cs);
J = sub2ind(size(M), I(1,:),I(2,:) );
y = sum(M(J));
ترسیم یک دیسک و یک مربع
n = 100; x = -1:2/(n-1):1;
[Y,X] = meshgrid(x,x);
c = [0,0]; r = 0.4; % center and radius of the disk
D = (X-c(1)).ˆ۲ + (Y-c(2)).ˆ۲ < rˆ۲;
imagesc(D); % a disk
C = max(abs(X-c(1)),abs(Y-c(2)))<r;
imagesc(C); % a square
ترسیم یک تابع دو بعدی
(x,y).
n = 400;
x = rand(n,1); y = rand(n,1);
% this is an example of surface
z = cos(pi*x) .* cos(pi*y);
tri = delaunay(x,y); % build a Delaunay triangulation
trisurf(tri,x,y,z);
تولید یک سیگنال بر اساس Sobolev
alpha = 2; n = 100;
y = randn(n,1); % gaussian noise
fy = fft(y);
fy = fftshift(fy);
% filter the noise with |omega|ˆ-alpha
h = (-n/2+1):(n/2);
h = (abs(h)+1).ˆ(-alpha-0.5);
fy = fy.*h’;
fy = fftshift(fy);
y = real( ifft(fy) );
y = (y-min(y))/(max(y)-min(y));
حتما بخوانید: کجا و به چه دلیل باید از نرم افزار متلب استفاده کنیم یا نکنیم؟
تولید یک سیگنال بر اساس ۱/۲٫
alpha = 3; n = 300;
x = rand(n,1); % uniform noise
for i=1:alpha % integrate the noise alpha times
x = cumsum(x – mean(x));
end
محاسبه PSNR بین دو سیگنال x , y
d = mean( mean( (x-y).ˆ۲ ) );
m = max( max(x(:)),max(y(:)) );
PSNR = 10*log10( m/d );
محاسبه اسپیلاین مکعب با مقدار t
x = abs(t) ;
I12 = (x>1)&(x<=2); I01 = (x<=1);
y = I01.*( 2/3-x.ˆ۲٫*(۱-x/2) ) + I12.*( 1/6*(2-x).ˆ۳ );
بررسی طیفی سیگنال x
n = length(x); n0 = (n-1)/2;
f = fft(x); % forward transform
f = p/n*[f(1:n0+1); zeros(p-n,1); f(n0+2:n)];
x = real( ifft(f) ); % backward transform
محاسب خطای محاسبات تقریبی fm
% as an example we take the decomposition in the cosine basis
M = 500;
x = peaks(128); y = dct(x); % a sample function
[tmp,I] = sort(abs(y(:)));
y(I(1:end-M)) = 0;
err = norm(y,’fro’)/norm(x,’fro’); % the relative error xx = idct(y); imagesc(xx); % the reconstructed function
تبدیل نوع فرمت تصاویر
bs = 8; % size of the blocks
n = size(x,1); y = zeros(n,n);
nb = n/bs; % n must be a multiple of bs
for i=1:nb for j=1:nb
xsel = ((i-1)*bs+1):(i*bs); ysel = ((j-1)*bs+1):(j*bs);
y(xsel,ysel) = dct(x(xsel,ysel));
end end
انجام عملیات روی بخشی از تصویر بصورت تعاملی
[n,p] = size(M);
imagesc(M);
axis image; axis off;
sp = getrect;
sp(1) = max(floor(sp(1)),1); % xmin sp(2) = max(floor(sp(2)),1); % ymin
sp(3) = min(ceil(sp(1)+sp(3)),p); % xmax sp(4) = min(ceil(sp(2)+sp(4)),n); % ymax
MM = M(sp(2):sp(4), sp(1):sp(3));
نظریه گراف
محاسبه کوتاه ترین مسیر بین هر جفت گره
adjacency matrix).
% non connected vectices must have Inf value
N = length(D);
for k=1:N
D = min(D,repmat(D(:,k),[1 N])+repmat(D(k,:),[N 1]));
end
D1 = D;
تبدیل مثلث به ماتریس
nvert = max(max(face));
nface = length(face);
A = zeros(nvert);
for i=1:nface
A(face(i,1),face(i,2)) = 1; A(face(i,2),face(i,3)) = 1;
A(face(i,3),face(i,1)) = 1;
% make sure that all edges are symmetric
A(face(i,2),face(i,1)) = 1; A(face(i,3),face(i,2)) = 1;
A(face(i,1),face(i,3)) = 1;
end

