资源描述
附录A MATLAB图像处理基础
1.图像文件格式及图像类型
(1)MATLAB支持的几种图像文件格式:
① JPEG(Joint Photogyaphic Expeyts Group):联合图像专家组开发,扩展名为jpg或jpeg。特点:压缩比可调;存储效率高;图像质量较高;适合WEB图片的存储与传输。
② BMP(Windows Bitmap):是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。特点:包含的图像信息较丰富,几乎不进行压缩,导致占用磁盘空间过大。所以,目前BMP在单机上比较流行。
③ GIF(Graphics Interchange Format):图形交换格式,由CompuServe公司针对网络传输带宽限制于1987年开发,用于交流和传输图片。 特点:压缩比高;存储效率高;多幅静止图像形成连续动画;色深最大为8位;图像最大不超过64M;支持渐显方式。
④ TIFF(Tagged Iamge File Format):由Aldus和微软联合开发,出于跨平台存储扫描图像需要而设计,广泛用于印刷业。特点:图像格式复杂;存储信息完备;图像质量高;可扩展、方便和可修改;读写速度慢。
⑤ PNG(Portable Network Graphics):便携网络图形格式,于1996年10月1日获准推荐认可标准。特点:目前保证最不失真的图像格式;吸取GIF和JPEG的优点,存储形式丰富;极限压缩比例的同时保证图像质量;显示速度快;支持透明图像制作;缺点是不支持动画。
另有PCX、HDF、ICO、CUR、XWD、RAS、PBM、PGM等文件格式。
(2)MATLAB支持五种图像类型,有关它们的定义见表1。
表1 图像类型及其对应的像素数据类型
图像类型
Double数据
uint8和uint16数据
二值图像
图像为m×n的整数矩阵,元素值范围[0,1]
图像为m×n的整数矩阵,元素值范围[0,1]
索引图像
图像为m×n的整数矩阵,元素值范围[0,p]
图像为m×n的整数矩阵,元素值范围[0,p-1]
灰度图像
图像为m×n的浮点数矩阵,元素值范围[0,1]
图像为m×n的整数矩阵,元素值范围[0,255]或[0,65535]
RGB图像
图像为m×n×3的浮点数矩阵,元素值范围[0,1]
图像为m×n×3的整数矩阵,元素值范围[0,255]或[0,65535]
2.图像类型判断及转换
(1)在MATLAB中如果要判断一个图像文件的类型,可使用如下指令:
isbw:若图像为二值图像,则返回真。
isgray:若图像为灰度图像,则返回真。
isind:若图像为索引图像,则返回真。
isrgb:若图像为RGB图像,则返回真。
(2)在MATLAB系统中,要将一个类型的图像文件转换成另一个类型,只需将前一个文件的图像数据用imread读出,再用imwrite以适当的格式写到后一个图像文件中去即可。MATLAB提供了用于图像类型的转换的若干函数:
dither: 用抖动法(dithering)转换图像。
gray2ind: 灰度图像或二值图像向索引图像转换。
grayslice: 设定阈值将灰度图像转换为索引图像。
im2bw: 设定阈值将灰度、索引、RGB图像转换为二值图像。
im2double:将图像数组转换为double型。
im2uint8: 将图像数组转换为uint8型。
im2uint16:将图像数组转换为uint16型。不支持二值图像序列的转换。
ind2gray: 索引图像向灰度图像转换。
ind2rgb: 索引图像向RGB图像转换。
mat2gray: 将一个数据矩阵转换为灰度图像。
rgb2gray: RGB图像向灰度图像转换或将彩色色图转换成灰度色图。
rgb2ind: RGB图像向索引图像转换。
im2java: 一般图像向Java图像转换。
label2rgb: 标志图像向RGB图像转换。
3. 基本图像处理函数
clear: 清空内存中的变量;
close all: 关闭所有的图形视窗
figure: 强制生成一个新的个绘图窗口;
axis([xmin xmax ymin ymax ...]):设置坐标轴显示范围
imread
功能:从图形文件中读取图像。
语法:
[X,map] = imread(filename.fmt)
[…] = imread(filename)
[…] = imread(URL,…)
[…] = imread(…,idx) (CUR,ICO and TIFF only)
[…] = imread(…,’frames’,idx) (GIF only)
[…] = imread(…,ref) (HDF only)
[…] = imread(…,’BackgroundColor’,BG) (PNG only)
[A,map,alpha] = imread(…) (ICO,CUR and PNG only)
举例:
[X,map] = imread('flowers.tif',6);
imwrite
功能:把图像写入图形文件中。
语法:
imwrite(A,filename,fmt)
imwrite(X,map,filename,fmt)
imwrite(...,filename)
imwrite(...,Param1,Val1,Param2,Val2...)
其中imwrite(…,Param1,Val1,Param2,Val2…)可以让用户控制HDF、JPEG、TIFF等一些图像文件格式的输出特性。在MATLAB中,默认的保存类型是uint8。由于PNG和TIFF格式支持16位的图像,所以保存这类图像时,保存类型就是uint16。
举例
imwrite(X,map,'flowers.hdf','Compression','none','WriteMode','append')
figure
功能:创建图形窗口。
语法:
figure
figure('PropertyName',PropertyValue,...)
figure(h)
h = figure(...)
subplot
功能:分割图形窗口。
语法:
subplot(m,n,p)
subplot(m,n,p,'replace')
subplot(m,n,p,'align')
subplot(h)
subplot('Position',[left bottom width height])
h = subplot(...)
imshow
功能:显示图像。
语法:
l imshow filename:显示图像文件。
l imshow(BW): 显示二值图像,BW为黑白二值图像矩阵。
l imshow(X,map): 显示索引图像,X为索引图像矩阵,map为色彩图示。
l imshow(I):显示灰度图像,I为二值图像矩阵。
l imshow(RGB):显示RGB图像,RGB为RGB图像矩阵。
l imshow(I,[low high]):将非图像数据显示为图像,这需要考虑数据是否超出了所显示类型的最大允许范围,其中[low high]用于定义待显示数据的范围。
imhist
功能:显示图像数据的柱状图。
语法:
imhist(I,n)
imhist(X,map)
[counts,x] = imhist(...)
举例
I = imread('pout.tif');
imhist(I)
histeq
功能:用柱状图均等化增强对比。
语法:
J = histeq(I,hgram)
J = histeq(I,n)
[J,T] = histeq(I,...)
举例
I = imread('tire.tif');
J = histeq(I);
imshow(I)
figure, imshow(J)
imnoise
功能:增加图像的渲染效果。
语法:
J = imnoise(I,type)
J = imnoise(I,type,parameters)
举例:
I = imread('eight.tif');
J = imnoise(I,'salt & pepper',0.02);
medfilt
功能:进行二维中值过滤。
语法:
B = medfilt2(A,[m n])
B = medfilt2(A)
B = medfilt2(A,'indexed',...)
edge
功能:识别强度图像中的边界。
语法:
BW = edge(I,'sobel')
BW = edge(I,'sobel',thresh)
BW = edge(I,'sobel',thresh,direction)
[BW,thresh] = edge(I,'sobel',...)
BW = edge(I,'prewitt')
BW = edge(I,'prewitt',thresh)
BW = edge(I,'prewitt',thresh,direction)
[BW,thresh] = edge(I,'prewitt',...)
BW = edge(I,'roberts')
BW = edge(I,'roberts',thresh)
[BW,thresh] = edge(I,'roberts',...)
BW = edge(I,'log')
BW = edge(I,'log',thresh)
BW = edge(I,'log',thresh,sigma)
[BW,threshold] = edge(I,'log',...)
BW = edge(I,'zerocross',thresh,h)
[BW,thresh] = edge(I,'zerocross',...)
BW = edge(I,'canny')
BW = edge(I,'canny',thresh)
BW = edge(I,'canny',thresh,sigma)
[BW,threshold] = edge(I,'canny',...)
imresize
功能:改变图像大小。
语法:
B = imresize(A,m,method)
B = imresize(A,[mrows ncols],method)
B = imresize(...,method,n)
B = imresize(...,method,h)
imrotate
功能:旋转图像。
语法:
B = imrotate(A,angle,method)
B = imrotate(A,angle,method,'crop')
举例
I = imread('ic.tif');
J = imrotate(I,–4,'bilinear','crop');
imshow(I)
figure, imshow(J)
其它相关函数请参考Matlab的帮助系统。
编程中常用的matlab函数
实验中可能用到的matlab函数简介如下,更详细的内容可以查看matlab的帮助文档。
(1)图象读取
将图象读入matlab中成为二维数组(灰度图)或三维数组(RGB彩色图)。
格式为 I = imread (FILENAME, FMT)
例如 I = imread ('mypicture', 'bmp');
或 I = imread ('mypicture.bmp');
或 I = imread ('e:\mypath\mypicture.bmp');
注意图象文件名和图象格式参数都必须用单引号括起,如果图象不在当前目录,则图象文件名必须包括完整的路径。图象格式可以为'bmp','jpg'等,详细参见matlab的帮助。
(2)图象写入
将二维数组(灰度)或三维数组(RGB彩色)作为图象数据写入图象文件中。
格式为 imwrite (A, FILENAME, FMT)
例如 imwrite (A, 'mypicture', 'jpg');
或 imwrite (A, 'mypicture.jpg');
或 imwrite (A, 'e:\mypath\mypicture.jpg');
参数格式问题同imread函数
(3)数据精度的改变
uint8(A),将A转化为8位无符号整数,图象数据多为此数据格式
double(A)和single(A),将A转化为双精度浮点数和单精度浮点数,这里占8字节和4字节,matlab的大多数函数只支持这两种精度的数,而double更常用。运算前必须将uint8型数据转化为double型,而储存或显示时必须注意数据格式。
(4)图象显示
imshow(A),将数组作为图象显示,默认以256级灰度显示。
注意,在matlab中,如果A是uint8数据,则灰度有效值0~255;如果A是double数据,则灰度有效值0~1,大于1均视为1,小于0均视为0。故显示时必须注意图象格式,如果有效值在0~255,则显示时需使用uint8函数加以转换。
(5)彩色图象至灰度图象的转化
一般所获得的图象多为RGB彩色图象(即使其中只有灰度信息),故处理时需加以转化。
格式为 I = RGB2GRAY(RGB)
RGB为代表彩色图象的三维数组,I为相应的代表灰度的二维数组。
(1)fft2
F = fft2(X);
求X的二维快速傅立叶变换F,F的尺寸与X相同。
F = fft2(X, M, N);
求X的二维快速傅立叶变换F,F为M行N列。
(2)ifft2
X = ifft2(F);
求F的二维快速傅立叶逆变换X,X的尺寸与F相同。
X = iffft2(F, M, N);
求F的二维快速傅立叶逆变换X,X为M行N列
(3)fftshift
X2 = fftshift(X1);
将直流移位到频谱中心,可以用于一维或二维的情况。
(4)ifftshift
X1 = ifftshift(X2);
fftshift的逆操作,可以用于一维或二维的情况。
(5)abs
求复数的幅值,对于实数则求绝对值。
(6)angle
求复数的相位角。
matlab的二维滤波器函数filter2
// g = filter2(P,f),P是模板系数。
3.空域平滑滤波(模糊、去噪)
clear all; close all
I = imread('eight.tif');
h1 = ones(3,3) / 9;
h2 = ones(5,5) / 25;
I1 = imfilter(I,h1);
I2 = imfilter(I,h2);
subplot(2,2,1), imshow(J1) , title('gaussian');
对J1进行中值滤波
K3 = medfilt2(J1,[3 3]);
histeq()--直方图均衡
imnoise()--给图像加噪声
medfilt2()--中值滤波
mean2()--求图像的均值
dct2()--对图像进行2维DCT变换
算法流程:
图象线性空域滤波算法流程:
1) 读取图象f;
2) 确定图象大小M×N;
3) 滤波结果图象g = zeros(M, N),与原图象相同;
4) 确定模板大小m×n(2a+1,2b+1),及其系数w;
5) for x = (a+1) to (M-a) // 对图象内每个象素滤波。边界不处理,保持为0
for y = (b+1) to (N-b)
end
end
// 一个更简单的方法是利用matlab的二维滤波器函数filter2
// g = filter2(P,f),P是模板系数。
另:为方便操作,将图象读入后,转化为double型,并除以255,这样转化为[0,1]之间double型,之后显示和存储都采用该格式。
f = imread('×××.×××');
f = double(f)/255;
图像恢复算法流程
全滤波:
(1)求退化图象g(x,y)的傅立叶变换G(u,v)
(2)设置退化函数H(u,v) // 注意尺寸与G(u,v)相同
(3)计算F(u,v) = G(u,v)/H(u,v)
(4)计算F(u,v)的傅立叶逆变换,得到恢复图象f(x,y) // 取实部即可
限制频带的逆滤波:
(1)求G(u,v)
(2)设置退化函数H(u,v)
(3)设置低通函数B(u,v)
(4)计算 F(u,v) = G(u,v)B(u,v)/H(u,v)
(5)计算F(u,v)的傅立叶逆变换,得到恢复图象f(x,y)
基本全局门限
基本全局门限方法是通过一种试探性的方法确定门限的。算法如下:
1)选择一个门限的初始估计值T;
2)用T分割图象。生成两组象素:G1由所有灰度大于T的象素组成,而G2由所有灰度小于T的象素组成;
3)对区域G1和G2中所有象素计算灰度平均值和;
4)计算新的门限值:
5)重复步骤2到4,直到逐次迭代所得的T值之差小于事先定义的参数T 0;
6)根据选择的门限对图象进行标记。
其他函数
conv2 函数
功能:计算二维卷积
rgb2gray 将一副真彩色图像转换成灰度图像
展开阅读全文