1、第七讲 MATLAB在图像处理中的应用,7.1 概述7.2 图像的读写和查询7.3 图像的显示7.4 图像的算术运算7.5 图像的几何操作7.6 线性滤波7.7 图像的变换7.8 图像分析和增强7.9 基于区域的图像处理,7.1 概述,7.1.1 MATLAB中的图像和图像处理工具箱MATLAB中大多数图像是用二维数组(矩阵)double(64位)浮点型,或uint8(8位无符号整数)、uint16(16位无符号整数)来存储的,矩阵中的每一个元素对应图像中的一个像素(pixel).例如: 一幅由200行300列不同灰度值的点组成的图像可以用200X300的矩阵来存储。 对于彩色图像,如RGB图
2、像,需要用三维数组来存储。,7.1.2 MATLAB中的图像类型,二值图像(Binary):图像的取值为0或1。 索引图像(Indexed,pseudocolor):图像为mXn矩阵,矩阵元素的值指向颜色映像表(colormap)。 灰度图像(intensity,gray scale,gray level) :图像为mXn矩阵,矩阵元素的值指的是灰度值。对single or double矩阵取值范围:0,1,对 uint8矩阵取值范围:0,255,对uint16矩阵取值范围:0,65535,对int16矩阵取值范围:-32768,32767。 真彩色图像(RGB):图像为mXnX3的矩阵。,二
3、值图像(Binary),索引图像(Indexed),灰度图像(Grayscale),真彩色图像(Truecolor),gray2ind: Convert a grayscale image to an indexed image. grayslice:Convert a grayscale image to an indexed image using multilevel thresholding. im2bw: Convert a grayscale image, indexed image, or truecolor image, to a binary image ind2gray:C
4、onvert an indexed image to a grayscale image。,7.1.3 MATLAB中的图像类型之间的转换,ind2rgb: Convert an indexed image to a truecolor image. mat2gray:Convert a data matrix to a grayscale image, by scalingthe data. rgb2gray: Convert a truecolor image to a grayscale image. rgb2ind:Convert a truecolor image to an ind
5、exed image.,im2uint8rgb2 = im2uint8(rgb1) im2uint16 im2int16 im2single im2double,7.1.4 图像数据类型之间的转换,用N维数组来存储图像序列mXnXp的数组表示p个二维图像,7.1.5 图像序列,mXnX3Xp 表示 ?,MATLAB支持下列图像文件格式: BMP (Microsoft Windows Bitmap 位图) HDF (Hierarchical Data Format 层次数据) JPEG (Joint Photographic Expert Group 静止图像压缩标准) PCX (Paintbr
6、ush 画刷格式 ) PNG (Portable Network Graphics 可移植网络图像) TIFF (Tagged Image File Format 标记图像文件) XWD (X Window Dump) GIF (Graphics Interchange Format 图形交换),7.1.5 图像文件格式,7.2 图像的读写和查询,7.2.1 图像文件的读取 A = imread(文件名,文件格式) X,map = imread(文件名,文件格式) 文件名必须在MATLAB的搜索路径范围内,否则需要指出完整的路径。RGB = imread(football.jpg); X,ma
7、p = imread(trees.tif);,7.2 图像的读写和查询,7.2.2 图像文件的写入imwrite(A, filename,fmt):写图像A到文件名filename中,格式为fmt imwrite(X, map,filename,fmt):写索引图像X和它相连的颜色映像表map到文件名filename中,格式为fmt例如: imwrite(A,myfile.jpg,Quality,100); 写图像矩阵到文件名为myfile.jpg的文件中,参数Quality,100是控制存入时压缩比的。,7.2 图像的读写和查询,7.2.3 图像文件信息的查询info = imfinfo(
8、filename):从图像文件中查询其信息,包括文件名、路径、格式、版本号、文件修改时间、文件大小、图像宽度和长度、每个像素的位数、图像类型等。例如: info = imfinfo(football.jpg),7.3 图像的显示,7.3.1 标准图像显示 imshow(I, n) imshow(I,low high) imshow(X, map) 参考MATLAB帮助moon = imread(moon.tif); imshow(moon); 或者:imshow(moon.tif);moon = getimage,7.3 图像的显示,7.3.2 图像的特殊显示技术 添加颜色条 显示多帧图像阵列
9、 多图的显示 纹理映射,7.3 图像的显示,7.3.2 图像的特殊显示技术 添加颜色条RGB = imread(saturn.png);I = rgb2gray(RGB);h = 1 2 1; 0 0 0; -1 -2 -1;I2 = filter2(h,I);imshow(I2,), colorbar,7.3 图像的显示,7.3.2 图像的特殊显示技术 显示多帧图像阵列 多帧的单帧显示 多帧的一次性显示 将多帧阵列转化为电影,多帧的单帧显示load mriimshow(D(:,:,:,7) 多帧的一次性显示load mrimontage(D,map) 将多帧阵列转化为电影load mrimo
10、v = immovie(D,map);movie(mov),7.3 图像的显示,7.3.2 图像的特殊显示技术 多图的显示例1. 多幅图像在不同窗口显示 X1,map1 = imread(forest.tif); X2,map2 = imread(trees.tif); imshow(X1,map1), figure, imshow(X2,map2),7.3 图像的显示,7.3.2 图像的特殊显示技术 多图的显示例2. 多幅图像在同一窗口显示 X1,map1 = imread(forest.tif); X2,map2 = imread(trees.tif); subplot(1,2,1), i
11、mshow(X1,map1) subplot(1,2,2), imshow(X2,map2) 使用同一个颜色映像表,产生不能接受的显示结果,使用subimage可以改变这一情况,7.3 图像的显示,7.3.2 图像的特殊显示技术 多图的显示例3. 多幅图像在同一窗口显示 X1,map1 = imread(forest.tif); X2,map2 = imread(trees.tif); subplot(1,2,1), subimage(X1,map1) subplot(1,2,2), subimage(X2,map2) subimage在显示之前,将图像转换为真彩色,因此避免了colormap
12、的共享问题。,7.3 图像的显示,7.3.2 图像的特殊显示技术 纹理映射:将图像显示在一个特定的参数曲面上warp:MATLAB中利用插值算法将图像映射到曲面网格上例. 将peppers.png图像纹理映射到圆柱面和球面x,y,z = cylinder;I = imread(peppers.png);subplot(1,2,1),warp(x,y,z,I);x,y,z = sphere(50);subplot(1,2,2),warp(x,y,z,I);,7.4 图像的算术运算,图像的加法 imadd 图像的减法 imsubtract 图像的乘法 immultiply 图像的除法 imdivi
13、de 图像的补 imcomplement 图像的绝对值的差 imabsdiff 图像的线性组合 imlincomb,7.4 图像的算术运算,I = imread(rice.png); I2 = imread(cameraman.tif); K = imdivide(imadd(I,I2), 2); % not recommended K = imlincomb(.5,I,.5,I2); % recommended,7.5 图像的几何操作,图像的缩放 imresize 图像的旋转 imrotate 图像的剪裁 imcrop 图像的一般几何变换 imtransform,7.5.1 图像的插值运算,
14、最近邻插值方法(Nearest neighbor) 双线性插值方法(Bilinear) 双三次插值方法(Bicubic),7.5.2 图像的缩放和旋转,B = imresize(A, m, method) B = imresize(A, mrows ncols, method),I = imread(circuit.tif); J = imresize(I,1.25); imshow(I) figure, imshow(J),I = imread(circuit.tif); J = imresize(I,100 150, bilinear); imshow(I) figure, imshow(
15、J),7.5.2 图像的缩放和旋转,B = imrotate(A, angle, method,crop),I = imread(circuit.tif); J = imrotate(I, 35, bilinear); imshow(I) figure, imshow(J)如果:J = imrotate(I, 35, bilinear,crop); 结果的区别?,7.5.3 图像的剪裁,B = imcrop(A) B = imcrop(X,map)用户可以用鼠标选取区域,也可以在函数中定义图像的矩形区域参数,I = imread(circuit.tif); J = imcrop(I); fig
16、ure,imshow(J) 上面剪切图像J也可以用:J = imcrop(I,60 40 100 90);其中位置矢量表示为: xmin ymin width height.,7.5.4 图像的一般几何变换,B = imtransform(A,TFORM,INTERP)它根据变换结构(TFORM)变换二维图像A,变换结构TFORM是由maketform函数或cp2tform函数返回的,INTERP可以取nearest, bilinear(默认值)或bicubic,7.5.4 图像的一般几何变换,B = imtransform(A,TFORM,INTERP) I = imread(cameram
17、an.tif); tform = maketform(affine,1 0 0;0.5 1 0;0 0 1); J = imtransform(I,tform); imshow(J), figure, imshow(J),7.6 图像的线性滤波,滤波是一种图像修正或增强技术。可以突出图像的某些特征,也可以删除另一些特征。 图像滤波的本质是一种邻域操作,输出图像的任一个像素值都是通过输入图像对应的像素邻域内的像素值利用一定的算法得到的。 图像的线性滤波就是输出图像任一个像素值都是通过输入图像对应的像素邻域内的像素值线性组合得到的。 图像的线性滤波是通过卷积来完成的。,7.6 图像的线性滤波,二维
18、卷积函数 conv2 滤波函数 filter2 图像滤波 imfilter 预定义滤波器 fspecial,7.6.1 二维卷积函数 conv2,A = 17 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 9,h = 8 1 63 5 74 9 2,C=conv2(A,h),卷积步骤:,关于卷积核的中心,旋转卷积核180度。 滑动卷积核,将卷积核的中心位于图像矩阵的每一个元素。 将旋转后的卷积核作为权重,乘以对应的矩阵元素 求加权和,计算卷积输出(2,4),C=conv2(A,B) C=conv2(A,B,shape) A:
19、输入图像,B:卷积核,C:输出图像,若A大小为mana, B大小为mbnb, 则C大小为(ma+mb-1)(na+nb-1) shape指定卷积运算的范围: shape=full (the default),返回全部二维卷积结果 shape=same, 返回与A同样大小的卷积中心部分 shape=valid, 不考虑边界补零,返回C大小为(ma-mb+1)(na-nb+1),7.6.2 相关运算实现滤波:filter2,相关运算(correlation) 滑动相关核,将相关核的中心位于图像矩阵的每一个元素。 将相关核作为权重,乘以对应的矩阵元素 求加权和用相关运算实现滤波的函数是filter2
20、 B = filter2(h,A),计算相关输出(2,4),7.6.3 图像的线性滤波,imfilter B=imfilter(A,H,option1,option2,) A:多维图像阵列,H:多维滤波器,option1, option2决定边缘上的处理方法,输出图像大小,采用与filter2相同的方法还是卷积的方法。,例:利用imfilter函数实现均值滤波,I = imread(coins.png); h = ones(5,5) / 25; I2 = imfilter(I,h); imshow(I), title(Original Image); figure, imshow(I2), t
21、itle(Filtered Image),imfilter输入输出的数据类型是一样的,A = magic(5) h = -1 0 1; imfilter(A,h) 可以看到输出有负值,所以有时候在imfilter 前用类型转换,避免这种情况。 A = uint8(magic(5) imfilter(A,h),option:相关和卷积,imfilter既可以用相关,也可以用卷积实现滤波操作,缺省是相关。 A = magic(5); h = -1 0 1 imfilter(A,h) % filter using correlationimfilter(A,h,conv) % filter usin
22、g convolution,option: 边界补零(zero-padding)和边界复制(border replication),边界补零(zero-padding): 缺省,option: 边界补零(zero-padding)和边界复制(border replication),边界补零(zero-padding): 缺省 I = imread(eight.tif); h = ones(5,5) / 25; I2 = imfilter(I,h); imshow(I), title(Original Image); figure, imshow(I2), title(Filtered Imag
23、e with Black Border)缺点:滤波得到的图像边缘有一个dark band,option: 边界补零(zero-padding)和边界复制(border replication),边界复制(border replication),option: 边界补零(zero-padding)和边界复制(border replication),边界复制(border replication) I3 = imfilter(I,h,replicate); figure, imshow(I3); title(Filtered Image with Border Replication)imfilt
24、er还有其他的边界补充选项,参考imfilter的帮助,多维滤波,imfilter既可以处理多维图像,也可以处理多维滤波器。用一个二维滤波器对一个三维图像滤波,相当于对三维图像的每个平面进行二维滤波。 例 :用同样的滤波器对一个真彩色图像的每个颜色平面进行滤波。,% Read in an RGB image and display it rgb = imread(peppers.png); imshow(rgb); % Filter the image and display it. h = ones(5,5)/25; rgb2 = imfilter(rgb,h); figure, imsho
25、w(rgb2),imfilter与filter2、conv2的关系:,filter2、conv2、 convn :将输入转换为double类型,输出也是double的,输入总是补零(zero padded), 不支持其他的边界补充选项。 imfilter:不将输入转换为double,输出只与输入同类型,有灵活的边界补充选项,7.6.4 预定义滤波器,h = fspecial(type,parameters) 例:应用“unsharp masking”滤波器对图像进行滤波 I = imread(moon.tif); h = fspecial(unsharp); I2 = imfilter(I,h
26、); imshow(I), title(Original Image) figure, imshow(I2), title(Filtered Image) 关于fspecial的参数选择参见help,7.7 图像的变换,图像的一般数学表示是用两个空域变量的函数表示,(x,y)表示一个特定点的位置,f(x,y)表示(x,y)处的图像灰度值。 图像的变换就是把图像表达成另一种表示方法。例如傅立叶变换是把图像表示为变化的频率、相位和振幅的复指数的和,这就是频率域。 图像的变换在图像的分析、增强、特征提取、图像压缩等许多领域被广泛应用。,7.7 图像的变换,傅立叶变换(Fourier Transfor
27、m) 离散余弦变换(Discrete Cosine Transform),7.7.1 傅立叶变换 (Fourier Transform),f(m,n)是一个二维离散空域变量(m,n)的函数,那么f(m,n)的二维离散傅立叶(DFT)定义为:,二维离散傅立叶的逆变换(IDFT)为:,7.7.1 傅立叶变换 (Fourier Transform),二维离散傅立叶(DFT)变换的系数:,离散傅立叶(DFT)的计算:,fft、fft2、fftn:分别实现一维、二维和n维离散快速傅立叶变换(DFT) ifft、ifft2、ifftn:分别实现一维、二维和n维离散快速傅立叶逆变换(IDFT),例:图像傅立
28、叶变换和幅值,1. 产生图像矩阵,包括一个矩形区域 f = zeros(30,30); f(5:24,13:17) = 1; imshow(f,InitialMagnification,fit)2. 计算和显示f的傅立叶变换 F = fft2(f); F2 = log(abs(F); figure, imshow(F2,-1 5,InitialMagnification,fit); colormap(jet); colorbar,上图:傅立叶变换的取样很粗,且零频率系数不像传统的那样显示在图像中心,而是显示在左上角。为获得傅立叶变换较精细的取样,采用补零的方法。 3. 补零和计算f的傅立叶变换
29、 F = fft2(f,256,256); F2 = log(abs(F); figure, imshow(F2,-1 5,InitialMagnification,fit); colormap(jet); colorbar,4. 将零频系数移动到图像中心 F = fft2(f,256,256); F2 = fftshift(F); figure, imshow(log(abs(F2),-1 5,InitialMagnification,fit); colormap(jet); colorbar,傅立叶变换的应用:,线性滤波器的频率响应 线性滤波器的脉冲响应的傅立叶变换给出该滤波器的频率响应。
30、freqz2计算和显示滤波器的频率响应。 例:显示高斯滤波器的频率响应 h = fspecial(gaussian); freqz2(h),傅立叶变换的应用:,快速卷积 两个空域函数卷积的傅立叶变换等于这两个函数傅立叶变换的乘积。 例:A = magic(3); B = ones(3); A(8,8) = 0; B(8,8) = 0; C = ifft2(fft2(A).*fft2(B); C = C(1:5,1:5); C = real(C),傅立叶变换的应用:,图像特征识别 例:在一幅包含文字的图像中查找字母a 1、 Read in the sample image bw = imread
31、(text.png); 2、 Create a template for matching by extracting the letter “a“ from the image a = bw(32:45,88:98); imshow(bw); figure, imshow(a);,傅立叶变换的应用:,3、 Compute the correlation of the template image with the original image by rotating the template image by 180o and then using the FFT-based convolu
32、tion technique C = real(ifft2(fft2(bw) .* fft2(rot90(a,2),256,256); figure, imshow(C,) % Scale image to appropriate display range.,傅立叶变换的应用:,4、 find the maximum pixel value and then define a threshold value that is less than this maximum. The locations of these peaks are indicated by the white spots
33、 in the thresholded correlation image. max(C(:) ans = 68.0000thresh = 60; % Use a threshold thats a little less than max. figure, imshow(C thresh) % Display showing pixels over threshold.,7.7.2 离散余弦变换 (Discrete Cosine Transform),通常对于一幅图像的DCT,其重要的可视信息集中在DCT的少数系数上。正是基于这一特性,DCT经常被用于图像压缩应用。例如,DCT是国际标准有损
34、图像压缩算法JPEG的核心。,7.7.2 离散余弦变换 (Discrete Cosine Transform),一个MN矩阵A的DCT定义为:,7.7.2 离散余弦变换 (Discrete Cosine Transform),DCT的逆变换:,7.7.2 离散余弦变换 (Discrete Cosine Transform),MATLAB中计算DCT: dct2函数 使用dct变换矩阵,由dctmtx返回,7.7.2 离散余弦变换 (Discrete Cosine Transform),MATLAB中计算DCT: dct2,idct2函数 使用dct变换矩阵,由dctmtx返回,7.8 图像分析
35、和增强,7.8.1 图像的像素值及其统计 1、提供特定像素的数据值(灰度值或颜色值) pixval:交互显示像素数据值imshow canoe.tifpixval impixel:返回被选中点或选中区域像素的数据值,用户可在参数中提供像素坐标,也可通过鼠标选取。imshow canoe.tifvals = impixel,7.8 图像分析和增强,7.8.1 图像的像素值及其统计 2、图像像素值剖面图形 improfile:沿着图像中一条直线或折线段计算和绘制图像像素值的图形。 C = improfile C = improfile(I,xi,yi)imshow peppers.pngimpro
36、file,7.8 图像分析和增强,7.8.1 图像的像素值及其统计 3、图像轮廓图 imcontour:显示一幅灰度图像的轮廓图。I = imread(rice.png); imshow(I) figure, imcontour(I,3),7.8 图像分析和增强,7.8.1 图像的像素值及其统计 4、图像直方图 imhist:显示灰度图像或索引图像的灰度分布,创建图形窗口绘制出每一灰度级对应像素个数的 柱状图。 I = imread(rice.png); imshow(I) figure, imhist(I),7.8 图像分析和增强,7.8.1 图像的像素值及其统计 5、样本统计量和有关区域属
37、性的一些量 标准的图像统计函数:mean2 std2 corr2分别计算图像矩阵元素的均值、标准差和两个相同矩阵的相关系数。 选定图像区域的有关属性:regionprops 参看help,7.8 图像分析和增强,7.8.2 图像分析(提取图像的结构信息) 边缘检测 edge: 检测图像边缘。 BW = edge(I,method,thresh) 参看help,I = imread(coins.png); imshow(I) BW1 = edge(I,sobel); BW2 = edge(I,canny); imshow(BW1) figure, imshow(BW2),7.8 图像分析和增强,
38、7.8.3 图像的灰度值调整(改善图像质量) 灰度调整 imadjust: 检测图像边缘。 J = imadjust(I, low_in high_in, low_out high_out, gamma) 参看help,X,map = imread(forest.tif); I = ind2gray(X,map); J = imadjust(I,0.5); imshow(I) figure, imshow(J),7.8 图像分析和增强,7.8.3 图像的灰度值调整(改善图像质量) 直方图均衡化 histeq: 灰度值自动调整,变换输入图像的灰度值近似匹配一个特别的直方图作为输出灰度值。 参看h
39、elp,7.8 图像分析和增强,7.8.4 图像去噪 MATLAB提供了一个能加多种噪声的函数 imnoise: 参看help,7.8 图像分析和增强,7.8.4 图像去噪 线性滤波 fspecial imfilter 中值滤波 B=medfilt2(A,m,n) 自适应滤波 J=wiener2(I,m,n),I = imread(eight.tif); imshow(I) J = imnoise(I,salt figure, imshow(L),RGB = imread(saturn.png); I = rgb2gray(RGB); J = imnoise(I,gaussian,0,0.02
40、5); imshow(J) K = wiener2(J,5 5); figure, imshow(K),7.9 基于区域的图像处理,7.9.1 区域的选择 BW = roipoly(I,c,r):设定感兴趣的多边形区域roicolor:用来在颜色或灰度范围内定义感兴趣的区域BW= roicolor(I,128,255),7.9 基于区域的图像处理,7.9.2 区域滤波 J = roifilt2(h, I, BW):对输入图像滤波,返回的图像是对模板为“1”的像素进行过滤波,而对模板为“0”的像素没有滤波,这种运算也成为模板滤波。 J = roifill (I, c,r)J = roifill (I, BW),