Matlab图像处理笔记(一)

说明

本笔记整理记录了在使用Matlab进行图像处理学习过程中,使用到的一些常用命令、常见问题、遇到的问题及解决方案,方便日后查看,其中部分内容系来自网络。

本笔记仅供学习研究,转载请注明出处@jimye。

零.杂碎

  1. I = double(imread('G:\pictures for test\flower.png'))

  2. >> I = rgb2gray(I)

  3. command window写完命令后,按Esc清除整行。

  4. 强烈建议在使用变量之前(特别是循环中使用数组),先预分配空间,这样容易减少很多莫名其妙的错误。

  5. 数组运算符比矩阵运算符多一个”.”,对应元素运算。

  6. eval()执行后面的程序。

  7. 向上取整:ceil 元胞数组:cell 向下取整:floor

  8. 在图片上指定的矩形区域加一个矩形边框怎么做: rectangle('Position',[x,y,w,h],'EdgeColor','r' ),(x,y起点坐标, w,h是你要求的边框宽和高)。

  9. image(X) ---有坐标轴,宽高比失真,有色就彩色的

  10. colormap(map)----按原图color来的

  11. 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 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 ');  % 标题

二. 保存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方法如下:

  1. 打开excel——数据(导入外部数据)——选123.txt——下一步——选择分割符号“逗号”——下一步——完成——保存此123.xls
  2. 打开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求解

Ax=b   x=A\b;   or x =inv(A)*b
xA=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(:))

  1. X 向量 sort(X,MODE) 对每个元素排序MODE = 'ascend' or 'descend'X 矩阵 sort(X) 默认对第一维排序,即行有序sort(X,DIM)可选对哪一维排序。

  2. sort是从小到大,那么从大到小:p = sort(p); p = fliplr(p);

  3. 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 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

八. 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)];
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')));

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图像处理笔记(一))