Matlab图像处理笔记(二)

说明

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

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

九. RGB图像如何处理

Im2double:把图像变为[0,1]之间

读alpha channel :[A, map, alpha] = imread(...)

a=imread(‘文件路径\文件名.jpg');
R = a(:,:,1);
G = a(:,:,2);
B = a(:,:,3);

处理结束后

rgb=cat(3,R,G,B);

图像黑,看不出轮廓

img = double(imread('lena.bmp'));
[zs rmse ps k] = Lena_denoise_edge(img);
imwrite(uint8(zs)+100,'lena10_1.7.bmp');
imwrite(uint8(img-zs(1:256, 1:256)+100),'lena_err10_1.7.bmp');

十. 将Matlab中的矩阵写入txt文件的方法

文件操作是一种重要的输入输出方式,即从数据文件读取数据或将结果写入数据文件。MATLAB提供了一系列低层输入输出函数,专门用于文件操作。

1、文件的打开与关闭

1)打开文件

在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为:

fid=fopen(文件名,‘打开方式’)

说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:

‘r’:只读方式打开文件(默认的方式),该文件必须已存在。
‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。
‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。
‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。
‘a’:在打开的文件末端添加数据。文件不存在则创建。
‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。

另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。

2)关闭文件

文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为:

sta=fclose(fid)

说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose('all');

2、二进制文件的读写操作

1)写二进制文件

fwrite函数按照指定的数据精度将矩阵中的元素写入到文件中。其调用格式为:

COUNT=fwrite(fid,A,precision)

说明:其中COUNT返回所写的数据元素个数(可缺省),fid为文件句柄,A用来存放写入文件的数据,precision代表数据精度,常用的数据精度有:char、uchar、int、long、float、double等。缺省数据精度为uchar,即无符号字符格式。

例6.8 将一个二进制矩阵存入磁盘文件中。

>> a=[1 2 3 4 5 6 7 8 9];
>> fid=fopen(‘d:test.bin’,'wb’) %以二进制数据写入方式打开文件
fid = 3 %其值大于0,表示打开成功
>> fwrite(fid,a,’double’)
ans = 9 %表示写入了9个数据
>> fclose(fid)
ans = 0 %表示关闭成功

2)读二进制文件

fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:

[A,COUNT]=fread(fid,size,precision)

说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。

precision用于控制所写数据的精度,其形式与fwrite函数相同。

3、文本文件的读写操作

1)读文本文件

fscanf函数可以读取文本文件的内容,并按指定格式存入矩阵。其调用格式为:

[A,COUNT]=fscanf(fid,format,size)

说明:其中A用来存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄,format用来控制读取的数据格式,由%加上格式符组成,常见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字符型)等,在%与格式符之间还可以插入附加格式说明符,如数据宽度说明等。size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。

2)写文本文件

fprintf函数可以将数据按指定格式写入到文本文件中。其调用格式为:

fprintf(fid,format,A)

说明:fid为文件句柄,指定要写入数据的文件,format是用来控制所写数据格式的格式符,与fscanf函数相同,A是用来存放数据的矩阵。

例6.9 创建一个字符矩阵并存入磁盘,再读出赋值给另一个矩阵。

>> a='string';
>> fid=fopen('d:char1.txt','w');
>> fprintf(fid,'%s',a);
>> fclose(fid);
>> fid1=fopen('d:char1.txt','rt');
>> fid1=fopen('d:char1.txt’,'rt');
>> b=fscanf(fid1,’%s’)
b = string

matlab读txt文件

fid=fopen('fx.txt','r');               %得到文件号
[f,count]=fscanf(fid,'%f %f',[12,90]); %把文件号1的数据读到f中。其中f是[12 90]的矩阵
                                       %这里’%f %f’表示读取数据的形式,他是按原始数据型读出
fclose(fid);                           %关闭文件

另外有的txt文件还可以用load来打开, 其语句为

f=load('fx.txt');

一个写入txt文件的小例子:

N=100;
R=rand(1,N);
fid = fopen(‘tt.txt’,'wt’);
for k=1:N;
p=num2str(R(k));
fprintf(fid,’%c’,p);
fprintf(fid,’%cn’,’ ‘);
end
fclose(fid);

另:

输出格式:前面是格式,后面是对应的内容变量

%6.4f 表示共六位,其中四位小数,float格式

fprintf('Processing scale %d/%d; kernel size %dx%d; image size %dx%d\n', s, num_scales, k1, k2, r, c);

十一.循环中每次记录一个数据

for times=1:s; 
    product=abs(T_Mat'*r_n);
    …….
    r_n=y-Aug_t*aug_x; 
    pos_array(times)=pos;
end
hat_x=zeros(1,m);       % 预先定义大小
hat_x(pos_array)=aug_x; % 按排序赋值,其余为零

十二.将图像存为txt文件(csvwrite)

Matlab图像处理笔记(二)_第1张图片

十三. 对于图像处理或者二维信号问题,善用filter。

比如,要对每个像素,基于其局部邻域进行一些计算。即使整个计算本身不是线性的,但是只要能分解成线性局部运算的组合,就可以利用filter。

比如,对于图像I, 产生V,使得V(i, j)是像素I(i, j)周围w*w邻域的像素的方差。

I  = im2double(I);
h  = ones(w, w) / (w*w);
M  = imfilter(I, h, 'symmetric');
M2 = imfilter(I.^2, h, 'symmetric');
V  = M2 - M.^2;  %期望的公式D(I)=E(I^2)-(EI)^2

十四. matlab gui的回调函数间的变量调用(传递)

结合handles和guidata函数(gui内,不推荐使用,经常出现问题,比如在handles中添加了变量对象Y后可能就会挤掉handles另外一个对象),他的使用格式如下,如果你在pushbutton1中得到一个变量X,相传出去,那么在pushbutton1的callback中,在得到X后添加如下代码:

handles.X=X;
guidata(hObject,handles)(注意,一定是两行连写)

在pushbutton2中要用到X是,在其callback先添加 X=handles.X; 即可得到X的值。详见http://www.ilovematlab.cn/thread-46145-1-1.html

数据怎么在不同的控件之间传递

另: 知道了GUI的数据管理规则,这个就很简单了。

先看在一个GUI界面内部的传递的数据,每一个控件的回调函数头:

function myc_Callback(hObject, eventdata, handles)

第一个参数是hObject,是跟这个callback所关联的控件的handles,在它自己的callback下,可以用代号-> hObject 来调用它。。
不用管那么麻烦的概念,只用知道,控件自己的回调函数调用自己的属性,只用hObject.属性名   就可以了(中间一点)。

第二个参数是MATLAB的保留参数

第三个handles,是这个GUI界面的代号。
可以通过它获取这个界面的所有信息。所以在控件A自己的回调函数中,要获取或者设置别的控件的属性,就用handles.别的控件Tag.属性。

handles hObject都是结构体。正常的编程概念。

handles格式是一个存放数据的缸。控件的handles是小缸,它的名字叫做hObject;GUI界面的handle是一个大缸,并且这个缸名字也叫做handles;大缸里存放了所有的小缸和所有用户数据,你只需handles.控件A的tag就可以存取控件A的信息。

那我怎么把自己计算出或者别的什么数据放到这个缸里呢?在任何地方,handles.自己的变量名 = 某些值(其实也就是给结构体添加成员变量),这样你就定义了自己的变量。

在任何地方 b=handles.自己的变量名(结构名加点号来引用成员变量),就可以得到这个变量值,同样也可以修改它。别忘了使用 guidata(hObject, handles);(不用改,直接黏贴)在函数末尾来保存你对handles和hObject的操作。(不然你自定义的变量就没了)

十五. 图像正式处理之前,进行延拓小技巧

复制延拓:

p=tI([ones(1,hfs_y1),1:end,end*ones(1,hfs_y2)],1:end);

表示将tI的第一行复制 hfs_y1行,玩最后一行复制 hfs_y2行。

若原图像大小为m*n , 则延拓后为 (m+hfsy1+hfsy2)*n。

十六. 小技巧

1.若加旋转,只要0-180之间的,可用这个命令将角度转为弧度

phi = mod(p3,180)/180*pi;

2.这个是阶跃分段函数

t=0:100;
y=80*(t>=0&t<40)+20*(t>=40&t<80)+70*(t>=80&t<=100);
plot(t,y)

3.求余集

bad_jumps = setdiff(jumps, good_jumps);%余集

4.对图像每点的邻域计算

先延拓邻域的半径大小

kz = (ksize-1)/2;
[rows,columns] = size(grad1(:,:,1));
tmpgrad = padarray(grad1(:,:,1),[kz,kz],'replicate');

再对邻域作用,返回邻域大小为列,图像大小为行的矩阵

temp = im2col(tmpgrad,[ksize,ksize],'sliding');
……各种算
r_map = reshape(r_map,rows,columns);%变成原大小

5. 2种计时方法

% eg.1
t1 = tic;  fft(x);  toc(t1)  % Recommended
Elapsed time is 0.097665 seconds.

% eg.2
t = clock;  fft(x);  etime(clock, t)
ans = 0.1250

前一种更准确,推荐~

十七.获取当前路径,当前路径的上一级路径,相对路径

当前路径:

b=pwd; %将当前路径存于b中

或者

currPath = fileparts(mfilename('fullpath'));

更多信息help dir/cd/pwd/path/addpath

上一级路径:

currentDepth = 1; % get the supper path of the current path
currPath = fileparts(mfilename('fullpath'));% get current path
fsep = filesep;
pos_v = strfind(currPath,fsep);
p = currPath(1:pos_v(length(pos_v)-currentDepth+1)-1);

相对路径:

图片文件在当前一个目录的子目录下比如/bmp/1.bmp

imread('bmp/1.bmp')

十八. psf2otf与fft2的关系

a = [1 2 4; 4 6 5; 2 8 1];
a1 = circshift(a,-floor(size(a)/2));
b = fft2(a1);     % compare b to otf 
otf = psf2otf(a);

十九. 将图像保存成eps格式

print -deps fig1.eps

二十. 图像用整个figure显示

imshow(strain_image,'border','tight','initialmagnification','fit');

%'border','tight'的组合功能意思是去掉图像周边空白
%'InitialMagnification','fit'组合的意思是图像填充整个figure窗口

二十一. 几幅图像或子图像同步linkaxes

figure(26);
ax(1)=subplot(121);
imagesc(uint8(255*yorig));
set(gca,'CLim',[0 255]); axis image;
title('original');
ax(2)=subplot(122);
imagesc(uint8(255*deblur));
set(gca,'CLim',[0 255]); axis image;
title('deblurred');
linkaxes(ax);
figure(27);
imagesc(kEst);

二十二. 遇到不好将矩阵向量化的时候,用vec(X)=X(:)

% eg. 
vec(x{1});

二十三. 批处理读取、保存图像

读取mat文件

%load image and kernel
imDir = './data/';
imFile = ['im0' num2str(i) '_ker0' num2str(j) '.mat'];
imPath = [imDir imFile];
load(imPath);

读取图像

?待补

保存图像

imwrite(ygray,['.\Outcome\Rgirl',num2str(i),'.jpg']);

二十四. 将子文件夹加入路径,有时不加会出现调用错误

addpath('./data/');
addpath('./utilities/');

二十五. 用向量做矩阵的索引

A = [1,2,3;4,5,6;7,8,9];
S = A([1 3],[2 3]);
->  S = [2,3;8,9];

你可能感兴趣的:(Matlab图像处理笔记(二))