图像操作
读取图像
使用imread函数可以将图像读入到MATLAB环境中,如果参数中不包含任何路径时,该函数会从当前目录中寻找该文件。正如如下调用
t=imread('sin.png');
如下图为函数imread和imwrite所支持的一些图像格式
另外,函数size可给出一幅图像的函数和列数。
>> size(t)
ans =
900 1200 3
显示图像
使用函数imshow显示。
调用imshow时如果不写第二个参数的话,将把灰度级默认设为256。
t=imread('temp_01.jpg');
imshow(t);
效果如下。(1)
第二次调用imshow时,我设置了一个范围,作为第二个参数。
figure,imshow(t,[10 120]);
效果如下。
原因:设置第二个参数后,会将所有小于等于10的值都显示为黑色,所有大于等于120的值显示为白色。
关于figure的用法:如果再需要显示一张图片时,MATLAB会用新图像代替旧图像,所以,调用figure的话,就可以直接打开一个新的窗口来显示图片。
保存图像
1.使用函数imwrite可以将图像写到磁盘上,比如:
imwrite(t,'C:\Users\sh qian\Documents\MATLAB\1.jpg','quality',34)
其中后两个参数只适用于jpeg图像,数字(整数)的范围为0到100,用于压缩,数字越小,图像就越不清楚。
2.使用函数imfinfo可以获得该图像的详细信息。
imfinfo('changed.jpg')
ans =
Filename: 'C:\Users\sh qian\Documents\MATLAB\changed.jpg'
FileModDate: '17-Jun-2017 20:06:46'
FileSize: 46601
Format: 'jpg'
FormatVersion: ''
Width: 1448
Height: 891
BitDepth: 24
ColorType: 'truecolor'
FormatSignature: ''
NumberOfSamples: 3
CodingMethod: 'Huffman'
CodingProcess: 'Sequential'
Comment: {2x1 cell}
亮度变换
1.函数imadjust是对灰度图像进行亮度变换的基本IPT工具。
我的第一种调用方式如下:
g1=imread('test4.jpg');
g=imadjust(g1,[0 1],[1 0]);
figure,imshow(g);
效果如下:
与图(1)相比,其中的黑白颜色正好颠倒。这种获得明暗反转图像的过程可用于增强嵌入在黑色区域的白色或灰色细节。
第二种调用方式如下:
g=imadjust(g1,[],[],2);
figure,imshow(g);
效果如下:
与图(1)相比,整体更暗了一些。其中2代表gamma参数,意思是,若gamma小于1,则映射被加权至更亮的输出值。若gamma大于1,则映射被加权至更暗的输出值。若省略,则默认为1。
对数变换
g=im2uint8(mat2gray(log(1+double(g1))));
figure,imshow(g);
效果如下:
很明显,与图(1)相比,变淡了很多。原因是使用对数变换减小了动态范围。
对比度拉伸变换
首先有一个对比度拉伸函数:
s=T(r)=1/1+(m/r)^E,其中r是输入图像的亮度,s是输出图像的相应亮度值,E控制该函数的斜率。
具体代码如下:
g=1./(1+(50./(double(g1)+eps)).^20);
figure,imshow(g);
效果如下:
经过这个函数后,输入值低于50的灰度级压缩为输出图像中较暗灰度级的较窄范围内;类似的,可将输入值高于50的灰度级压缩为输出图像中较亮灰度级的较窄范围内。输出的是一幅具有高对比度的图像。
2.图像处理
直方图生成并绘制
1.使用imhist函数
1.最简方法是指定未输出的函数
b=imread('temp_01.jpg');
imhist(b)
执行结果如下:
可以观察出灰度值在150左右的频数最高。当然,可以通过设置第二个参数把亮度范围进行进一步分割。从视觉效果上,这种直方图显得有些’挤’。因此matlab提供了其他的函数来绘制。
2.使用bar函数
使用这种函数生成的,我们通常称为条形图,而且还可以设置每一条的宽度。
具体看一下怎么用的。
h=imhist(b);
y=h(1:10:256);
x=1:10:256;
bar(x,y);
生成结果如下:
是不是比直方图看起来舒服点呢。。。。
其中x是一个行向量,它包含了将被绘制的点,y是一个与x有着相同维数的向量,它包含水平标度值的增量。我们通常会将水平轴等分为几段,用来降低水平轴的分辨率。
另外我们还可以使用IPT提供给我们的函数,来设置垂直轴和水平轴的范围。
h=imhist(b);
y=h(1:10:256);
x=1:10:256;
bar(x,y);
axis([0 255 0 15000])
set(gca,'xtick',0:50:255);
set(gca,'ytick',0:2000:15000);
注意最后三行代码,首先调用了axis函数,设置了水平轴和垂直轴的最大最小值。最后两行,gca代表”获得当前轴”,xtick和ytick按所示的间隔设置水平轴和垂直轴的刻度。
我们还可以调用xlabel和ylabel函数来表示水平轴和垂直轴的含义。
xlabel('这是我的x轴');
ylabel('这是我的y轴');
整体效果如下:
3.使用stem函数
调用这个函数可以呈现一幅杆状图,一种简单的用法如下:
h=imhist(b);
y=h(1:10:256);
x=1:10:256;
stem(x,y,'fill');
axis([0 255 0 15000])
set(gca,'xtick',0:50:255);
set(gca,'ytick',0:2000:15000);
效果如下:
其中stem函数中,x,y的含义和条形图一致,’fill’参数可以把标记点涂匀。
4.使用plot函数
调用这个函数可将一组点用直线连接起来。这个函数经常用于频繁显示变换函数 。
用法如下:
h=imhist(b);
plot(h);
axis([0 255 0 15000])
set(gca,'xtick',0:50:255);
set(gca,'ytick',0:2000:15000);
效果如下: