matlab学习笔记入门.docx
《matlab学习笔记入门.docx》由会员分享,可在线阅读,更多相关《matlab学习笔记入门.docx(15页珍藏版)》请在冰豆网上搜索。
![matlab学习笔记入门.docx](https://file1.bdocx.com/fileroot1/2023-2/23/7ca8197e-4fbf-4697-abd7-47d8090abfb7/7ca8197e-4fbf-4697-abd7-47d8090abfb71.gif)
matlab学习笔记入门
数据类:
double,unit8,unit16,unit32,int8,int16,int32,single,char,logical!
Matlab中所有数值计算都可以用double类来进行!
,unit8实际中最常用的图像
图像类型:
亮度图像,二值图像,索引图像,RGB图像
亮度图像:
是数据矩阵,若是unit8或uint16则是【0,255】或者是【0,65535】,若是double类,则像素取值是浮点数
二值图像只有:
0和1的逻辑数组!
、
简单操作:
读图并显示详细情况
>>f=imread('E:
\image\book.pgm');whos
NameSizeBytesClassAttributes
f289x33897682uint8
将图像垂直翻转:
>>f=imread('E:
\image\book.pgm');fp=f(end:
-1:
1,:
);imshow(fp)
将图像上下左右翻转:
f=imread('E:
\image\book.pgm');fc=f(end:
-1:
1,end:
-1:
1);imshow(fc)
将图像二次采样并显示详情:
>>fs=f(1:
2:
end,1:
2:
end);imshow(fs)
>>whosfs
NameSizeBytesClassAttributes
fs145x16924505uint8
将图像取出一部分:
>>fg=f(200:
250,200:
300);imshow(fg)
显示图像中的一条水平扫描线:
>>plot(f(200,:
)
将两幅图像进行相乘:
f=imread('c:
\image\liangdian.jpg');g=imread('c:
\image\shuiguo.jpg');
g=g(300:
715,500:
1149);f=f(1:
416,1:
650);f
d=double(f);gd=double(g);
p=fd.*gd;数组乘!
pmax=max(p(:
));pmin=min(p(:
));取最大最小值!
pn=mat2gray(p);figure,imshow(pn)
亮度变化:
函数imadjust是对灰度图像进行亮度变化的基本ipt工具:
g=imadjust(f,[low-inhigh-in],[low-inhigh-in],gamma)
Gamma为1线性映射,大于1,则映射被加权至更低(更暗的)输出值,小于一,加权至更高的输出值
明暗反转图像(负片)参数不同:
>>f=imread('E:
\image\book.pgm');g=imadjust(f,[01],[10]);imshow(g)
>>f=imread('E:
\image\book.pgm');g=imadjust(f,[01],[10],2);imshow(g)
>>f=imread('E:
\image\book.pgm');g=imadjust(f,[01],[10],0.5);imshow(g)
另外也可以这样:
进行明暗反转:
g=imcomplement(f);imshow(g)
将0.5到0.75之间的灰度级拓展到0-1,可用于突出我们感兴趣的亮度带
g2=g2=imadjust(f,[0.50.75],[01]);imshow(g2)
这个类似上面语句,但又更多的灰色调,方法是压缩灰度级的低端并扩展灰度级的高端
g3=imadjust(f,[],[],2);imshow(g3)
对数和对比度拉伸变换:
对数变换通过此式子完成:
g=c*log(1+double(f))
对8比特而言,最简便:
gs=im2uint8(mat2gray(g))
使用mat2gray可将值限定在0-1之间,im2uint可将值限定在0-255之间
使用对数变化减小动态范围:
>>g=im2uint8(mat2gray(log(1+double(f)));imshow(g)
图像g与原图像相比,在视觉方面的改善效果是非常明显的
函数intrans:
建立一个函数intrans,利用对比度拉伸方法得到增强图像
然后在主界面输入:
f=imread('E:
\image\book.pgm');g=intrans(f,'stretch',mean2(im2double(f)),0.9);figure,imshow(g)
函数gscale,亮度标度的函数:
g=gscale(f,method,low,high)
处理图像时,即管中间没问题,但想利用8比特或者16比特格式包村或查看一副图像时会出现问题,则要将图像调度在全尺度。
将彩色图像变成灰度图像并变小:
>>I=imread('d:
\image\tupian2.jpg');whosI
NameSizeBytesClassAttributes
I1000x666x31998000uint8
>>I=imread('d:
\image\tupian2.jpg');f=rgb2gray(I);s=f(1:
2:
end,1:
2:
end);imshow(s)
>>whoss
NameSizeBytesClassAttributes
s500x333166500uint8
生成并绘制图像的直方图:
把pgm图像的直方图显示出来:
h=imhist(f,b)b适用于形成直方图的收集箱的个数,即灰度级的个数
>>f=imread('E:
\image\book.pgm');imhist(f)
把彩色图片变成灰度图像再进行显示其直方图:
>>I=imread('d:
\image\tupian2.jpg');f=rgb2gray(I);imhist(s)
直方图经常使用条形图来进行显示:
Bar(horz,v,width)width为1竖条较明显,为零时是简单的垂直线。
默认为0.8
V是一个行向量,它包含将被绘制的点;
下面的语句将生成一幅条形图,其水平轴以10个灰度级为一组:
>>f=imread('E:
\image\book.pgm');h=imhist(f);h1=h(1:
10:
256);horz=1:
10:
256;bar(horz,h1)
>>axis([025501200])
>>set(gca,'xtick',0:
50:
255)
>>set(gca,'ytick',0:
200:
1200)
函数axis:
axis([xminxmaxyminymax])用来标注输出的图线的最大值最小值。
其中,[xminxmaxyminymax]用来表示需要显示坐标的范围,xmin、xmax、ymin、ymax分别表示X、Y轴坐标最小和最大值。
gca表示获得当前轴,xtick和ytick按所示的间隔设置水平轴和垂直轴的刻度
利用title函数可以给图形加入标题:
title(‘titlestring’)‘’内为标题处出现的字符串,把语句加在上面语句之后即可
绘制杆状图:
>>f=imread('E:
\image\book.pgm');
>>h1=h(1:
10:
256);
>>horz=1:
10:
256;
>>stem(horz,h1,'fill')
>>axis([025501200])
>>set(gca,'xtick',0:
20:
255)
>>set(gca,'ytick',0:
100:
1200)
绘制plot图形:
使用函数plot(horz,v,'color-linestyle-maker')
可以自动设定坐标轴的取值范围和刻度线,此时我们使用以下函数:
ylim('auto')
xlim('auto')
直方图均衡化:
灰度级均衡化处理的最终结果是一幅扩展了的动态范围的图像,它具有较高的对比度,注意该变换函数只不过是一个累积分布函数
使用直方图并调用直方图均衡化技术来处理离散灰度级时,一般说来,处理后的图像的直方图将不再均匀,这源于变量的离散属性。
直方图均衡化使用函数histeq(f,nlev)
>>imshow(f);
>>figure,imhist(f);
>>ylim('auto')
>>g=histeq(f,256);
>>figure,imshow(g)
>>figure,imhist(g)
>>ylim('auto')
空间滤波:
线性空间滤波(暂缓····)
subplot(m,n,p)的意思:
plot是图的意思,
sub是子的意思。
subplot(m,n,p)生成m*n个子图,当前激活第p个子图。
彩色图像不能直接进行傅立叶变换,图像处理中很多情况下都是把一幅彩色图像分成三个类似灰度图像(一般是red,green,blue)来进行处理的。
至于进行傅立叶变化,可以直接对灰度图像进行二维傅立叶变换fft2,但是结果仍需要处理才能更容易理解和观察。
高斯模糊是低通滤波的一种,也就是滤波函数是高斯函数,由于理想低通滤波会带来振铃现象,所以往往采用巴特尔茨或者高斯函数作为滤波函数。
高斯滤波是指用高斯函数作为滤波函数,至于是不是模糊,要看是高斯低通还是高斯高通,低通就是模糊,高通就是锐化
高斯平滑滤波:
>>img=imread('e:
\image\shuiguo.jpg');
f=rgb2gray(img);彩图变成灰度图像
subplot(1,2,1);创建子图
imshow(f);并在子图中的一行一列显示灰度图f
f=double(f);把其他类型对象转换为双精度数值
f=fft2(f);二维离散Fourier变换
f=fftshift(f);直流分量对中的谱,,简化频谱的视觉效应,函数fftshift通过交换F的象限来操作,若a=【12;34】则fftshift(a)=【43;21】在变化计算后使用fftshift的结果与在计算变换前将输入图像乘以(-1)的x+y次方所得结果是相同的,但不可以互换!
[m,n]=size(f);size取矩阵的大小
d0=80;
m1=fix(m/2); fix向零取整
n1=fix(n/2); fix向零取整
fori=1:
m
forj=1:
n
d=sqrt((i-m1)^2+(j-n1)^2);
h(i,j)=exp(-d^2/2/d0^2);
end
end
g=f.*h;
g=ifftshift(g);
g=ifft2(g);
g=mat2gray(real(g));real表示复数的实部 ,ifft的输出实际上都会有很小的虚部分量,因此要提取结果的虚部
mat2gray实现图像矩阵的归一化操作。
[1]所谓"归一化"就是使矩阵的每个元素的值都在0和1之间。
该函数在数字图像处理中经常用到。
subplot(1,2,2);
imshow(g);
imwrite(img,'2.jpg');
Do变小··图像变得更加模糊了···原理?
?
频域处理:
计算并可视化二维DFT;
f=imread('e:
\image\heibai.jpg');
subplot(1,2,1);
imshow(f);
g=fft2(f);快速傅立叶变换函数fft:
F=fft2(f);使用傅立叶进行滤波时,需要对输入数据进行零填充则:
F=fft2(f,P,Q)使用所要求的0的个数对输入图像进行填充,以便结果函数的大小为p*q
g=fftshift(g);
subplot(1,2,2);
imshow(abs(g),[])
>>s=log(1+abc(g));imshow(s,[])
傅立叶频谱可以使用函数abs来获得:
s=abs(f)该函数计算数组的每一个元素的幅值(实部和虚部平方和的平方根);下面为计算他的傅立叶变换并显示其频谱:
F=fft2(f);
S=abs(F);
imshow(S,[])
不理想·因此在该例中键入:
Fc=fftshift(F);%fc为已居中的变换。
Imshow(abs(Fc),[]);%居中后的图像很明显
但是该频谱中值的动态范围与··比特显示相比要大得多因此我们使用对数变化来处理该问题:
s2=log(1+abs(fc));subplot(1,4,4);imshow(s2,[])
可视细节的增加就变得很明显了!
总体显示如下;
f=imread('e:
\image\heibai.jpg');
subplot(1,4,1);
imshow(f);
g=fft2(f);
s=abs(g);subplot(1,4,2);
imshow(s,[]);fc=fftshift(s);subplot(1,4,3);imshow(abs(fc),[]);s2=log(1+abs(fc));subplot(1,4,4);imshow(s2,[])
>>
im2bw()
将真彩色、索引色和灰度图像转换为二值图像。
loadtrees
BW=im2bw(X,map,0.4);
imshow(X,map),
figure,
imshow(BW)
ind2gray()
将索引色图像转换为灰度图像。
loadtrees
J=ind2gray(X,map);
imshow(X,map),
figure,
imshow(J)
ind2rgb()
将索引色图像转换为真彩色图像。
loadtrees
J=ind2rgb(X,map);
imshow(X,map),
figure,
imshow(J)
mat2gray()
将数据矩阵转换为灰度图像。
rgb2gray()
将真彩色图像转换为灰度图像。
rgb2ind()
将真彩色图像转换为索引色图像。
把彩色图像转化为灰度图像之后对图像进行直方图均衡化··(改善视觉效果)
f=imread('e:
\image\shuiguo.jpg');
g=rgb2gray(f);
h=histeq(g);
subplot(1,2,1),imshow(g);
subplot(1,2,2),imshow(h);
figure,
subplot(1,2,1),imhist(g);
subplot(1,2,2),imhist(h);
图像增强方法:
对数变换:
I=imread(‘pout.tif’);
imshow(I)
I=double(I)%对数运算不支持uint8类型数据
J=log(I+1);
figure,imshow(J,[4,5])
将彩图变成灰度图像之后,进行直方图均衡化,在把均衡化前后的图像分别做增强··
f=imread('e:
\image\lunzi.png');
g=rgb2gray(f);
h=histeq(g);
i=double(h);
l=log(i+1);
subplot(1,2,1),imshow(l,[4,5]);subplot(1,2,2),imshow(g)>>
增加噪声:
I=imread('eight.tif');
J1=imnoise(I,'gaussian',0,0.02);
%对图像数据添加均值为0,方差为0.02的高斯噪声。
J2=imnoise(I,'salt&pepper',0.02);
%对图像数据添加椒盐噪声。
J3=imnoise(I,'speckle',0.02);
%对图像数据添加乘性噪声。
subplot(2,2,1),imshow(I)
subplot(2,2,2),imshow(J1)
subplot(2,2,3),imshow(J2)
subplot(2,2,4),imshow(J3)
去噪声处理:
领域平均法
h=[111;111;111];%产生滤波模板
h=h/9;%对模板归一化
J=conv2(J1,h);%多项式乘、卷积
subplot(1,2,1),imshow(J1)
subplot(1,2,2),imshow(J2)
Conv2要求都为double或者都为single
去噪声处理
中值滤波:
J=medfilt2(J1);
subplot(1,2,1),imshow(J1)
subplot(1,2,2),imshow(J2)
具体输入如下:
f=imread('e:
\image\yuanquan.png');
i=imnoise(f,'gaussian',0,0.02);
i=rgb2gray(i);
J=medfilt2(i);
imshow(i),figure,imshow(J)
图像变换:
图像变换是图像处理的重要工具。
通过变换,改变图像的表示域,可以对图像的后继处理带来极大的方便。
例如:
傅立叶变换:
图像的频域分析
离散余弦变换:
使能量集中利于图像压缩。
傅立叶变换的例子:
loadimdemossaturn2
imshow(saturn2)
b=fft2(saturn2);
figure
imshow(log(abs(b)),[])
colormap(jet(64));
Colorbar
离散余弦变换(DCT):
b=dct2(saturn2);
figure
imshow(log(abs(b)),[])
colormap(jet(64));
Colorbar
matlab中,每个figure都有(而且仅有)一个colormap,翻译过来就是色图。
COLORMAP(MAP)用MAP矩阵映射当前图形的色图。
COLORMAP('default')默认的设置是JET.
MAP=COLORMAP获得当前色图矩阵.
COLORMAP(AX,...)应用色图到AX坐标对应的图形,而非当前图形