本笔记整理记录了在使用Matlab进行图像处理学习过程中,使用到的一些常用命令、常见问题、遇到的问题及解决方案,方便日后查看,其中部分内容系来自网络。
本笔记仅供学习研究,转载请注明出处@jimye。
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提供了一系列低层输入输出函数,专门用于文件操作。
在读写文件之前,必须先用fopen函数打开或创建文件,并指定对该文件进行的操作方式。fopen函数的调用格式为:
fid=fopen(文件名,‘打开方式’)
说明:其中fid用于存储文件句柄值,如果返回的句柄值大于0,则说明文件打开成功。文件名用字符串形式,表示待打开的数据文件。常见的打开方式如下:
‘r’:只读方式打开文件(默认的方式),该文件必须已存在。
‘r+’:读写方式打开文件,打开后先读后写。该文件必须已存在。
‘w’:打开后写入数据。该文件已存在则更新;不存在则创建。
‘w+’:读写方式打开文件。先读后写。该文件已存在则更新;不存在则创建。
‘a’:在打开的文件末端添加数据。文件不存在则创建。
‘a+’:打开文件后,先读入数据再添加数据。文件不存在则创建。
另外,在这些字符串后添加一个“t”,如‘rt’或‘wt+’,则将该文件以文本方式打开;如果添加的是“b”,则以二进制格式打开,这也是fopen函数默认的打开方式。
文件在进行完读、写等操作后,应及时关闭,以免数据丢失。关闭文件用fclose函数,调用格式为:
sta=fclose(fid)
说明:该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回-1。如果要关闭所有已打开的文件用fclose('all');
。
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 %表示关闭成功
fread函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:
[A,COUNT]=fread(fid,size,precision)
说明:其中A是用于存放读取数据的矩阵、COUNT是返回所读取的数据元素个数、fid为文件句柄、size为可选项,若不选用则读取整个文件内容;若选用则它的值可以是下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。
precision用于控制所写数据的精度,其形式与fwrite函数相同。
fscanf函数可以读取文本文件的内容,并按指定格式存入矩阵。其调用格式为:
[A,COUNT]=fscanf(fid,format,size)
说明:其中A用来存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄,format用来控制读取的数据格式,由%加上格式符组成,常见的格式符有:d(整型)、f(浮点型)、s(字符串型)、c(字符型)等,在%与格式符之间还可以插入附加格式说明符,如数据宽度说明等。size为可选项,决定矩阵A中数据的排列形式,它可以取下列值:N(读取N个元素到一个列向量)、inf(读取整个文件)、[M,N](读数据到M×N的矩阵中,数据按列存放)。
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; % 按排序赋值,其余为零
比如,要对每个像素,基于其局部邻域进行一些计算。即使整个计算本身不是线性的,但是只要能分解成线性局部运算的组合,就可以利用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
结合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。
phi = mod(p3,180)/180*pi;
t=0:100;
y=80*(t>=0&t<40)+20*(t>=40&t<80)+70*(t>=80&t<=100);
plot(t,y)
bad_jumps = setdiff(jumps, good_jumps);%余集
先延拓邻域的半径大小
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);%变成原大小
% 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')
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);
print -deps fig1.eps
imshow(strain_image,'border','tight','initialmagnification','fit');
%'border','tight'的组合功能意思是去掉图像周边空白
%'InitialMagnification','fit'组合的意思是图像填充整个figure窗口
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);
% 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];