本笔记整理记录了在使用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,:)];
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 all
I = 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 '); % 标题
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'); 批处理保存,文件名不同。
建议你在执行你的文件导入之前,写一个语句,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 mat
clear;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.8
A3 = 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 x=A\b; or x =inv(A)*b
xA=b x=b/A; or x= b*inv(A)
inv(A)
只能对方阵求逆,pinv(A)
可求伪逆
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了。
[S V D]=svd(A); det(S)=det(D)=1;
V只有对角元
[V D]=eig(A)
V特征向量 D特征值
当函数名与文件名不一致时,matlab是按文件名来读取函数的!
matlab的for让人觉得很不爽。
c:
for ( i = 1 ; i <= n ; i ++ ){...}
vb:
for i = 1 to n
...
next i
pascal:
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 ;
end
end
这个完了之后,如果i==3,那么你就无法确定是因为3好元素是0,break掉的。还是循环执行完了,i停在3的。所以相比前几种语言来说,这个设计实在是不爽。。
只有多加点东西:
x = [1 3 2] ;
has0 = 0 ; //*+*
for i = 1:3
if x(i) == 0
has0 = 1 //*+*
break ;
end
end
if has0 //*+*
..
else
..
end
循环赋值tips:
num_scales = 1;
tmp = minsize;
while(tmp < opts.kernel_size)
ksize(num_scales) = tmp;
num_scales = num_scales + 1;
end
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);
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)');
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)];
end
h=plot(x,y);
legend(h,str);
eg2.
clear;clc;close all
a=1:10;
b=rand(10,4);
h(4,1)=0;
hold on
for i=1:4
h(i)=plot(a,b(:,i),'color',rand(1,3));
end
legend([h(1),h(3),h(2)],strcat({'a='},num2str([1,3,2]','%d')));
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’)
在图上任意位置输入文字。
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);