积累科研中常用的MATLAB技巧(精品)

1. matlab文件批量处理

1.1 获取批量文件名、批量处理文件

在使用MATLAB的过程中,我们经常需要批量处理文件,本小节主要介绍了批量处理文件的一些常用操作。

解决的问题:在一个文件夹下的有多张名称没有规律图片,如何使用matlab程序自动提取文件名,并遍历每张图片?我们可能面临的情况如下:
在这里插入图片描述
针对上面的问题,我们获取批量文件名的主要流程为:
① 指定需要批量处理的文件夹路径path;
② 指定文件后缀(如“.jpg”,“.txt”,“.dat”等等),若不指定则全类型读取(解决case2);
③ 从结构体中获取文件名元胞数组,文件名保存在元胞中。

具体matlab代码如下,前三行分别对应三个流程,后半部是遍历文件的示例:

% 文件名的批量读取
path = './示范读取批量文件/';    % 指明哪个文件夹
file_set = dir(fullfile(path,'*.jpg'));	% 读取后缀为.jpg的文件信息,保存为结构体数组
name_set = {file_set.name};             % 获取批量的文件名,保存为元胞数组

获取文件名集合后,对其进行遍历操作:

% 文件名批量获取已完成,下面是遍历使用文件的示例
for i = 1:length(name_set)
    filename = [path,name_set{i}];  % 注意组合“文件夹+文件名”才可读取到图片
    img = imread(filename);         % 执行后续操作
    imshow(img);
    pause(0.5);     % 暂停0.5s,把图片显示出来
end

其中dir函数就是批量获取文件名称的函数;fullfile函数是将文件夹路径与文件名后缀组合成新的文件路径;“*”星号表示通配符,dir函数可以获取任意字符串占用星号位置的文件名。我们也可以通过把后缀改为“ABC*DEF.jpg”的形式进一步限定只获取“ABC*DEF.jpg”格式的文件名。

1.2 批量文件名称排序

  有时候批量读取到的文件名并不是按照序号递增的(实际是依照文件名字符串排序的)。如下图,利用上述方式直接批量读取到的文件名是按照字符串进行排序的,而我需要按照数值进行排序的结果。
在这里插入图片描述
  为了得到以序号递增的文件名集合,我们需要对读取到的批量文件名进行排序。其实现方式的关键在于提取文件名中的可排序内容,再对提取出来的内容进行排序,获取排序索引,再通过这个索引来对原始文件名集合进行索引,即可得到按照序号排序的文件名集合。
  整理成流程为:批量读取文件名 -> 字符串分割提取排序内容 -> 对排序内容进行排序 -> 用排序索引生成新的文件名集合。

% 文件名的批量读取
path = './data/';    % 指明哪个文件夹
file_set = dir(fullfile(path,'*.tif'));	% 读取后缀为.jpg的文件信息,保存为结构体数组
name_set = {file_set.name};             % 获取批量的文件名,保存为元胞数组

% 文件名排序: 字符串分割 -> 提炼排序内容 -> 对内容排序得到索引ind -> 按索引重排文件名集合
n = length(name_set);
for i = 1:n
    char_set = split(name_set{i},'_');	% 分割字符串
    tmp = char_set{2};					% 提炼排序内容
    content(i) = str2num(tmp(1:end-2));	% 保存到数组中
end
[A,ind] = sort(content);				% 对提炼的数值集合进行排序
new_name_set = name_set(ind);			% 利用索引ind重排文件名集合

最后得到结果:
在这里插入图片描述

2. matlab图形窗口设置

2.1 设置窗口位置及大小

在使用MATLAB绘图的过程中,往往MATLAB直接弹出来的窗口位置和大小不是我们想要的,所以这时候我们可以在程序中添加set命令进行调整。设置方法如下:

img = ones(512);
figure(1),imshow(img);
set(gcf,'Units','Pixel','position',[200, 200, 600, 600]);

其中gcf表示获取和指定图形窗口的坐标参数。

运行之后结果如下:
图形窗口显示设置
另外我们也可以通过占比来设置图窗位置和大小:

img = ones(512);
figure(1),imshow(img);
set(gcf,'Units','normalized','position',[0.2, 0.2, 0.5, 0.5]);

注意这里的占比是用显示器的分辨率进行计算的。其运行结果如下
在这里插入图片描述

2.2 设置窗口内图像的大小和位置

上面一部分是介绍如何调整figure的大小和位置,下面介绍如何设置figure中的图像大小和位置。

img = zeros(512);
imshow(img);
set(gca,'Units','normalized','position',[0.1 0.1 0.4 0.4]);

结果:
在这里插入图片描述
同样地,如果需要调整subplot中每个子图的大小和位置,也可以使用改命令进行调整,不过每个子图的具体位置参数可能需要自己手动计算一下。

2.3 设置窗口内图片以不同格式显示

当我们用matlab绘制出不同的图片的时候,我们可能需要图片以不同的格式进行显示,具体实现方法如下:

figure,
ax1 = subplot(221);	% 将subplot复制给一个变量
colormap(ax1 ,gray)	% 对该变量进行颜色设置

完整代码和下一节的保存一起展示,不同显示格式的运行结果如下:
在这里插入图片描述

2.4 将figure窗口保存为图片

在matlab中,我们常常创建一个figure之后再显示图片,比如我们把多幅对比图放置在一个figure窗口中对比等等,那么当我们想要保存这样的figure为图片的时候我们可以进行如下操作:

% 流程:创建四幅图 -> 放置在子图中以不同的方式进行显示 -> 保存当前figure窗口为图片

clc, clear
close all

% 创建cameraman图片
img = imread('cameraman.tif');

% 不同显示格式
figure,
ax1 = subplot(221); imshow(img), title('gray显示格式', 'Fontsize',20);
colormap(ax1 ,gray),colorbar;
ax2 = subplot(222); imshow(img), title('hot显示格式', 'Fontsize',20);
colormap(ax2 ,hot),colorbar;
ax3 = subplot(223); imshow(img), title('jet显示格式', 'Fontsize',20);
colormap(ax3 ,jet),colorbar;
ax4 = subplot(224); imshow(img), title('copper显示格式', 'Fontsize',20);
colormap(ax4 ,copper),colorbar;

% 保存figure为图片
set(gcf,'position',[500, 100, 1000, 800]);  % 设置figure位置和大小
tmp_img = frame2im(getframe(gcf));      % 将figure转化为图片再保存
imwrite(tmp_img,'./figure1.jpg');

最终将第3小节的结果保存到当前文件夹下:
在这里插入图片描述

3. matlab并行处理

parfor中的使用添加详细说明:
https://ww2.mathworks.cn/help/parallel-computing/parfor.html?searchHighlight=parfor&s_tid=srchtitle

开启多核运算的方法:

core_number=12;            %想要调用的处理器个数
parpool('local',core_number);

使用方式:

parfor i = 1:N
		x(i)  = i;
end

4. MATLAB图像处理(★★★)

4.1 整理图像处理中经常用到的函数

功能命令
图像尺寸变换Image = imresize(Image,[512,512]);
复制数组(行m次,列n次)B = repmat(A, m, n) ;
计算数组的元素个数num = numel(A) ;|
计算向量的元素乘积B = prod(A);
归一化函(0,1之间)f = @(x) (x-min(x(: )))./(max(x(: ))-min(x(: )));

4.2 给图像周边补零、复制和镜像填充;

关于padarray的matlab文档注解:
https://ww2.mathworks.cn/help/images/ref/padarray.html?searchHighlight=padarray&s_tid=srchtitle
B = padarray(A, [3 4]); % 默认补零填充,行和列各自两个方向都进行填充;
B = padarray(A, [3 4],1); % 用1进行填充

4.3 如何分立地索引图像(数组、彩图)中的某些像素

  问题描述:在对图像进行索引时,我们经常需要只索引某些分立的点。比如下图,我对camerman的图片使用find(img==167)之后,返回图像中像素值等于167的坐标,也这些坐标是分立,如何使用这些分立的坐标对图像进行索引?
在这里插入图片描述
解决思路:实现数组的分立索引主要通过顺序索引来实现,而不是坐标索引;对于彩色图像,只要在顺序索引上添加n倍 “长*宽”,就可以实现三个通道的索引,具体代码可参考如下:

clc, clear
close all

img = imread('cameraman.tif');	
index = find(img==167);	% 获取数组顺序索引,可直接分立索引数组
% [x, y] = find(img==167); % 获取数组x,y坐标索引,需转为顺序索引才能分立索引,不然会索引整行整列重叠区域;

img_color = repmat(img, 1, 1, 3);	% 灰度图像转为三维彩色图像,可以在后续处理中显示颜色
[l,w,~] = size(img_color);		% 获取图像的长和宽
mask = img_color;	% 复制图像,对mask进行处理
mask(index) = 255;	% 红色的强度值是[255 0 0],所以把对于坐标的强度值进行更换即可
mask(index+l*w) = 0;
mask(index+2*l*w) = 0;
figure, imshow([img_color, mask]);

如果采用x,y坐标索引,则不能正确分立地处理图像,其结果如下:
在这里插入图片描述

4.4 如何获取图像中任意四边的mask

  问题描述:按顺时针从左上角开始获取四个顶点的坐标,如何提取由四个顶点所确定的任意四边形区域。
在这里插入图片描述
解决思路:计算出四条直线的表达式,再根据每条边的取向约束出我们的四边形。
原理:由两点式的直线表达式可知  y = x 2 − x 1 y 2 − y 1 ( x − x 1 ) + y 1 y = \frac{{{x_2} - {x_1}}}{{{y_2} - {y_1}}}(x - {x_1}) + {y_1} y=y2y1x2x1(xx1)+y1,对于(m,n)点来说,如果 n>y(m) , 则说明该点高于直线,即当满足 n − x 2 − x 1 y 2 − y 1 ( m − x 1 ) − y 1 > 0 n- \frac{{{x_2} - {x_1}}}{{{y_2} - {y_1}}}(m - {x_1}) - {y_1}>0 ny2y1x2x1(mx1)y1>0可以选择出高于该直线的区域,同理,只要把满足四边形区域的四个约束都表示出来,即可通过并集获得四边形区域。具体实现方式如下:

% 实现图像中任意四边形的提取

clc, clear
close all

% 初始化
img = imread('cameraman.tif');	
[x_p,y_p,~] = size(img);        % 获取图像尺寸
[m,n] = meshgrid(1:y_p,1:x_p);  % 创建图像像素坐标

figure(1), imshow(img);
set(gcf, 'outerposition', get(0,'ScreenSize')); % 全屏显示

% 四边形内部的约束条件
[x,y] = ginput(4);      % 利用鼠标获取四个顶点数据
condition1 = n-(y(2)-y(1))/(x(2)-x(1))*(m-x(1))-y(1) > 0;
condition2 = m-(x(3)-x(2))/(y(3)-y(2))*(n-y(2))-x(2) < 0;
condition3 = n-(y(4)-y(3))/(x(4)-x(3))*(m-x(3))-y(3) < 0;
condition4 = m-(x(1)-x(4))/(y(1)-y(4))*(n-y(4))-x(4) > 0;
% figure, imshow([condition1 condition2;condition3 condition4])
index = condition1 & condition2 & condition3 & condition4;
figure(2), imshow(index);

% 求解
mask = zeros(size(img));
mask(index) = img(index);
figure(3),imshow([img mask]);

可提取任意四边形区域:
在这里插入图片描述

5. MATLAB制作gif图

流程:准备图片序列 -> 将图片拼接成gif图;
对于彩色图像:

% 创建图片序列
n = 100;
for i = 1:n
	img{i} = im2uint8(rand(512,512,3));
end
    
% 将图片组合成gif图
filename = 'test_rgb.gif'; % Specify the output file name
for idx = 1:n
    [A, map] = rgb2ind(img{idx},256);
    if idx == 1
        imwrite(A, map, filename,'gif','LoopCount',Inf,'DelayTime',1/25);
    else
        imwrite(A, map, filename,'gif','WriteMode','append','DelayTime',1/25);
    end
end

对于灰度图像:

% 创建图片序列
n = 100;
for i = 1:n
	img{i} = rand(512,512);
end
    
% 将图片组合成gif图
filename = 'test_gray.gif'; % Specify the output file name
for idx = 1:n
    if idx == 1
        imwrite(img{idx},filename,'gif','LoopCount',Inf,'DelayTime',1/25);
    else
        imwrite(img{idx},filename,'gif','WriteMode','append','DelayTime',1/25);
    end
end

合成gif图的示例:
在这里插入图片描述

6. 其他tips

1.判断某个文件路径是否存在

exist('filepath','file');	% 判断某个文件是否存在
exist('path','dir');		% 判断某个路径是否存在

2.判断变量A是否属于某一数据类型

isa(A, 'uint16')	

3.将数据保存到excel中

xlswrite('./H的对比.xlsx',H,'Sheet1',['E1']);	
第1章 BP神经网络的数据分类——语音特征信号分类 第2章 BP神经网络的非线性系统建模——非线性函数拟合 第3章 遗传算法优化BP神经网络——非线性函数拟合 第4章 神经网络遗传算法函数极值寻优——非线性函数极值寻优 第5章 基于BP_Adaboost的强分类器设计——公司财务预警建模 第6章 PID神经元网络解耦控制算法——多变量系统控制 第7章 RBF网络的回归--非线性函数回归的实现 第8章 GRNN网络的预测----基于广义回归神经网络的货运量预测 第9章 离散Hopfield神经网络的联想记忆——数字识别 第10章 离散Hopfield神经网络的分类——高校科研能力评价 第11章 连续Hopfield神经网络的优化——旅行商问题优化计算 第12章 初始SVM分类与回归 第13章 LIBSVM参数实例详解 第14章 基于SVM的数据分类预测——意大利葡萄酒种类识别 第15章 SVM的参数优化——如何更好的提升分类器的性能 第16章 基于SVM的回归预测分析——上证指数开盘指数预测. 第17章 基于SVM的信息粒化时序回归预测——上证指数开盘指数变化趋势和变化空间预测 第18章 基于SVM的图像分割-真彩色图像分割 第19章 基于SVM的手写字体识别 第20章 LIBSVM-FarutoUltimate工具箱及GUI版本介绍与使用 第21章 自组织竞争网络在模式分类的应用—患者癌症发病预测 第22章 SOM神经网络的数据分类--柴油机故障诊断 第23章 Elman神经网络的数据预测----电力负荷预测模型研究 第24章 概率神经网络的分类预测--基于PNN的变压器故障诊断 第25章 基于MIV的神经网络变量筛选----基于BP神经网络的变量筛选 第26章 LVQ神经网络的分类——乳腺肿瘤诊断 第27章 LVQ神经网络的预测——人脸朝向识别 第28章 决策树分类器的应用研究——乳腺癌诊断 第29章 极限学习机在回归拟合及分类问题的应用研究——对比实验 第30章 基于随机森林思想的组合分类器设计——乳腺癌诊断 第31章 思维进化算法优化BP神经网络——非线性函数拟合 第32章 小波神经网络的时间序列预测——短时交通流量预测 第33章 模糊神经网络的预测算法——嘉陵江水质评价 第34章 广义神经网络的聚类算法——网络入侵聚类 第35章 粒子群优化算法的寻优算法——非线性函数极值寻优 第36章 遗传算法优化计算——建模自变量降维 第37章 基于灰色神经网络的预测算法研究——订单需求预测 第38章 基于Kohonen网络的聚类算法——网络入侵聚类 第39章 神经网络GUI的实现——基于GUI的神经网络拟合、模式识别、聚类 第40章 动态神经网络时间序列预测研究——基于MATLAB的NARX实现 第41章 定制神经网络的实现——神经网络的个性化建模与仿真 第42章 并行运算与神经网络——基于CPU/GPU的并行神经网络运算 第43章 神经网络高效编程技巧——基于MATLAB R2012b新版本特性的探讨 第44章 层次分析法 第45章 灰色关联度 第46章 熵权法 第47章 主成分分析 第48章 主成分回归 第49章 偏最小二乘 第50章 逐步回归分析 第51章 模拟退火 第52章 RBF,GRNN,PNN-神经网络 第53章 竞争神经网络与SOM神经网络 第54章 蚁群算法tsp求解 第55章 灰色预测GM1-1 第56章 模糊综合评价 第57章 曲线拟合 目前没空,后面继续整理,还有很多类似的代码,欢迎下载
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山颠海涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值