آیــتــک

آمـوزش > یـادگیـری > تبـحـر > کــار

آمـوزش > یـادگیـری > تبـحـر > کــار

بِسْمِ اللَّهِ الرَّحْمَنِ الرَّحِیمِ

 

پـردازش تـصـویـر با مـتـلـب

 

 

این پست در حال تکمیل شدنه ...

معلم بنده : استاد زارعی

 

سوال 1 : پردازش تصویر چیه ؟

پردازش تصویر یا  Image Processing،

به پردازش تصویر دیجیتال گفته می شود .

به همین سادگی ...

 

سوال 2 : کاربرد پردازش تصویر چیه ؟

- پردازش تصویر کاربرد های بسایر زیاد و مفیدی داره !

- خب حالا چیا هس ؟

- من چند نمونشو میگم ، اگر نه خیلی زیادن .

- اشکالی نداره بگو !

- " تشخیص حرکت در دزدگیرها،

تشخیص اثر انگشت،

تشخیص چهره و امضا

تشخیص و رهگیری خودکار اهداف متحرک یا ثابت از هوا یا از زمین

 ارتقا و تحلیل تصاویر هوایی و ماهواره ای که در کاربردهای نقشه برداری، کشاورزی، هواشناسی و موارد دیگر مفید هستند.

 تفکیک محصولات مختلف بر اساس شکل یا اندازه،

آشکار سازی نواقص و شکستگی های موجود در محصولات،

 ارسال تصاویر تلویزیون با کیفیت بالا

 ارسال تصاویر متحرک و زنده از روی شبکه اینترنت و یا خط تلفن

تصویر برداری از اسناد و ارسال آنها توسط دورنگار 

تشخیص خودکار نویسه و ... "
 

هر پیکسل 16 بیت حافظه میخواد تا از 0 تا 255 رو داخل خودش بریزه و ذخیره کنه .

0 نشونه سیاه و 255 نشونه سفیده ، این مربوط میشه به تصاویر سیاه و سفید .

در تصاویر رنگی هر پیکسل از ترکیب سه رنگ Red Green Blue به وجود آمده ،

یعنی سه ماتریس یا سه عدد یا ... ( انواع مختلفی برای ذخیره سازی رنگ ها وجود دارد )

 

چند نکته مهم در مــتــلــب :

نکته 1 : کجا باید کد بزنم ؟

ما دو جا برای نوشتن کد داریم : 1- اسکریپت 2- کامند

1- Script : میتونید ذخیرش کنید و اونو توسعه بدید و دیباگ کنید و ...

2- Command : هر خطی بنویسید در جا اجرا میشه و نمیشه ذخیرش کرد و فقط اون موقع بدردتون میخوره !

 

نکته 2 : سمیکالن ، بودن یا نبودن !

اگر سمیکالن ( ; ) بگذارید ، کد شما در پس زمینه اجرا و مراحل انجام کد را نشان نمی دهد .

اگر سمیکالن ( ; ) نگذارید ، کد شما در جلوی چشمتان اجرا و تمامی عملیات های در حال انجام را نشانتان می دهد .

 

نکته 3 : یه خبر خوب ، متلب  ...

متلب اوپن سورسه ( Open Source ) ، یعنی تمامی فانکشن هاشو میتونید ببینید و دستکاری کنید .

 

نکته 4 : میانبر های متلب

میانبر های کابردی متلب به شرح ذیل است :

F5 = اجرا کردن کل کد

F1 = مشاهده اطلاعات فانکشن

F9 = اجرا کردن قسمت انتخاب شده کد

F10 = اجرای خط بعدی در دیباگ کردن

Ctrl + r = کامنت ( توضیح ) کردن بخش انتخاب شده

Ctrl + t = خارج کردن بخش انتخاب شده از حالت کامنت ( توضیح )

Ctrl + n = ایجاد یک اسکریپت جدید خالی

Ctrl + d = مشاهده کد فانکشن ( متلب اوپن سورسه ! )

Ctrl + s = ذخیره اسکریپت ( البته خودش به صورت خودکار طی هر عملیاتی سیو میکنه )

 

نکته 5 : مواظب نوشتنت باش !

برای متلب CLC با clc فرق می کنه ، یکنی روی کپیتال نوشتن حروف حساسه !

 

نکته 6 : اسم متغیر چارچوب خودشو داره :

اول اینکه شروع اسم گذاری همیشه با کاراکتر شروع میشود.

هرگز نباید بین کارکترها از فاصله یا SPACE استفاده کنیم.

نباید از اسامی رزرو شده در متلب جهت اسم گذاری استفاده شود. اسامی رزرو شده، اسامی ای هستند که وقتی آنها را تایپ میکنید به رنگ آبی در می آیند. مانند FUNCTION یا FOR یا مواردی از این دست.

به هیچ عنوان نباید از توابع پیشفرضی که در یک SCRIPT استفاده کرده اید بعنوان نام متغیر در همان SCRIPT استفاده کنید. در این حالت آن تابع خاصیت خودش را از دست خواهد داد و به یک متغیر تبدیل میشود.

به هیچ وجه از نام توابع پیشفرض برای اسم گذاری FUNCTION ها و SCRIPT ها استفاده نکنید.

اگر شک داشتید نامی که میخواهید از آن برای نامگذاری استفاده کنید جزء توابع پیشفرض هست یا خیر، به راحتی میتوانید آن نام را در Help متلب جستجو کنید.

 

برای تعریف یک آرایه در متلب به صورت زیر قطعه ای کد می نویسیم :

arr = [1 2 3 4 5 6 7 8 9];

 

برای تعریف یک ماتریس به سایز های x و y که همه مقدار هایش صف و یا یک است اینچنین می کنیم :

% ماتریسی ایکس در ایکس به مقادیر صفر
mat = zeros(x);
% ماتریسی ایکس در وای به مقادیر صفر
mat = zeros(x,y);
% ماتریسی ایکس در وای به مقادیر یک
mat = ones(x,y);

 

حال برای تغییر یک یک اعضا و یا محدوده ای از اعضای آرایه باید این کد را بنویسیم :

% همه رو بذار صد
mat(:,:) = 100 ;
% ردیف ده و همه ستون ها را بذار صد
mat(10,:) = 100 ;
% ردیف پنج ستون چهار رو بذار صد
mat(5,4) = 100 ;
% از ردیف هشتاد تا صد ستون پنجاه را بذار صد
mat(80:100,50) = 100 ;
% از ردیف صد تا دویست را و از ستون پنجاه تا سیصد را بذار صد
mat(100:200,50:300) = 100 ;

 

خب حالا باید بتونیم این ماتریس رو نشون بدیم این دستور این کارو انجام میده :

plot(mat);

 

حالا برای تمرین یک نمودار سینوسی را ایجاد و نشان میدهیم :

x=0:0.1:6;
y=sin(x);
plot(x,y);

 

برا اینکه یه نفس راحت بکشی و محیط کامند رو تمیز کنی اینو اجرا کن :

clc

 

میرسیم به حذف متغیر از ورک اسپیس ( Work space )  که اینگونه می باشد ( var یک متغیر است ) :

% پاک کردن فقط ور
clear var;
% پاک کردن همه متغیر ها
clear all;

 

اگه هم میخوای پنجره هایی که تو متلب باز شده رو ببندی ، با این ببند :

% بستن فقط فیگر یک
close figure 1;
% بستن همه پنجره ها
close all;

 

میریم سراغ اصل مطلب / متلب ، یعنی :

خـــوانـــدن تـــصـــویـــر

که به شکل زیر و با تابع imread انجام میشه ؛ ما داریم توی قطعه کد زیر ، یه تصویر رو به نام cameraman.tif میخونیم و میریزیم توی متغیر img .

img = imread('cameraman.tif');

# توجه داشته باشید درون کوتیشن ( ' ) ها باید آدرس مستقیم تصویر رو که میتونید با کلیک راست کردن روی تصویر و انتخاب گزینه properties سپس در بخش security ، جلوی Object name آدرس مستقیم را مشاهده کنید . اما یک سری تصاویر را مانند همین مثال ما خود متلب میشناسه و نیازی به آدرس دادن نیست ، برای مشاهده این تصاویر میتوانید به پوشه نصب متلب و سپس به آدرس مقابل بروید : Matlab\toolbox\images\imdata    برای مثال قطعه کد زیر خواندن تصویری دلخواه است :

img = imread('C:\Users\Mohammad Sadegh\Pictures\si\aks.jpg');

 

میریم سراغ اون یکی اصل مطلب / متلب ، یعنی :

نــمایــش تـــصـــویـــر

که به شکل زیر و با تابع imshow انجام میشه ؛ ما داریم توی قطعه کد زیر ، یه تصویر رو که توی img ریخته بودیم را نشون میدیم .

imshow(img);

خب الان تصویر توی یک فیگر ( figure ) باز شده ، متلب خودش شماره گذاری میکنه فیگر ها رو ، اما اگه بخواید شخصی سازیش کنید شمارشو باید اینجوری بنویسید کد نمایش رو ، الان توی یک فیگری با شماره 10 تصویرتون رو نمایش میده :

figure(10),imshow(img);

 

این دستور ورژن و اطلاعات نرم افزار متلب شما رو نشون میده :

ver

 

اگر میخواستید توضیح یک دستور براتون وا بشه ، جدای از اون میانبر ، میتونید از این استفاده کنید ( به جای name اسم دستور رو بذارید ) :

doc name;

 

برای تغییر و یا تعریف نوع یک متغیر آن را درون پرانتز های بعد از نوع متغیر می نویسیم ، اینجوری :

% ایکس یک متغیر است
uint8(x);

 

اگر کمترین و یا بیشترین المان در المان های بسیار را بیابیم ، از این دو فانکشن استفاده می کنیم ( var همان متغیر ماست که می تواند ماتریس ، آرایه تصویر و ... باشد  :

% کمترین
min(var);
% بیشترین
max(var);

 

اگر بعد از نام یک ماتریس کوتیشن ( ' ) بزنیم ، ماریس 90 درجه می چرخد :

mat = mat';

 

میریم سراغ بحث مهم و جذاب :

چــرخــش تــصــویــر

 

 

که خود متلب براش تابع های زیادی از قبیل کد های زیر داره ، اما ما میخوایم خودمون بنوسیمش :

img = imrotate(img,90,'bilinear');
img = rot(90,img);

 

اما کاری که ما میخواهیم انجام بدهیم اینه که :

با استفاده از یک حلقه تک تک ردیف های تصویر را انتخاب کنیم ، سپس با کوتیشن بچرخانیم ، و آن ها را درون ماتریس خالی چرخیده شده جدید پشت سر هم قرار دهیم تا تصویر 90 درجه بچرخد :

figure(1),imshow(img,[]);
imr = zeros(size(img));
imr = imr';
row = size(img,1);
for k = 1:row
    temp = img(k,:);
    temp = temp';
    imr(:,row-k+1) = temp;
end
figure(2),imshow(imr,[]);

# نکته : [] در تابع imshow نقش normalise کردن تصویر را دارد ، در ادامه به کارمان خواهد آمد !

 

حال برای تصاویر رنگی از کد بالا برای هر کانال رنگ آن استفاده میکنیم ؛ اما چگونه ؟

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

 

stop 

 

بگذارید اول یاد بگیریم چجوری یک فانکشن بنویسیم :

%  نام فانکشن می شود ایکس
% ورودی می شود وای
%  خروجی میشود زد
% اند نشانه پایان یک بخش است

function z = x(y)
end

 

Continue

 

خب حالا ما تابعی داریم به نام rot90g و میخواهیم ازش توی کد چرخش تصویر رنگی استفاده کنیم  :

%  ابتدا هر سه رنگ عکس از هم جدا می شوند
% سپس هر یک توسط فانکشن چرخانده میشود
%  سپس هر سه به هم می پیوندند و تصویر رنگی چرخیده شده به نمایش در می آید
% اند نشانه پایان یک بخش است

figure(1),imshow(img,[]);
R = img(:,:,1);
G = img(:,:,2);
B = img(:,:,3);
Rr = rot90g(R);
Gr = rot90g(G);
Br = rot90g(B);
imr(:,:,1) = Rr;
imr(:,:,2) = Gr;
imr(:,:,3) = Br;
figure(2),imshow(imr,[]);

 

اما یه راه ساده تر هم هست ( 9 خط رو تو 3 خط خلاصه می کنیم ) :

%  ابتدا هر سه رنگ عکس از هم جدا می شوند
% سپس هر یک توسط فانکشن چرخانده میشود 
% سپس هر سه به هم می پیوندند و
% تصویر رنگی چرخیده شده به نمایش در می آید

figure(1),imshow(img,[]);
imr(:,:,1) = rot90g(img(:,:,1));
imr(:,:,2) = rot90g(img(:,:,2));
imr(:,:,3) = rot90g(img(:,:,3));
figure(2),imshow(imr,[]);

 

اما مبحث بعدیمون :

آیــیــنــه‌ای کــردن تــصــویــر

 

 

البته خود متلب براش تابع داره ، اما ما بازم میخوایم خودمون بنوسیمش ؛ با استفاده از یک حلقه تک تک ردیف های تصویر را انتخاب کنیم ، سپس همه را از آخر به اول بچینیم ! آنوقت این اتفاق محقق می شود ، ؛ در زیر دو کد Mirror Left-Right و Mirror Up_Dawn را مشاهده می کنید :

Mirror Left-Right :

figure(1),imshow(img,[]);
imr = zeros(size(img));
col = size(img,2);
for k = 1:col
    temp = img(:,k);
    imr(:,col-k+1) = temp;
end
figure(2),imshow(imr,[]);

 

Mirror Up_Down :

figure(1),imshow(img,[]);
imr = zeros(size(img));
row = size(img,1);
for k = 1:row
    temp = img(k,:);
    imr(row-k+1,:) = temp;
end
figure(2),imshow(imr,[]);

# نکته : این کد های بالا روی تصاویر سیاه و سفید عمل می کنند ، برای اعمال بر روی تصاویر رنگی ،

این کد را بدون فیگر ها در یک فانکشن به نام دلخواه ( در اینجا به نام mirlr می‌باشد )

 نوشته و به نحو زیر برای هر لایه رنگ تصویر رنگی این کد را عملی میکنیم :

figure(1),imshow(img,[]);
imr(:,:,1) = mirlr(img(:,:,1));
imr(:,:,2) = mirlr(img(:,:,2));
imr(:,:,3) = mirlr(img(:,:,3));
figure(2),imshow(imr,[]);

و همینطور برای Up-Down :

figure(1),imshow(img,[]);
imr(:,:,1) = mirup(img(:,:,1));
imr(:,:,2) = mirup(img(:,:,2));
imr(:,:,3) = mirup(img(:,:,3));
figure(2),imshow(imr,[])

در این اینجا با چند دستور ساده آشنا میشیم ، اولیش اینه که برای ایجاد یک ماتریس

با امکان مشخص کردن ردیف ها و ستون ها کدی همانند این میزنیم :

a = [1:3;4:6;7:9]
% خروجی
% 1 2 3
% 4 5 6
% 7 8 9

حال متغیری همانند همان تعیین می کنیم ، هدف ما از این کار این است که

در ادامه این دو ماتریس را به یکدیگر بچسبانیم ، این کار با دستور cat صورت می گیرد ،

اگر مقدار اولی را 1 بدهیم به سمت راست ماتریس می چسبد و اگر 2 بدهیم به پایین و

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

نمونه کد خروجی آن بدین صورت است :

c = cat(1,a,b)
% خروجی
 % 1 2 3 1 2 3 
 % 4 5 6 4 5 6 
 % 7 8 9 7 8 9 

d = cat(2,a,b)
% خروجی
% 1 2 3
% 4 5 6
% 7 8 9
% 1 2 3
% 4 5 6
% 7 8 9

دستور بعدی که بسیار در ایجاد نویز و بسیاری از کار ها کاربرد دارد ، دستور rand می باشد ؛

کار این ، تولید اعداد رندوم بین صفر و یک است

( در صورتی که به اعداد بین 0 تا 8 یا 0 تا 100 یا ... نیاز بود ، همه اعداد را در 8 یا 100 یا ... ضرب می کنیم ) 

نمونه کار این دستور همراه با خروجی آن در کد زیر آمده است :

a = rand(5)
% خروجی
% 0.8147    0.0975    0.1576    0.1419    0.6557 
% 0.9058    0.2785    0.9706    0.4218    0.0357
% 0.1270    0.5469    0.9572    0.9157    0.8491
% 0.9134    0.9575    0.4854    0.7922    0.9340
% 0.6324    0.9649    0.8003    0.9595    0.6787

خوب است در اینجا اشاره ای هم به دستور isequal بشه که کارش اینه که بررسی کنه که آیا دو تا چیز

کاملا با هم یکی اند یا نه ؛ اگر کاملا شبیه به هم باشند مقدار 1 و در غیر اینصورت مقدار 0 را خروجی خواهد داد :

isequal(a,b)
% خروجی یا 0 است یا 1

 

این شما و این هم :

رمــــز نگـــاری تــصــویــر

 

 

خب ، به بحث جذابی رسیدیم ، در اینجا ما نیاز به دونستن دستورات قبلی ذکر شده داریم

که انشاءالله خوب یاد گرفتید ، ما این کار را به انواع مختلفی می توان انجام دهیم ،

یکی از روش ها اضافه کردن یک ماتریس رمز به ماتریس تصویر اصلی ،

می تواند ماتریس رمز ما یکسری اعداد رندوم باشند ، در انتها تصویر رمز گذاری شده

تفاوت محسوسی با تصویر اصلی نمی کند ، ( اگر هم مشهود بود باید مقادیر رمز خود را

بر عددی بزرگ تقسیم کنید تا خیلی حس نشوند ) با این حال اگر با دستور isequal دو تصویر را مقایسه کنید ،

مقدار 0 را به شما بر می گرداند ؛ اگر تصویر به دست آمده را منهای تصویر اصلی بکنیم ،

ماتریس رمز ما پیدا خواهد شد ، فراموش نشود نوع ماتریس ها از قبیل دوبل و آنساین مهم است و در انتها رمز را باید ضرب در

اون عددی بکنیم که در ابتدا تقسیم نموده ایم ،بدین ترتیب رمزی را پنهان و آشکار می کنیم که خود ،

می تواند تصویری دیگر باشد نمونه کد این عملیات در زیر آمده است :

img = imread('cameraman.tif');
imr = rand(size(img));
imd = double(img);
iml = im2double(img);
imc = imr +imd;
figure(1),imshow(imc,[]);
isequal(imc,img)

و اما این ماتریس رمز می تواند ماتریس یاز مجموعه اعداد اسکی باشد ، Ascii کد هایی هستند

قرار دادی که برای هر یک از کاراکتر های انگلیسی اختصاصی شدند ؛ یک سایت خیلی خوب برای تبدیل

این کد ها ، سایت https://www.dcode.fr/ascii-code  هستش ، سایت های دیگری نیز موجود است !

برای مثال a = 97 و b = 98 و ... ، در زیر جدول کد های آن را می توانید مشاهده کنید :

ASCII code 32 = space ( Space )
ASCII code 33 = ! ( Exclamation mark )
ASCII code 34 = " ( Double quotes ; Quotation mark ; speech marks )
ASCII code 35 = # ( Number sign )
ASCII code 36 = $ ( Dollar sign )
ASCII code 37 = % ( Percent sign )
ASCII code 38 = & ( Ampersand )
ASCII code 39 = ' ( Single quote or Apostrophe )
ASCII code 40 = ( ( round brackets or parentheses, opening round bracket )
ASCII code 41 = ) ( parentheses or round brackets, closing parentheses )
ASCII code 42 = * ( Asterisk )
ASCII code 43 = + ( Plus sign )
ASCII code 44 = , ( Comma )
ASCII code 45 = - ( Hyphen , minus sign )
ASCII code 46 = . ( Dot, full stop )
ASCII code 47 = / ( Slash , forward slash , fraction bar , division slash )
ASCII code 48 = 0 ( number zero )
ASCII code 49 = 1 ( number one )
ASCII code 50 = 2 ( number two )
ASCII code 51 = 3 ( number three )
ASCII code 52 = 4 ( number four )
ASCII code 53 = 5 ( number five )
ASCII code 54 = 6 ( number six )
ASCII code 55 = 7 ( number seven )
ASCII code 56 = 8 ( number eight )
ASCII code 57 = 9 ( number nine )
ASCII code 58 = : ( Colon )
ASCII code 59 = ; ( Semicolon )
ASCII code 60 = < ( Less-than sign )
ASCII code 61 = = ( Equals sign )
ASCII code 62 = > ( Greater-than sign ; Inequality )
ASCII code 63 = ? ( Question mark )
ASCII code 64 = @ ( At sign )
ASCII code 65 = A ( Capital letter A )
ASCII code 66 = B ( Capital letter B )
ASCII code 67 = C ( Capital letter C )
ASCII code 68 = D ( Capital letter D )
ASCII code 69 = E ( Capital letter E )
ASCII code 70 = F ( Capital letter F )
ASCII code 71 = G ( Capital letter G )
ASCII code 72 = H ( Capital letter H )
ASCII code 73 = I ( Capital letter I )
ASCII code 74 = J ( Capital letter J )
ASCII code 75 = K ( Capital letter K )
ASCII code 76 = L ( Capital letter L )
ASCII code 77 = M ( Capital letter M )
ASCII code 78 = N ( Capital letter N )
ASCII code 79 = O ( Capital letter O )
ASCII code 80 = P ( Capital letter P )
ASCII code 81 = Q ( Capital letter Q )
ASCII code 82 = R ( Capital letter R )
ASCII code 83 = S ( Capital letter S )
ASCII code 84 = T ( Capital letter T )
ASCII code 85 = U ( Capital letter U )
ASCII code 86 = V ( Capital letter V )
ASCII code 87 = W ( Capital letter W )
ASCII code 88 = X ( Capital letter X )
ASCII code 89 = Y ( Capital letter Y )
ASCII code 90 = Z ( Capital letter Z )
ASCII code 91 = [ ( square brackets or box brackets, opening bracket )
ASCII code 92 = \ ( Backslash , reverse slash )
ASCII code 93 = ] ( box brackets or square brackets, closing bracket )
ASCII code 94 = ^ ( Circumflex accent or Caret )
ASCII code 95 = _ ( underscore , understrike , underbar or low line )
ASCII code 96 = ` ( Grave accent )
ASCII code 97 = a ( Lowercase letter a , minuscule a )
ASCII code 98 = b ( Lowercase letter b , minuscule b )
ASCII code 99 = c ( Lowercase letter c , minuscule c )
ASCII code 100 = d ( Lowercase letter d , minuscule d )
ASCII code 101 = e ( Lowercase letter e , minuscule e )
ASCII code 102 = f ( Lowercase letter f , minuscule f )
ASCII code 103 = g ( Lowercase letter g , minuscule g )
ASCII code 104 = h ( Lowercase letter h , minuscule h )
ASCII code 105 = i ( Lowercase letter i , minuscule i )
ASCII code 106 = j ( Lowercase letter j , minuscule j )
ASCII code 107 = k ( Lowercase letter k , minuscule k )
ASCII code 108 = l ( Lowercase letter l , minuscule l )
ASCII code 109 = m ( Lowercase letter m , minuscule m )
ASCII code 110 = n ( Lowercase letter n , minuscule n )
ASCII code 111 = o ( Lowercase letter o , minuscule o )
ASCII code 112 = p ( Lowercase letter p , minuscule p )
ASCII code 113 = q ( Lowercase letter q , minuscule q )
ASCII code 114 = r ( Lowercase letter r , minuscule r )
ASCII code 115 = s ( Lowercase letter s , minuscule s )
ASCII code 116 = t ( Lowercase letter t , minuscule t )
ASCII code 117 = u ( Lowercase letter u , minuscule u )
ASCII code 118 = v ( Lowercase letter v , minuscule v )
ASCII code 119 = w ( Lowercase letter w , minuscule w )
ASCII code 120 = x ( Lowercase letter x , minuscule x )
ASCII code 121 = y ( Lowercase letter y , minuscule y )
ASCII code 122 = z ( Lowercase letter z , minuscule z )
ASCII code 123 = { ( braces or curly brackets, opening braces )
ASCII code 124 = | ( vertical-bar, vbar, vertical line or vertical slash )
ASCII code 125 = } ( curly brackets or braces, closing curly brackets )
ASCII code 126 = ~ ( Tilde ; swung dash )

 

حال ما قطعه کدی داریم که کدی اسکی را میگیرد و تصویری رمز نگاری شده

تحویلمان می دهد و در انتها با کم کردن تصویر اصلی دوباره رمز را پیدا می کند :

% رمز نگاری
img = double(imread('cameraman.tif'));
please = 'Please enter the text : \n';
ramz = str2num(input(please,'s'));
text = zeros(1,numel(img));
text(1:size(ramz,2)) = ramz/256;
text = reshape(text,size(img));
imc = text + img;
imwrite(imc,'cod.tif');

% رمز گشایی
imd = imc - img;
imd = imd*256;
imwrite(imd,'dec.tif');

figure(1),imshow(img,[]);
title ('Original');
figure(2),imshow(text,[]);
title ('Cryp');
figure(3),imshow(imc,[]);
title ('Encryption');
figure(4),imshow(imd,[]);
title ('Decoding');

 

این قطعه کد نتایج بهتری را خروجی میده و کامل تره :

% رمز نگاری
img = double(imread('cameraman.tif'));
please = 'Please enter the text : \n';
ramz = str2num(input(please,'s'));
text = zeros(1,numel(img));
text(1:size(ramz,2)) = ramz/256;
text = reshape(text,size(img));
imc = text + img;
imwrite(imc,'cod.tif');

% رمز گشایی
imd = imc - img;
imd = imd*256;
imwrite(imd,'dec.tif');
icw = reshape(imd,[1,numel(imd)]);
icw = nonzeros(icw);
icw = icw';
raz = chfts2asciiar(icw);
save = fopen('raz.txt','w');
fprintf(save,raz);
fclose(save);

figure(1),imshow(img,[]);
title ('Original');
figure(2),imshow(text,[]);
title ('Cryp');
figure(3),imshow(imc,[]);
title ('Encryption');
figure(4),imshow(imd,[]);
title ('Decoding');

 

توجه ! در قطعه کد بالا از چند دستور و فانکشن جدید استفده کردیم که کاربرد آنها به شرح ذیل است :

double : تغییر نوع متغیر از هرچی به دوبل

str2num : تغییر نوع متغیر متنی به عددی 

reshape : تغییر شکل و نسبت ابعاد ماتریس *

imwrite : ذخیره کردن یک تصویر در متلب

title : عنوان فیگر بالایی را مشخص می کند !

numel : تعداد عناصر ماتریس را بر می گرداند

prod : مقادیر داخل خوشو در هم ضرب میکنه

* : نمونه کار دستور ریشیپ که استفاده شد در زیر آمده است :

a = [1 2 3 4 5 6 7 8 9];
b = reshape(a,[3,3]);
% نمونه ورودی
% a = [1 2 3 4 5 6 7 8 9]
% نمونه خروجی
% b = [
% 1 2 3
% 4 5 6
% 7 8 9 ]

 

شما می توانید تمامی کد ها را رایگان دانلود کنید :

 

# توجه : jc در نام کد ها به معنی فقط کد است (بدون فیگر نمایش )

# توجه : g به معنای سیاه و سفید و c به معنای رنگی بودن تصویر است

# برای اجرای فانکشن ها همه کد ها باید کنار یکدیگر باشند

 

نام فایل لینک دریافت
mst_rot_90.m دانلود
mst_rot_90_jc.m دانلود
mst_rot_90_g.m دانلود
mst_rot_90_g_jc.m دانلود
mst_rot_90_c.m دانلود
mst_rot_90_c_jc.m دانلود
mst_mir_lr.m دانلود
mst_mir_lr_jc.m دانلود
mst_mir_ud.m دانلود
mst_mir_ud_jc.m دانلود
mst_mir_lr_g.m دانلود
mst_mir_lr_g_jc.m دانلود
mst_mir_lr_c.m دانلود
mst_mir_lr_c_jc.m دانلود
mst_mir_ud_g.m دانلود
mst_mir_ud_g_jc.m دانلود
mst_mir_ud_c.m دانلود
mst_mir_ud_c_jc.m دانلود
mst_rot_180_g.m دانلود
mst_rot_180_g_jc.m دانلود
mst_rot_180_c.m دانلود
mst_rot_180_c_jc.m دانلود
mst_rot_270_g.m دانلود
mst_rot_270_g_jc.m دانلود
mst_rot_270_c.m دانلود
mst_rot_270_c_jc.m دانلود
دریافت همه به صورت یکجا دانلود

 

ارسال نظر

کاربران بیان میتوانند بدون نیاز به تأیید، نظرات خود را ارسال کنند.
اگر قبلا در بیان ثبت نام کرده اید لطفا ابتدا وارد شوید، در غیر این صورت می توانید ثبت نام کنید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی

تعداد نظرات : ۶ تا

الان من ی سوال برام ایجاد شد 
ما یک عکس را با imread میخوانیم و یک ماتریسم میتونیم تعریف کنیم با مقادیر مشخص
حالا اگه ما بخوایم یک عکس را در یک ماتریس ذخیره کنیم چجوریه؟
بعد حالا اگه این ماتریس رو مثلا بگیم حتما سه سطر و چهارمیلیون ستون باشه دقیقا چجوری باید کدشو بزنیم؟

پاسخ:
خب متغیری با همون مقادیری که میفرمایید تعریف میکنید که میشه یه ماتریس خالی حالا با یه حلقه فور یا همون مساوی عکستونو میریزید توش، ]3;40000000[ اینطور میشه دیگه؟!
  • علی کشاورز
  • ان شاءالله

    منم یکماه دیگه امتحاناتم شروع میشه 

    ازالان باید بخونم

    پاسخ:
    خیلی ممنون ، اگر عمری بود در آینده ...

    وبلاگ خوبی داری

    به منم یه سر بزن

    پاسخ:
    نظر لطفتونه
    بر روی چشم
  • علی کشاورز
  • سلام

    واقعا این پست زحمت زیادی داشت

    ولی من هیچی سر در نمیارم مثل همیشه :)

    پاسخ:
    سلام
    ممنون ، داره کامل تر هم میشه !
    مشکلی نیست ، راستی من اون موضوع را فراموش نکردم حقیقتا تا 20 دی همینجوری امتحان داریم !
    ان شاءالله در خدمتتون خواهم بود ...

    سلام ممنون بابت زحمتی که کشیدی .. من از متلب هیچی سر در نمیارم ولی این کارت چون انقدر وقت گذاشتی و نوشتی قابل تقدیره :)

    پاسخ:
    وااااااااااااااااای مممممنون انشاءالله مفید باشه !
  • ehsangold ehsangold
  • بخش‌هایی از این نظر که با * مشخص شده، توسط مدیر سایت حذف شده است

    خیلی خوب توضیح دادید

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

    حوزه تصویر خیلی خیلی جذاب هست و کار تو این زمینه برای انجام دادن زیاده

    *** **** ******* ** **** ***** ** **** **** *** ** **** ***** ** **** ** **** ** **** ** ** ** *****

    ****** **** * **** ****** *** *** *** ******** ****

    پاسخ:
    خیلی مچکرم !
    خیلی هم عالی !

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

    دنبال کنندگان ۲۵۰ + نفر
    ما را همراهی کنید !