Matlab图像处理笔记(一)
来源:互联网 发布:基础几何常识知乎 编辑:程序博客网 时间:2024/05/17 05:02
说明
本笔记整理记录了在使用Matlab进行图像处理学习过程中,使用到的一些常用命令、常见问题、遇到的问题及解决方案,方便日后查看,其中部分内容系来自网络。
本笔记仅供学习研究,转载请注明出处@jimye。
零.杂碎
I = double(imread('G:\pictures for test\flower.png'))
。>> I = rgb2gray(I)
。在
command window
写完命令后,按Esc
清除整行。强烈建议在使用变量之前(特别是循环中使用数组),先预分配空间,这样容易减少很多莫名其妙的错误。
数组运算符比矩阵运算符多一个”.”,对应元素运算。
eval()
执行后面的程序。向上取整:ceil 元胞数组:cell 向下取整:floor
在图片上指定的矩形区域加一个矩形边框怎么做:
rectangle('Position',[x,y,w,h],'EdgeColor','r' )
,(x,y起点坐标, w,h是你要求的边框宽和高)。image(X)
---有坐标轴,宽高比失真,有色就彩色的colormap(map)
----按原图color来的axis image
-----有坐标轴,按原图宽高比
一. 求梯度
1.用[-1 1]与图像做卷积,不用imfilter(I,k,’conv’)
,因为结果最后一列是保留了原图像的灰度值,并未做差分,切记!应
[n m]=size(I1); Ix = [I1(2:n,:) - I1(1:n-1,:);zeros(1,m)];Iy = [I1(:,2:m) - I1(:,1:m-1),zeros(n,1)];
2.[Ix,Iy]=gradient(I);
可得水平和垂直方向的梯度但是是第一列和最后一列向前差分,中间是中心差分
3.
Ix = [diff(I, 1, 2), I(:,1) - I(:,n)];Iy = [diff(I, 1, 1); I(1,:) - I(m,:)];
利用diff
logp=-abs(Ix(:)).^2 - abs(Iy(:)).^2; (未sigma每点)
4.正确做法
dx = [1 -1];dy = dx';gx = conv2(g, dx, 'valid');gy = conv2(g, dy, 'valid');
与函数Id = mipforwarddiff(y,'dx');
效果等价。
clear allI = double(imread('F:\pictures for test\house.bmp'));[row column]=size(I);Ix = [I(2:n,:) - I(1:n-1,:);zeros(1,m)];Iy = [I(:,2:m) - I(:,1:m-1),zeros(n,1)];q=log(-abs(Ix(:)).^2 -abs(Iy(:)).^2);gra =Ix+Iy; gra1 = gra(:);[gra2,index] = sort(gra1);plot(gra2,q(index));axis([-100 100 -15 0]);xlabel('Gradient'); % 横坐标ylabel('log2 probability'); % 纵坐标legend('Gaussian(\alpha=2)'); % 图例title('gradient probability '); % 标题
二. 保存mat文件
方法一:
s1.a = 12.7; s1.b = {'abc', [4 5; 6 7]}; s1.c = 'Hello!';save newstruct.mat -struct s1;
方法二:
save k a b c 结果一样。save k.mat A –append 追加保存。save(['s_dico_',num2str(i),'.mat'],'atom','-append'); 批处理保存,文件名不同。
方法三:如何将txt转化为mat文件
建议你在执行你的文件导入之前,写一个语句,clear;
,作用是清空workspace中原来的纪录,然后再运行load('e:\inputdata.txt');save('A.mat','B');
其中的A请你自己取名;其中的B,要看workspace中生成的到底是什么,就用那个名字我弄了下不能在matlab中直接导入带引号的.txt文本,所以我先用excel去掉了双引号和逗号,然后再导入matlab方法如下:
- 打开excel——数据(导入外部数据)——选123.txt——下一步——选择分割符号“逗号”——下一步——完成——保存此123.xls
- 打开matlab——file(impor data)——选123.xls——finish即可或者用程序代码来实现保存:
function matclear;clc;data= xlsread('G:\...\...\123.xls');save 123.mat data
通过该问题,我对以前曾回答过的怎样将.xls读入matlab进行修改,它的命令行是:data= xlsread('G:\...\...\123.xls');
不能用load
。
三. 裁剪 & 变换矩阵
A = rand(3,4);A1 = A(2:3,[1,3,4]); L=A(2,:)<0.8A3 = A(2,L)
但对挑1,2行>0.3不能用上述做法,可以这样单行做
L1 =E(1,:)>0.3 ;L2 =A(2,:)>0.3 ; [A(1,L1);A(2,L2)] ;
或者
[m n]=size(A); w = 2;B=find(A(1:2,:)>0.3); C=reshape(A(1:2,:),1,w*n);
C(B)
即所求, 或者
B = A(1:2,:)>0.3;C = A(1:2,:).*B;
C
即所求
原来K为3*4,reshape(K,2,6);
现在reshape是按列排复制height的三分之一列数:repmat(sqrt(sum(Phi.^2,1)),[floor(height/3),1]);
改变图像大小 imresize(A,ratio,method);
Kron(x,y)
: Kronecker 张量积If X is mn and Y is pq, then kron(X,Y) is mp-by-nq.
四. 方程AX=b求解
Ax=b x=A\b; or x =inv(A)*bxA=b x=b/A; or x= b*inv(A)
inv(A)
只能对方阵求逆,pinv(A)
可求伪逆
五. 向量/矩阵函数运算
1.向量函数: 对向量元素进行运算
max(A)
作用于矩阵时,求的是每列的最大值。
sum(A)
也是按列求,求矩阵A中所有元素和sum(sum(A));
。
sum(x,2)
表示矩阵x的横向相加,求每行的和,结果是列向量。而缺省的sum(x)
就是竖向相加,求每列的和,结果是行向量。
sort(A)
对A按行排,对矩阵排序[sA,index] = sort(A(:))
。
X 向量
sort(X,MODE)
对每个元素排序MODE = 'ascend' or 'descend'X 矩阵 sort(X) 默认对第一维排序,即行有序sort(X,DIM)
可选对哪一维排序。sort是从小到大,那么从大到小:
p = sort(p); p = fliplr(p);
Matlab中给一维向量排序是使用sort函数:
sort(A)
,排序是按升序进行的。事实上,这里A ≡sA(index)
, [A恒等于sA(index)],这个结论确实很奇妙,而且很有用。比如,调用这要求得到的c是对应于以前的x的。但我们处理的时候,是基于排序后的y的。那么这时得到的c。应该做个处理:c(index) = c
;这下就OK了。
2.矩阵函数: 对矩阵先分解,再运算
[S V D]=svd(A); det(S)=det(D)=1;
V只有对角元
[V D]=eig(A)
V特征向量 D特征值
六. M文件
当函数名与文件名不一致时,matlab是按文件名来读取函数的!
七. For循环
matlab的for让人觉得很不爽。
c:
for ( i = 1 ; i <= n ; i ++ ){...}
vb:
for i = 1 to n...next ipascal:for i := 1 to n begin...end
以上的东西执行完后,i的值都是n+1。但是,matlab的for i = 1:n完了之后!
i == n
…这在平时真的没啥..但在有的时候,就要增加点编码了,很烦。比如这个例子:我们要寻找数组中有没有0。有0就干什么事,没有就干什么事。
x = [1 3 2] ;for i = 1:3 if x(i) == 0 break ; endend
这个完了之后,如果i==3,那么你就无法确定是因为3好元素是0,break掉的。还是循环执行完了,i停在3的。所以相比前几种语言来说,这个设计实在是不爽。。
只有多加点东西:
x = [1 3 2] ;has0 = 0 ; //*+*for i = 1:3 if x(i) == 0 has0 = 1 //*+* break ; endendif has0 //*+* ..else ..end
循环赋值tips:
num_scales = 1;tmp = minsize;while(tmp < opts.kernel_size) ksize(num_scales) = tmp; num_scales = num_scales + 1;end
八. Matlab绘图
1. 设置图片格式在word里不改变
set(gcf,'Position',[100 100 260 220]);set(gca,'Position',[.13 .17 .80 .74]);figure_FontSize=8;set(get(gca,'XLabel'),'FontSize',figure_FontSize,'Vertical','top');set(get(gca,'YLabel'),'FontSize',figure_FontSize,'Vertical','middle');set(findobj('FontSize',10),'FontSize',figure_FontSize);set(findobj(get(gca,'Children'),'LineWidth',0.5),'LineWidth',2);
2. matlab坐标轴标注和特殊字体
set(gca,'XTick',[0:pi/3:2*pi])
设置所要显示坐标轴刻度,
set(gca,'XTickLabel',[0:pi/3:2*pi])
给这些数据加标签
gca是单词Get current axes handle的缩写,获得坐标轴句柄。(不知道matlab为什么不自动对应数据加标签,还需要多一条命令)出来的图形坐标轴标注:
1*. 控制坐标轴尺度长度:set(gca,'XLim',[-pi/2 pi])
2*. 定制自己想标注的刻度:
(1)
set(gca,'XTick',[-pi/2:pi/4:pi])
%%%坐标轴最小值,步长,最大值(2)
set(gca,'XTickLabel',{'-pi/2' '-pi/4:' '0' 'pi/4' 'pi/2'…'pi*3/4' 'pi'})
3*. 反转坐标轴:set(gca,'XDir','reverse')
4*. 上下标及latex公式
输下标:_{wb}
输上标:^{0.5}
输latex公式:
text('Interpreter','latex',...'String','$$\int_0^x\!\int_y dF(u,v)$$',...'Position',[.5 .5],...'FontSize',16)
在Matlab中输入上标、下标、特殊符号或字体:bf,\it,\rm表示黑体,斜体,正体字符,上标用 ^(指数),下标用 _(下划线)。
调用方式为: ^{任意字符}, _{任意字符}, 注意{}的使用!
体会以下两例:
figure, title('\zeta^{-t}sint');figure, title('x~{\chi}_{\alpha}^{2}(3)');
3. 多条曲线自动标注
eg1.
k=6;x=0:0.1:1;y=zeros(length(x),k);str=cell(k,1);for a=1:k y(:,k)=0.1*a*x.^2+0.5; str{a}=['a=',num2str(a)];endh=plot(x,y);legend(h,str);
eg2.
clear;clc;close alla=1:10;b=rand(10,4);h(4,1)=0;hold onfor i=1:4 h(i)=plot(a,b(:,i),'color',rand(1,3));endlegend([h(1),h(3),h(2)],strcat({'a='},num2str([1,3,2]','%d')));
4.plot
z=eye(5);plot(z);
z为矩阵时,plot横坐标为序号,纵坐标为每行元素,有多条曲线,条数等于行数。这就是以前画图好乱的原因~
plot(x,y,’k+’)
, xy同维时略,x为向量,y矩阵时,x与y的每行对应画曲线,曲线数=行数。常与linspace(0,2*pi,50)
同用。
[XX,YY] = meshgrid(x,y)
把向量x,y变成了矩阵XX,YY,用于求二维三维的函数。XX=[x;x;x;x],YY=[y,y,y,y]
.
gtext(‘sin’)
在图上任意位置输入文字。
5. 画梯度场
x=-2:.2:2;y=-1:.2:1;[xx,yy]=meshgrid(x,y);zz=xx.*exp(-xx.^2-yy.^2);[px,py]=gradient(zz,.2,.2);quiver(x,y,px,py,2);
- Matlab图像处理笔记(一)
- Matlab图像处理笔记(一)
- MATLAB学习笔记 形态学图像处理(一)
- MATLAB学习笔记一(关于图像处理)
- 笔记2 MATLAB图像处理一
- Matlab图像处理笔记
- matlab图像处理 笔记
- Matlab图像处理函数烩(一)
- MATLAB数字图像处理(一)图像直方图
- Matlab图像处理笔记(二)
- Matlab图像处理笔记(二)
- MATLAB学习笔记 图像分割(一)
- 图像处理Matlab(一)——图像灰度值
- 图像处理与matlab实例之图像平滑(一)
- matlab图像处理命令(一)
- Matlab图像处理学习笔记(一):二值化、开操作、连通区域提取、重心、ROI
- matlab学习笔记:图像处理
- 数字图像处理(一) matlab图像简单操作
- JDBC之数据库的增,删,改,查, 搜, 批量执行,获取表结构,获取某一用户下所有的表,滚轴操作的封装
- OpenGL/GLSL数据传递小记(3.x)
- 1023. Have Fun with Numbers (20)
- OVGap —— 沟通 Objective-C 与 Javascript
- C#学习记录三:异常处理
- Matlab图像处理笔记(一)
- 项目管理之jira流程监控
- Android中为Button自定义按钮的按下效果的实现方法
- 如何将Eclipse 的JavaWeb工程部署到Tomcat的webapps目录下
- WdatePicker.js日期组件的使用方法
- [LeetCode] Insertion Sort List
- Struts2相对于Struts1的优点
- 启发式评估
- 磁盘管理疑问[待解决]