matlab常用代码总结
生活随笔
收集整理的這篇文章主要介紹了
matlab常用代码总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- imshow 整理關于復數
如果用imshow(a),而且a是復數矩陣,則按照a的實部處理。
用imshow(abs(a)),則是按a的模處理。
- 循環讀取多張圖片
循環讀取圖片
第一種方法①
第二種方法②
I=ones(8,5); q=reshape(49:56,8,1); I(:,1)=q; I(:,2)='.'; I(:,3)='b'; I(:,4)='m'; I(:,5)='p'; L=setstr(I); %將ASCII碼轉為字符串;第三種方法③
images= [ ]; fo r i= 1:M str= strcat ('D: \MATLAB\work\', int2str(i) , ’.bmp’) ; % 連接字符串形成圖像的文件名。 img= imread(str); [rows cols]= size(img) ; % 獲得圖像的行和列值。 temp= reshape ( img, rows*cols, 1) ; % 創建一個(N1*N2)×1 矩陣。 images= [ images temp ]; % 完成循環后的images 矩陣是一個(N 13 N 2) ×M 矩陣。 end這是搜集整理的知識。
上述三種方法中,第一種主要利用dir()函數,獲得文件夾內圖片的信息,然后創建一個元胞數組,將圖片文件信息送入元胞數組
第二種方法是已知圖片文件名,并且按數字順序排列,然后利用數字和字符串之間的轉換來進行。
第三種方法利用字符串連接函數strcat()函數巧妙運用循環實現圖片的連續讀入。
- 移動矩陣內部元素
circshift(A,[2 3]) % A矩陣向下移動2,向右移動1, 整體移動,擠走的占據多出的位置- 處理數據,同時讀取多個文件
clear clc %% % Onm=cell(1,7); getfilename=ls('C:\Users\feifei\Desktop\*.xl*'); %取目錄下所有excel文件的文件名(.xls或.xlsx) filename = cellstr(getfilename); %將字符型數組轉換為cell型數組 num_of_files = length(filename); %excel文件數目 for i=1:num_of_files %循環讀入excel數據并存入結構體database中 database(i) = struct('Name',filename{i},'Data',xlsread(filename{i})); end%% for i=1:num_of_files database(i).Data=mean(database(i).Data,2);xx=1551:1575;% subplot(2,4,i); %分成2×2區域且指定1號為活動區%figure('Name',filename{i});plot(xx,database(i).Data,'linewidth',3,'markersize',16)title(filename{i}) %%%axis ([1550 1570 -1 2]); xtickk=1550:10:1575%%set(gca,'xticklabel',xtickk); end- 找到二維矩陣中最大的數,從小到大一維排列
clc clear a=[1 34 5; 5 5 66; 6 89 3];% 方法1 s=size(a) b=reshape(a , 1 ,s(1)*s(2)) c=sort(b)% 方法2 % [c,index]=sort(a(:),'descend') % [Xaxis,Yaxis]=find(c>=10)- 找出2維中大于100的的數,求和
%找出2維中大于100的的數,求和clear clcI=imread('C:\Users\Administrator\Desktop\readtest\timg.jpg'); if ndims(I) == 3%如果圖片是3維(彩圖)I = rgb2gray(I);%轉成灰圖 end %結束[row,col]=find(I>=100); aaa=[row,col]; %aaa是大于100的位置 [irow icol]=size(col); %為了把irow拿出來,就是一共有多少個大于100的數,有多少行就有多少個 % imshow(I); %展示圖片 I = double(I);all=0; for i=1:irowall=I(row(i),col(i))+all; end all- 二維矩陣中,把設定的圓中的數取出來,剩下的為0
% 功能:在一個二維矩陣中,把設定的圓中的數取出來,剩下的為0 % 原理:逐個計算每個點和圓心的距離,大于半徑則舍棄,小于等于半徑則保留function [get_cir]=get_matrix_circle(origin,cir_r,cir_center) %輸入參數介紹: %origin 一個二維圖像, 最好是在0-1之間的double類型的 %cir_r 設定的圓半徑,一個常數 %cir_center 圓心位置行列 eg [5 5] [行 列]%輸出參數介紹: %輸出get_cir 是把輸入的圖像以及制定的圓內的數保留,圓外數為0origin_size=size(origin); origin_r=origin_size(1); %總行數 origin_c=origin_size(2); %總列數get_cir=[]; %取出的圓內元素值 for i=1:origin_rfor j=1:origin_ctemp=[i j];if norm(cir_center-temp)<=cir_r %norm為范數函數,默認2-范數,用來求兩點距離get_cir(i,j)=origin(i,j); %符合條件的元素值elseget_cir(i,j)=0; %沒有在園內的,則為0endend end- show變成百分數
%%變成百分數 x=2.1/3; disp([num2str(x*100),'%'])- 多張圖讀取,截取,求梯度
clear clc dList =dir('E:\2017-09-11\2\*.jpg'); %如需其它圖片格式支持,可以自己【重載dir()】函數,實現查找所有圖片文件的功能, %如果圖片是其它路徑,可以用 ["路徑" ".擴展名"] 字符串來實現。 len =length(dList); image_data=cell(1,len); %定義一個元胞數組存放圖像 for i=1:1:lendList(i).name=strcat('E:\2017-09-11\2\',dList(i).name); %圖片名和路徑名的字符串連接起來image_data{i}=imread(dList(i).name);%figure,imshow(image_data{i});title(dList(i).name); %展示圖片if ndims(image_data{i}) == 3%如果圖片是3維(彩圖)image_data{i} = rgb2gray(image_data{i});%轉成灰圖end %結束Inew=image_data{i}(218:500,238:500);% 2文件夾Inewdou=double(Inew);[x,y]=gradient(Inewdou); %獲取梯度t=sqrt(x.^2+y.^2); G=Inewdou;G(t>=2)=0; %梯度提取邊緣 畫黑G(t<2)=255;G=uint8(G);% figure,imshow(G);title(dList(i).name);all(i)=sum(G(:)==0); end xx=1:len; plot(xx,all,'.-','linewidth',1,'markersize',16) all=all'- 傅里葉頻域一塊也可以復原
% 測試了傅里葉變化中 % 頻率域中取一小塊也能還原出原來的圖像 % 傅里葉域中的高頻部分還原出來的圖像的梯度大的部分,邊緣部分 % 傅里葉域中的低頻部分還原出來的圖像的梯度小的部分I = imresize(imread('Fig0206(a)(rose-original).tif'),[256,256]); J =fftshift(fft2(I));%復數物的傅里葉譜 filter=zeros(256); % filter([1:64,192:256],[1:64,192:256])=1; filter([120:140],[120:140])=1;final = filter .* J; ori = ifft2 (ifftshift(final)); figure,imshow(ori,[])- 關于ifftshift的問題
clc clear %實際的強度 Image_abs= imresize(imread('cameraman.tif'),[256,256]); Image_abs = mat2gray(Image_abs); %實際的相位 Image_angle= imresize(imread('westconcordorthophoto.png'),[256,256]); % Image_angle= zeros(256); Image_angle = 2*pi*mat2gray(Image_angle)-pi; %復數的輸入實際圖像 Image = Image_abs.*exp(1i.*Image_angle); %% 測試一 % 事實說明 % 開始變化到頻譜加上fftshift的話 % 在變化到物空間的時候要先加上ifftshift % 否則,相位會變壞。振幅不受影響。Image_fft=fftshift(fft2(Image));%物的頻譜image_1=ifft2(ifftshift(Image_fft));% image_2=ifft2((Image_fft));%figure,imshow(angle(image_1),[]); figure,imshow(angle(image_2),[]); figure,imshow(abs(image_1),[]); figure,imshow(abs(image_2),[]);%% 測試二 下面是別的大佬waller寫的函數也很好用 F = @(x) ifftshift(fft2(fftshift(x))); %Fourier Transform Ft = @(x) ifftshift(ifft2(fftshift(x))); %Inverse Fourier Transformimage_fft=F(Image);%物的頻譜 image_1=Ft(image_fft);% figure,imshow(log(abs(image_fft)),[]);figure,imshow(log(angle(image_fft)),[]); figure,imshow(abs(image_1),[]);figure,imshow(angle(image_1),[]);- 把一幅圖的數值范圍拉伸到minVal~maxVal之間
adjustScale.m文件
function outputMatrix = adjustScale( inputMatrix, minVal, maxVal ) %把一幅圖的數值范圍拉伸到minVal~maxVal之間 minmum=min(min(inputMatrix)); maxmum=max(max(inputMatrix)); outputMatrix=(inputMatrix-minmum)/(maxmum-minmum); outputMatrix=minVal+outputMatrix*(maxVal-minVal);- 把從文件夾中讀出很多文件的順序按照正常命名的1 2 3…的順序
下面例子:
把imglist 這個結構體中的name正常重新排序
因為sortnat這個函數的輸入輸出是元胞數組,
所以先轉化為元胞,再還原回imglist
sortnat.m如下:
function [CoS,ind,ChA,NuA] = sortnat(CoS,varargin) % Customizable natural-order sort of a cell array of strings. % % (c) 2012 Stephen Cobeldick % % ### Function ### % % Sort the strings in a cell array of strings by character order (ASCII) % and the value of any numeric tokens. % % By default sorts case-insensitive ascending, with integer numeric tokens. % Optional inputs may be used control the format of the numeric tokens % within the strings (see 'Tokens'), case sensitivity and sort direction. % % Syntax: % SortedCellStr = sortnat(CellStr) % [SortedCellStr,SortIndex] = sortnat(CellStr,...); % [...] = sortnat(CellStr,RegExp) % [...] = sortnat(CellStr,RegExp,Case) % [...] = sortnat(CellStr,RegExp,Case,Descend) % [...] = sortnat(CellStr,RegExp,Case,Descend,Format) % % See also SORT SORTROWS UNIQUE CELLSTR REGEXP SSCANF % % ### RegExp Tokens ### % % # A numeric token consists of some combination of digits, may optionally % include a +/- sign, decimal point, exponent, etc. The numeric tokens % must be able to be parsed by "sscanf" (*default format '%f'), and may % be defined by the optional "regexp" regular expression input, eg: % % Regular Expression Example: | Matches Numeric Token: % ----------------------------|--------------------------------- % '\d+' | integer (*default). % ----------------------------|--------------------------------- % '(-|+)?\d+' | integer with optional +/- sign. % ----------------------------|--------------------------------- % '\d+(\.\d+)?' | integer or decimal. % ----------------------------|--------------------------------- % \d+|inf | integer or infinite value. % ----------------------------|--------------------------------- % '(-|+)\d+\.\d+' | decimal with +/- sign. % ----------------------------|--------------------------------- % '\d+e\d+' | exponential. % ----------------------------|--------------------------------- % '[1-9]\d*|(?<=0?)0(?!\d)' | integer excluding leading zeros. % % # A character is any other single character: all other characters not % matching the "regexp" pattern, including space & non-printing characters. % % ### Examples (comparison with "sort") ### % % # Integer numeric tokens: % % A = {'File2.txt','File10.txt','File1.txt'}; % sort(A) % ans = {'File1.txt','File10.txt','File2.txt'} % sortnat(A) % ans = {'File1.txt','File2.txt','File10.txt'} % % # Integer or decimal numeric tokens, possibly with +/- signs: % % B = {'File102.txt','File11.5.txt','File-1.4.txt','File+0.3.txt'}; % sort(B) % ans = {'File+0.3.txt','File-1.4.txt','File102.txt','File11.5.txt'} % sortnat(B,'(-|+)?\d+(\.\d+)?') % ans = {'File-1.4.txt','File+0.3.txt','File11.5.txt','File102.txt'} % % # Integer or decimal numeric tokens, possibly with an exponent: % % C = {'A_0.56e+07','A_4.3E2','A_10000','A_9.8'} % sort(C) % ans = {A_'0.56e+07','A_10000','A_4.3E2','A_9.8'} % sortnat(C,'\d+(\.\d+)?(e(+|-)?\d+)?') % ans = {'A_9.8','A_4.3E2','A_10000','A_0.56e+07'} % % # ASCII order (including non-printing characters): % sortnat(CellStr,'[]',true); % % ### Inputs and Outputs ### % % Outputs: % Out = CellOfStrings, InC sorted into natural-order, same size as InC. % ind = Numeric array, such that OutCoS = InCoS(ind), same size as InC. % For debugging: each row is one string, linear-indexed from InC: % ChA = Character array, all separate non-numeric characters. % NuA = Numeric array, "sscanf" converted numeric values. % % Inputs: % InC = CellOfStrings, whose string elements are to be sorted. % tok = String, "regexp" numeric token extraction expression, '\d+'*. % cse = Logical scalar, true/false* -> case sensitive/insensitive. % dsc = Logical scalar, true/false* -> descending/ascending sort. % fmt = String, "sscanf" numeric token conversion format, '%f'*. % % An empty input [] uses the default input option value (indicated *). % % Outputs = [Out,ind,chr,num] % Inputs = (InC,tok*,cse*,dsc*,fmt*)DfAr = {'\d+',false,false,'%f'}; % *{tok,cse,dsc,fmt} DfIx = ~cellfun('isempty',varargin); DfAr(DfIx) = varargin(DfIx); [tok,cse,dsc,fmt] = DfAr{1:4}; % CsC = {'ignorecase','matchcase'}; SrS = ['(',tok,')|.']; % % Split strings into tokens: [MtE,ToX] = regexp(CoS(:),SrS,'match','tokenextents',CsC{1+cse}); % Clx = cellfun('length',MtE); Cly = numel(MtE); Clz = max(Clx); % % Initialize arrays: ChA = char(zeros(Cly,Clz)); ChI = false(Cly,Clz); MtC = cell(Cly,Clz); NuA = NaN(Cly,Clz); NuI = false(Cly,Clz); % % Merge tokens into cell array: ind = 1:Cly; for n = ind(Clx>0)cj = cellfun('isempty',ToX{n});ChI(n,1:Clx(n)) = cj;NuI(n,1:Clx(n)) = ~cj;MtC(n,1:Clx(n)) = MtE{n}; end % Transfer tokens to numeric and char arrays: ChA(ChI) = [MtC{ChI}]; NuA(NuI) = sscanf(sprintf('%s ',MtC{NuI}),fmt); % if cseMtC = ChA; elseMtC = lower(ChA); end % MoC = {'ascend','descend'}; MoS = MoC{1+dsc}; % % Sort each column of characters and numeric values: ei = (1:Cly)'; for n = Clz:-1:1% Sort char and numeric arrays:[~,ci] = sort(MtC(ind,n),MoS);[~,ni] = sort(NuA(ind,n),MoS);% Relevant indices only:cj = ChI(ind(ci),n);nj = NuI(ind(ni),n);ej = ~ChI(ind,n) & ~NuI(ind,n);% Combine indices:if dscind = ind([ci(cj);ni(nj);ei(ej)]);elseind = ind([ei(ej);ni(nj);ci(cj)]);end end % ind = reshape(ind,size(CoS)); CoS = reshape(CoS(ind),size(CoS)); %----------------------------------------------------------------------End!- 模擬透鏡成像過程-頻域
clc clear %本例完成透鏡成像演示(相干照明衍射受限系統,不考慮像差和離焦) %改變透鏡的孔徑大小D,可以觀察到一些有意義的結果 a=imread('分辨率板_1.bmp');%調入圖像 a=double(a(:,:,1)); lamda=6328*10^(-10);k=2*pi/lamda;%波矢 D=0.04;%透鏡的孔徑 f=0.4;%透鏡的焦距 figure,imshow(a,[]) [c,r]=size(a);zo=1.2; %圖像到透鏡的距離,單位:米,可以改變 zi=zo*f/(zo-f); %透鏡到觀察屏的距離,單位:米,可以改變 Lo=0.005; %物的大小% maxfrequency=D/2/lamda/zo; %截止頻率(阿貝觀點) % kethi=linspace(-1./2./Lo,1./2./Lo,c).*c; % nenta=linspace(-1./2./Lo,1./2./Lo,r).*r; % [kethi,nenta]=meshgrid(kethi,nenta); %物的頻率范圍maxfrequency=D/2/lamda/zi; %截止頻率(瑞利觀點) Li=Lo*zi/zo; kethi=linspace(-1./2./Li,1./2./Li,c).*c; nenta=linspace(-1./2./Li,1./2./Li,r).*r; [kethi,nenta]=meshgrid(kethi,nenta); %物的頻率范圍H=zeros(r,c); %生成傳遞函數 for n=1:rfor m=1:cif kethi(n,m).^2+nenta(n,m).^2<=maxfrequency.*maxfrequency;H(n,m)=1;endend end figure,imshow(H,[]);title('傳遞函數')Gg=fftshift(fft2(a));%物的頻譜 Gi=Gg.*H; %像的頻譜 Ui=ifft2(Gi); Ii=Ui.*conj(Ui); %在透鏡上的光強分布 figure,imshow(Ii,[]),title('透鏡上的光強分布'); % colormap(pink)總結
以上是生活随笔為你收集整理的matlab常用代码总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 引用通过代码例子理解
- 下一篇: WeightedRandomSample