Matlab图像处理笔记(二)
2016-06-24 23:15
411 查看
说明
本笔记整理记录了在使用Matlab进行图像处理学习过程中,使用到的一些常用命令、常见问题、遇到的问题及解决方案,方便日后查看,其中部分内容系来自网络。
九. 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)
十三. 对于图像处理或者二维信号问题,善用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.bmpimread('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];
本笔记仅供学习研究,转载请注明出处@jimye。
转载自:http://blog.csdn.net/left_la/article/details/16116389
相关文章推荐
- PHP GD 图像处理组件的常用函数总结
- PHP图像处理之imagecreate、imagedestroy函数介绍
- 解析在main函数之前调用函数以及对设计的作用详解
- 详解Matlab中 sort 函数用法
- jsvascript图像处理―(计算机视觉应用)图像金字塔
- Javascript图像处理思路及实现代码
- java和matlab画多边形闭合折线图示例讲解
- PHP图像处理之使用imagecolorallocate()函数设置颜色例子
- java数字图像处理基础使用imageio写图像文件示例
- C#调用Matlab生成的dll方法的详细说明
- 使用Java进行图像处理的一些基础操作
- javascript图像处理―边缘梯度计算函数
- Javascript图像处理―阈值函数实例应用
- Javascript图像处理―虚拟边缘介绍及使用方法
- PHP图像处理类库及演示分享
- CI框架文件上传类及图像处理类用法分析
- php图像处理函数大全(推荐收藏)
- 简述Matlab中size()函数的用法
- Javascript图像处理―图像形态学(膨胀与腐蚀)
- Javascript图像处理―平滑处理实现原理