///matlab图像处理工具箱/
图像格式
文件格式不同在于不同软件对二进制文件的编码解码方法方式不同,理论上一款软件就有自己的一套文件格式,统一文件格式适用于不同的传输要求和欣赏要求
图像格式
文件格式不同在于不同软件对二进制文件的编码解码方法方式不同,理论上一款软件就有自己的一套文件格式,统一文件格式适用于不同的传输要求和欣赏要求
图像类型
二进制图像每个像素点用二进制0 1表示
索引图像是一种把像素值直接作为 RGB 调色板下标的图像,每个像素点映射成一种调配色
灰度图像通常由一个 unit8、unit16 或双精度类型的数组来描述,其实质是一个数据矩阵 I,该矩阵中的数据均代表了一定范围内的灰度级,每一个元素与图像的一个像素点相对应, 通常 0 代表黑色,1、255 或 65635(针对不同存储类型)代表白色。
多帧图像是一种包含多幅图像或帧的图像文件,又称为多页图像或图像序列,它主要用 于需要对时间或场景集合进行操作的场合,例如磁谐振图像切片或电影帧等
RGB 图像又称为真彩图像,它是利用 R、G、B 三个分量标识一个像素的颜色,R、G、 B 分别代表红、绿、蓝 3 种不同的颜色,通过三基色可以合成出任意颜色
二进制图像每个像素点用二进制0 1表示
索引图像是一种把像素值直接作为 RGB 调色板下标的图像,每个像素点映射成一种调配色
灰度图像通常由一个 unit8、unit16 或双精度类型的数组来描述,其实质是一个数据矩阵 I,该矩阵中的数据均代表了一定范围内的灰度级,每一个元素与图像的一个像素点相对应, 通常 0 代表黑色,1、255 或 65635(针对不同存储类型)代表白色。
多帧图像是一种包含多幅图像或帧的图像文件,又称为多页图像或图像序列,它主要用 于需要对时间或场景集合进行操作的场合,例如磁谐振图像切片或电影帧等
RGB 图像又称为真彩图像,它是利用 R、G、B 三个分量标识一个像素的颜色,R、G、 B 分别代表红、绿、蓝 3 种不同的颜色,通过三基色可以合成出任意颜色
在有些图像操作中,需要对图像的类型进行转换。比如要对一副索引图像的彩色图像进 行滤波,首先应该将其转换成 RGB 图像,此时在对 RGB 图像使用滤波器时,MATLAB 7.0 将恰当地滤掉图像中的部分灰度值。如果不将索引图像进行转换,MATLAB 7.0 则对图像调 色板的序号进行滤波,这样得到的结果将没有任何意义。下面对一些 MATLAB 7.0 图像处理 工具箱中常用的类型转换进行介绍
图像颜色浓淡处理(图像抖动)
dither 函数通过抖动算法转换图像类型,其语法格式为:
灰度图像转换为索引图像
gray2ind 函数可以将灰度图像转换成索引图像,其语法格式如下:
索引图像转换为灰度图像
ind2gray 函数可以将索引图像转换为灰度图像,其语法格式如下:
索引图像转换为灰度图像
ind2gray 函数可以将索引图像转换为灰度图像,其语法格式如下:
RGB 图像转换为索引图像
rgb2ind 函数用于将真彩图像转换成为索引图像,可采用直接转换、均匀量化、最小量化、 颜色图近似 4 种方法。除直接转换方法外,其他方法在不指定选项 nodither 时自动进行图像 抖动。其语法格式为
索引图像转换为 RGB 图像
ind2rgb 函数将索引图像转换成真彩图像,其语法格式为:
通过阈值化方法将图像转换为二值图像
im2bw 函数通过设置亮度阈值将真彩图像、索引图像以及灰度图像转换成二值图像。在 转换过程中,如果输入图像不是灰度图像,首先将其转换为灰度级图像,然后通过阈值化将 灰度级图像转换成二值图像。输出二值图像和输入图像之间的关系是在输入图像所有亮度小 于给定值(level 取值范围为[0,1])的像素点处均为 0,其他均为 1。其语法格式为:
通过阈值化方法从灰度图像产生索引图像
grayslice 函数通过设定阈值将灰度图像转换成索引图像,其语法格式为:
将矩阵转换为灰度图像
mat2gray 函数用于将一个数据矩阵转换为一幅灰度图像,其语法格式为:
图像颜色浓淡处理(图像抖动)
dither 函数通过抖动算法转换图像类型,其语法格式为:
灰度图像转换为索引图像
gray2ind 函数可以将灰度图像转换成索引图像,其语法格式如下:
索引图像转换为灰度图像
ind2gray 函数可以将索引图像转换为灰度图像,其语法格式如下:
索引图像转换为灰度图像
ind2gray 函数可以将索引图像转换为灰度图像,其语法格式如下:
RGB 图像转换为索引图像
rgb2ind 函数用于将真彩图像转换成为索引图像,可采用直接转换、均匀量化、最小量化、 颜色图近似 4 种方法。除直接转换方法外,其他方法在不指定选项 nodither 时自动进行图像 抖动。其语法格式为
索引图像转换为 RGB 图像
ind2rgb 函数将索引图像转换成真彩图像,其语法格式为:
通过阈值化方法将图像转换为二值图像
im2bw 函数通过设置亮度阈值将真彩图像、索引图像以及灰度图像转换成二值图像。在 转换过程中,如果输入图像不是灰度图像,首先将其转换为灰度级图像,然后通过阈值化将 灰度级图像转换成二值图像。输出二值图像和输入图像之间的关系是在输入图像所有亮度小 于给定值(level 取值范围为[0,1])的像素点处均为 0,其他均为 1。其语法格式为:
通过阈值化方法从灰度图像产生索引图像
grayslice 函数通过设定阈值将灰度图像转换成索引图像,其语法格式为:
将矩阵转换为灰度图像
mat2gray 函数用于将一个数据矩阵转换为一幅灰度图像,其语法格式为:
图像的显示过程是将数字图像从一组离散数据还原为一幅可见图像的过程。严格地说, 图像的显示在图像处理(尤其是图像分析过程)中并不是必须的,因为图像处理和分析过程 都是基于图像数据的计算,以数字数据或决策的形式给出处理或分析的结果,其中间过程并 不一定要求可视。但是图像的显示是提高图像处理分析性能非常有用的手段,通过图像的显 示,可以监视图像处理过程,并与处理分析交互地控制处理分析过程。 图像显示最重要的特性是图像的大小、光度分辨率、灰度线性、平坦能力和噪声特性等, 这些显示特性将共同决定一个数字图像显示系统的质量及其在特定应用中的适用性等性能指 标。本节主要介绍 MATLAB 7.0 软件图像显示工具,MATLAB 7.0 及图像处理工具箱的显示 功能非常强大,不仅可以用来显示各种类型的图像,还可以用多种方式显示图像及图像序列。 本节将介绍 MATLAB 7.0 中的基本图像显示技术,包括多图像显示和纹理映射等。
imshow 函数
当用户调用 imshow 函数显示图像时,将自动设置图形窗口、坐标轴和图像属性,以控 制图像数据在 MATLAB 7.0 的解释方式。这些自动设置的属性包括图像对象的 CData 属性和 CDdata-Mapping 属性、坐标轴对象的 Clim 属性和图像窗口对象的 Colormap 属性
显示索引图像
利用 imshow 函数显示 MATLAB 7.0 的索引图像时,可以同时指定图像的数据矩阵和颜 色映射表,具体调用形式为
显示灰度图像
调用 imshow 函数显示灰度图像的语法如下:
显示二进制位图
下面介绍 imshow 函数显示二进制位图的语法。
显示 RGB 图像
RGB 图像即真彩图像。RGB 图像直接表征像素颜色,而不是其他像图像那样通过颜色 映射表来指定像素颜色,显示 RGB 图像的语法如下
显示图形文件中的图像
通常情况下,在显示图像时,该图像的对象数据保存在 MATLAB 7.0 运行内存中的一个 或多个变量中。但是,如果用户将图像保存在可以通过 imread 函数读取的图形文件中,则可 以通过下面的语法直接将其显示出来
当用户调用 imshow 函数显示图像时,将自动设置图形窗口、坐标轴和图像属性,以控 制图像数据在 MATLAB 7.0 的解释方式。这些自动设置的属性包括图像对象的 CData 属性和 CDdata-Mapping 属性、坐标轴对象的 Clim 属性和图像窗口对象的 Colormap 属性
显示索引图像
利用 imshow 函数显示 MATLAB 7.0 的索引图像时,可以同时指定图像的数据矩阵和颜 色映射表,具体调用形式为
显示灰度图像
调用 imshow 函数显示灰度图像的语法如下:
显示二进制位图
下面介绍 imshow 函数显示二进制位图的语法。
显示 RGB 图像
RGB 图像即真彩图像。RGB 图像直接表征像素颜色,而不是其他像图像那样通过颜色 映射表来指定像素颜色,显示 RGB 图像的语法如下
显示图形文件中的图像
通常情况下,在显示图像时,该图像的对象数据保存在 MATLAB 7.0 运行内存中的一个 或多个变量中。但是,如果用户将图像保存在可以通过 imread 函数读取的图形文件中,则可 以通过下面的语法直接将其显示出来
特殊图像显示技术
在 MATLAB 7.0 的图像处理工具箱中,除了 imshow 函数外,还提供了一些实现特殊显 示功能的函数。它们与 MATLAB 7.0 自身提供的图形函数相结合,为图像显示提供了各种特 殊的显示技术,包括图像显示中添加颜色条;显示多帧图像阵列;将图像纹理映射到表面对 象上。下面将具体介绍这些技术的实现方法。
添加颜色条
在 MATLAB 7.0 的图像显示中,可以利用 colorbar 函数将颜色条添加到坐标轴对象中。 如果该坐标轴对象包含一个图像对象,则添加的颜色条将指示出该图像中不同颜色的数据值
实例:例如,下面的代码将首先过滤一个类为 uint8 的图像,然后将其显示为灰度图,并添加 颜色条,示例代码如下:
RGB = imread(’saturn.png’);
I = rgb2gray(RGB);
h = [1 2 1; 0 0 0; -1 -2 -1];
I2 = filter2(h,I);
imshow(I2,[]), colorbar
显示多帧图像阵列
多帧图像是一个包含多个图像的图像文件。MATLAB 7.0 支持的多帧图像的文件格式包 括 HDF 和 TIFF 两种。文件一旦被读入 MATLAB,多帧图像的显示帧数由矩阵的第四维数值 来决定。调用 montage 函数可实现多帧显示,该函数的语法如下:
上面几种函数调用方式分别对应着不同的图像格式,有兴趣的读者可以一一验证。这里 举一个简单的例子进行说明:
实例:%定义一个 4 维矩阵,用来存储 27 幅核磁共振图像
mri = uint8(zeros(128,128,1,27)); %循环读出多帧图像中的每一幅图像
for frame=1:27
[mri(:,:,:,frame),map] = imread(’mri.tif’,frame);
end %多帧显示
montage(mri,map);
除了多帧显示之外,还可以利用 immovie 函数,从多帧图像阵列中创建 MATLAB 7.0 电 影动画。值得提醒的是该函数只能用于索引图像,所以如果希望将其他类型的图像阵列转化 为电影动画,则首先必须将该图像类型转换为索引类型
在 MATLAB 7.0 的图像显示中,可以利用 colorbar 函数将颜色条添加到坐标轴对象中。 如果该坐标轴对象包含一个图像对象,则添加的颜色条将指示出该图像中不同颜色的数据值
实例:例如,下面的代码将首先过滤一个类为 uint8 的图像,然后将其显示为灰度图,并添加 颜色条,示例代码如下:
RGB = imread(’saturn.png’);
I = rgb2gray(RGB);
h = [1 2 1; 0 0 0; -1 -2 -1];
I2 = filter2(h,I);
imshow(I2,[]), colorbar
显示多帧图像阵列
多帧图像是一个包含多个图像的图像文件。MATLAB 7.0 支持的多帧图像的文件格式包 括 HDF 和 TIFF 两种。文件一旦被读入 MATLAB,多帧图像的显示帧数由矩阵的第四维数值 来决定。调用 montage 函数可实现多帧显示,该函数的语法如下:
上面几种函数调用方式分别对应着不同的图像格式,有兴趣的读者可以一一验证。这里 举一个简单的例子进行说明:
实例:%定义一个 4 维矩阵,用来存储 27 幅核磁共振图像
mri = uint8(zeros(128,128,1,27)); %循环读出多帧图像中的每一幅图像
for frame=1:27
[mri(:,:,:,frame),map] = imread(’mri.tif’,frame);
end %多帧显示
montage(mri,map);
除了多帧显示之外,还可以利用 immovie 函数,从多帧图像阵列中创建 MATLAB 7.0 电 影动画。值得提醒的是该函数只能用于索引图像,所以如果希望将其他类型的图像阵列转化 为电影动画,则首先必须将该图像类型转换为索引类型
.纹理映射
在使用 imshow 函数时,MATLAB 7.0 在二维空间中显示图像。除此之外,MATLAB 7.0 专门提供了一个对图像进行纹理映射处理的函数 warp,使之显示在三维空间中,三维的面可 以是柱面、球面以及自定义的三维曲面。warp 函数的语法格式如下:
在 MATLAB 7.0 中,纹理映射是利用双线性渐进算法将图像映射到某个表面栅格上。例 如下面的代码:
实例:[x,y,z] = cylinder;
I = imread(’testpat1.png’);
warp(x,y,z,I);
在使用 imshow 函数时,MATLAB 7.0 在二维空间中显示图像。除此之外,MATLAB 7.0 专门提供了一个对图像进行纹理映射处理的函数 warp,使之显示在三维空间中,三维的面可 以是柱面、球面以及自定义的三维曲面。warp 函数的语法格式如下:
在 MATLAB 7.0 中,纹理映射是利用双线性渐进算法将图像映射到某个表面栅格上。例 如下面的代码:
实例:[x,y,z] = cylinder;
I = imread(’testpat1.png’);
warp(x,y,z,I);
图像大小调整
利用 imresize 函数通过一种特定的插值方法可以实现图像大小的调整
实例:下面是使用不同的插值方法对图像进行放大的程序:
load woman2
subplot(2,2,1)
imshow(X,map)
X1 = imresize(X,2,’nearest’);
subplot(2,2,2)
imshow(X1,[]);
X2 = imresize(X,2,’bilinear’);
subplot(2,2,3)
imshow(X2,[]);
X3 = imresize(X,2,’bicubic’);
subplot(2,2,4)
imshow(X3,[]);
利用 imresize 函数通过一种特定的插值方法可以实现图像大小的调整
实例:下面是使用不同的插值方法对图像进行放大的程序:
load woman2
subplot(2,2,1)
imshow(X,map)
X1 = imresize(X,2,’nearest’);
subplot(2,2,2)
imshow(X1,[]);
X2 = imresize(X,2,’bilinear’);
subplot(2,2,3)
imshow(X2,[]);
X3 = imresize(X,2,’bicubic’);
subplot(2,2,4)
imshow(X3,[]);
图像旋转
在对数字图像进行旋转的时候,各像素的坐标将会发生变化,使得旋转之后不能正好落 在整数坐标外,需要进行插值。在工具箱中的函数 imrotate 可以用上述 3 种方法对图像进行
插值旋转,利用 imrotate 函数可以通过一种特定的插值方法来改变图像的显示角度
实例:下面是将 circuit.tif 图像插值旋转 35o的程序清单:
I = imread(’circuit.tif’);
J = imrotate(I,35,’bilinear’);
subplot(1,2,1)
imshow(I)
subplot(1,2,2)
imshow(J)
在对数字图像进行旋转的时候,各像素的坐标将会发生变化,使得旋转之后不能正好落 在整数坐标外,需要进行插值。在工具箱中的函数 imrotate 可以用上述 3 种方法对图像进行
插值旋转,利用 imrotate 函数可以通过一种特定的插值方法来改变图像的显示角度
实例:下面是将 circuit.tif 图像插值旋转 35o的程序清单:
I = imread(’circuit.tif’);
J = imrotate(I,35,’bilinear’);
subplot(1,2,1)
imshow(I)
subplot(1,2,2)
imshow(J)
图像剪裁
在图像处理过程中,有时只需要处理图像中的一部分,或者需要将某部分取出,这样就 需要对图像进行剪切。图像处理工具箱中的 imcrop 函数将图像剪裁成指定矩形区域。该函数 的语法如下:
实例:下面是从 ic.tif 图像中减去鼠标左键拖动选取的举行区域,并以新的图形窗口显示的 程序
subplot(1,2,1)
imshow circuit.tif
I = imcrop;
subplot(1,2,2)
imshow(I);
在图像处理过程中,有时只需要处理图像中的一部分,或者需要将某部分取出,这样就 需要对图像进行剪切。图像处理工具箱中的 imcrop 函数将图像剪裁成指定矩形区域。该函数 的语法如下:
实例:下面是从 ic.tif 图像中减去鼠标左键拖动选取的举行区域,并以新的图形窗口显示的 程序
subplot(1,2,1)
imshow circuit.tif
I = imcrop;
subplot(1,2,2)
imshow(I);
图像的变换技术
为了快速有效地对图像进行处理和分析,常常需要将原定义在图像空间的图像以某种形 式转换到另外一些空间,并利用这些空间特有的性质方便地进行一定的加工,最后再转换回 图像空间以得到需要的效果。这种使图像处理简化的方法通常是对图像进行变换。图像变换 技术在图像增强、图像恢复和有效地减少图像数据、进行数据压缩以及特征提取等方面都有 着十分重要的作用。本节将主要对应用最多傅立叶变换、离散余弦变换、小波变化以及 MATLAB 7.0 实现进行比较详细的介绍。
数字图像的二维傅立叶变换
在图像处理的广泛领域中,傅立叶变换起着非常重要的作用,包括图像的效果增强、图 像分析、图像复原和图像压缩等。在图像数据的数字处理中常用的是二维离散傅立叶变化, 它能把空间域的图像转变到频域上进行研究,从而能很容易地对图像的各空间频域成分进行 相应处理。在第 10 章已经比较详细地介绍了傅立叶变换以及离散傅立叶变换的概念,而二维 傅立叶变换又是一维傅立叶变换的简单的推广,这里不再赘述,着重介绍二维傅立叶变换在 图像处理中的应用
1.MATLAB 7.0 提供的快速傅立叶变换函数
在 MATLAB 7.0 中,提供了 fft 函数、fft2 函数和 fftn 函数分别用于进行一维 DFT、二维 DFT 和 N 维 DFT 的快速傅立叶变换;ifft 函数、ifft2 函数和 ifftn 函数分别用于进行一维 DFT、 二维 DFT 和 N 维 DFT 的快速傅立叶反变换。下面分别进行具体介绍
(1)fft2 函数 该函数是用于计算二维快速傅立叶变化,其语法格式为:
(2)fftn 函数 该函数用于 n 维傅立叶变换,其语法格式为:
(3)fftshift 函数 该函数是用于将变换后图像频谱中心从矩阵的原点移到矩阵的中心,其语法格式为:
(4)ifft2 函数 该函数用于计算图像的二维傅立叶反变换,其语法格式为:
(5)ifftn 函数 该函数用于计算 n 维傅立叶反变换,其语法格式为:
2.二维傅立叶变换的 MATLAB 7.0 实现
下面,举例来说明傅立叶变换的实现语句 B = fft2(A),该语句执行对矩阵 A 有二维傅立 叶变换。给出一幅图像(saturn2.tif),其傅立叶变换程序如下
figure(1);
load imdemos saturn2; %显示图像
imshow(saturn2);
figure(2); %进行傅立叶变换
B = fftshift(fft2(saturn2)); %显示变换后的系数分布
imshow(log(abs(B)),[]),colormap(jet(64)),colorbar
3. 滤波器频率响应
利用傅立叶变换可以得到线性滤波器的频率响应,其过程如下:首先求出滤波器的脉冲 响应,然后利用快速傅立叶变换算法对滤波器的脉冲响应进行变换,得到的结果就是线性滤 波器的频率响应。MATLAB 7.0 工具箱中提供的 freqz2 函数就是利用这个原理可以同时计算 和显示滤波器的频率响应。 下面是一个利用 freq2 函数得到的高斯滤波器的频率响应的程序:
h = fspecial(’gaussian’);
freqz2(h)
4. 快速卷积
傅立叶变换的另一个重要特性就是能够实现快速卷积。由线性系统理论可知,两个函数 卷积的傅立叶变换等于两个函数的傅立叶变换的乘积。该特性与快速傅立叶变换相结合,可 以快速计算函数的卷积。假设 A 是一个 M×N 的矩阵,B 是一个 P×Q 的矩阵,则快速计算 矩阵的方法如下:
下面是一个计算魔方阵和一个 1 矩阵的卷积的程序:
A = magic(3);
B = ones(3); %对 A 进行零填充,使之成为 8×8 矩阵
A(8,8) = 0; %对 B 进行零填充,使之成为 8×8 矩阵
B(8,8) = 0;
C = ifft2(fft2(A).*fft2(B)); %抽取矩阵中的非零部分
C = C(1:5,1:5); %去掉错误的,由四舍五入产生的虚部
C = real(C)
5.图像特征识别
傅立叶变换还能够用来分析两幅图像的相关性,相关性可以用来确定一幅图像的特征, 在这个意义下,相关性通常被成为模板匹配。例如,假如希望在图像 text.tif 中定位字符“a”, 如图 11-13 左上所示,可以采用下面的方法定位。 将包含字母“a”的图像与 text.tif 图像进行相关运算,也就是首先将字母 a 和图像 text.tif 进行傅立叶变换,然后利用快速卷积的方法,计算字母 a 和图像 text.tif 的卷积(其结果如图 11-13右上所示),提取卷积运算的峰值,如图11-13左下所示的白色亮点,即得到在图像text.tif 中对字母“a”定位的结果。 程序代码如下: %读入图像’text.tif’
bw = imread(’text.png’); %从图像中抽取字母 a 的图像
a = bw(32:45,88:98);
subplot(2,2,1),
imshow(bw);
subplot(2,2,2),
imshow(a);
C = real(ifft2(fft2(bw) .* fft2(rot90(a,2),256,256)));
subplot(2,2,3)
imshow(C,[]) %选择一个略小于 C 中最大值的值做为阈值
thresh = 60; %
subplot(2,2,4), %显示像素值超过阈值的点
imshow(C > thresh)%
为了快速有效地对图像进行处理和分析,常常需要将原定义在图像空间的图像以某种形 式转换到另外一些空间,并利用这些空间特有的性质方便地进行一定的加工,最后再转换回 图像空间以得到需要的效果。这种使图像处理简化的方法通常是对图像进行变换。图像变换 技术在图像增强、图像恢复和有效地减少图像数据、进行数据压缩以及特征提取等方面都有 着十分重要的作用。本节将主要对应用最多傅立叶变换、离散余弦变换、小波变化以及 MATLAB 7.0 实现进行比较详细的介绍。
数字图像的二维傅立叶变换
在图像处理的广泛领域中,傅立叶变换起着非常重要的作用,包括图像的效果增强、图 像分析、图像复原和图像压缩等。在图像数据的数字处理中常用的是二维离散傅立叶变化, 它能把空间域的图像转变到频域上进行研究,从而能很容易地对图像的各空间频域成分进行 相应处理。在第 10 章已经比较详细地介绍了傅立叶变换以及离散傅立叶变换的概念,而二维 傅立叶变换又是一维傅立叶变换的简单的推广,这里不再赘述,着重介绍二维傅立叶变换在 图像处理中的应用
1.MATLAB 7.0 提供的快速傅立叶变换函数
在 MATLAB 7.0 中,提供了 fft 函数、fft2 函数和 fftn 函数分别用于进行一维 DFT、二维 DFT 和 N 维 DFT 的快速傅立叶变换;ifft 函数、ifft2 函数和 ifftn 函数分别用于进行一维 DFT、 二维 DFT 和 N 维 DFT 的快速傅立叶反变换。下面分别进行具体介绍
(1)fft2 函数 该函数是用于计算二维快速傅立叶变化,其语法格式为:
(2)fftn 函数 该函数用于 n 维傅立叶变换,其语法格式为:
(3)fftshift 函数 该函数是用于将变换后图像频谱中心从矩阵的原点移到矩阵的中心,其语法格式为:
(4)ifft2 函数 该函数用于计算图像的二维傅立叶反变换,其语法格式为:
(5)ifftn 函数 该函数用于计算 n 维傅立叶反变换,其语法格式为:
2.二维傅立叶变换的 MATLAB 7.0 实现
下面,举例来说明傅立叶变换的实现语句 B = fft2(A),该语句执行对矩阵 A 有二维傅立 叶变换。给出一幅图像(saturn2.tif),其傅立叶变换程序如下
figure(1);
load imdemos saturn2; %显示图像
imshow(saturn2);
figure(2); %进行傅立叶变换
B = fftshift(fft2(saturn2)); %显示变换后的系数分布
imshow(log(abs(B)),[]),colormap(jet(64)),colorbar
3. 滤波器频率响应
利用傅立叶变换可以得到线性滤波器的频率响应,其过程如下:首先求出滤波器的脉冲 响应,然后利用快速傅立叶变换算法对滤波器的脉冲响应进行变换,得到的结果就是线性滤 波器的频率响应。MATLAB 7.0 工具箱中提供的 freqz2 函数就是利用这个原理可以同时计算 和显示滤波器的频率响应。 下面是一个利用 freq2 函数得到的高斯滤波器的频率响应的程序:
h = fspecial(’gaussian’);
freqz2(h)
4. 快速卷积
傅立叶变换的另一个重要特性就是能够实现快速卷积。由线性系统理论可知,两个函数 卷积的傅立叶变换等于两个函数的傅立叶变换的乘积。该特性与快速傅立叶变换相结合,可 以快速计算函数的卷积。假设 A 是一个 M×N 的矩阵,B 是一个 P×Q 的矩阵,则快速计算 矩阵的方法如下:
下面是一个计算魔方阵和一个 1 矩阵的卷积的程序:
A = magic(3);
B = ones(3); %对 A 进行零填充,使之成为 8×8 矩阵
A(8,8) = 0; %对 B 进行零填充,使之成为 8×8 矩阵
B(8,8) = 0;
C = ifft2(fft2(A).*fft2(B)); %抽取矩阵中的非零部分
C = C(1:5,1:5); %去掉错误的,由四舍五入产生的虚部
C = real(C)
5.图像特征识别
傅立叶变换还能够用来分析两幅图像的相关性,相关性可以用来确定一幅图像的特征, 在这个意义下,相关性通常被成为模板匹配。例如,假如希望在图像 text.tif 中定位字符“a”, 如图 11-13 左上所示,可以采用下面的方法定位。 将包含字母“a”的图像与 text.tif 图像进行相关运算,也就是首先将字母 a 和图像 text.tif 进行傅立叶变换,然后利用快速卷积的方法,计算字母 a 和图像 text.tif 的卷积(其结果如图 11-13右上所示),提取卷积运算的峰值,如图11-13左下所示的白色亮点,即得到在图像text.tif 中对字母“a”定位的结果。 程序代码如下: %读入图像’text.tif’
bw = imread(’text.png’); %从图像中抽取字母 a 的图像
a = bw(32:45,88:98);
subplot(2,2,1),
imshow(bw);
subplot(2,2,2),
imshow(a);
C = real(ifft2(fft2(bw) .* fft2(rot90(a,2),256,256)));
subplot(2,2,3)
imshow(C,[]) %选择一个略小于 C 中最大值的值做为阈值
thresh = 60; %
subplot(2,2,4), %显示像素值超过阈值的点
imshow(C > thresh)%
数字图像的离散余弦变换
离散余弦变换的变换核为余弦函数,计算速度比较快,有利于图像雅座和其他处理。在 大多数情况下,离散余弦变换(DCT)用于图像的压缩操作中。JPEG 图像格式的压缩算法 采用的是 DCT。
离散余弦变换的 MATLAB 7.0 实现
在 MATLAB 7.0 中,函数 dct2 核函数 idct2 分别用于进行二维 DCT 变换和二维 DCT 反 变换。下面举例来说明二维余弦正反变换在 MATLAB 7.0 中的实现,程序代码如下: %载入图像
RGB = imread(’autumn.tif’);
figure(1);
imshow(RGB); %将真彩图转换为灰度图
I = rgb2gray(RGB);
figure(2);
imshow(I); %进行余弦变换
J = dct2(I);
figure(3);
imshow(log(abs(J)),[]);
colormap(jet(64));
colorbar; %将 DCT 变换值小于 11 的元素设为 0
J(abs(J)<11) = 0; %进行余弦反变换
K = idct2(J)/255;
figure(4);
imshow(K)
下面是一个展示了如何把如图 11-16 左边所示的输入图像划分成 8×8 的图像块,计算它 们的 DCT 系数,并且只保留 64 个 DCT 系数中的 11 个,然后对每个图像块利用这 11 个系数 进行 DCT 反变换来重构图像的程序:
I = imread(’cameraman.tif’);
I = im2double(I); %产生二维 DCT 变换矩阵
T = dctmtx(8); %计算二维 DCT
B = blkproc(I,[8 8],’P1*x*P2’,T,T’); %二值掩模,用来压缩 DCT 系数
mask = [1 1 1 1 0 0 0 0
1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0]; %只保留 DCT 变换的 11 个系数
B2 = blkproc(B,[8 8],’P1.*x’,mask); %DCT 反变换,用来重构图像
I2 = blkproc(B2,[8 8],’P1*x*P2’,T’,T);
subplot(1,2,1)
imshow(I),
subplot(1,2,2)
imshow(I2)
其他变换技术
除了上面介绍的傅立叶变换和离散余弦变换外,在图像处理中还有几种使用比较广泛的 变换技术,它们是离散沃尔什变换、离散哈达玛变换以及 Randon 变换。这里只简略的介绍 每种变换的基本思想,详细的内容以及使用方法请有兴趣的读者参看书后的附录以及 MATLAB 7.0 自带的帮助文档。
除了上面介绍的傅立叶变换和离散余弦变换外,在图像处理中还有几种使用比较广泛的 变换技术,它们是离散沃尔什变换、离散哈达玛变换以及 Randon 变换。这里只简略的介绍 每种变换的基本思想,详细的内容以及使用方法请有兴趣的读者参看书后的附录以及 MATLAB 7.0 自带的帮助文档。
图像分析
MATLAB 7.0 的图像处理工具箱支持多种标准的图像处理操作,以方便用户对图像进行 分析和调整。这些图像处理操作主要包括: • 获取像素值及其统计数据;
第 11 章 图像处理工具箱
–419–
• 分析图像,抽取其主要结构信息; • 调整图像,突出其某些特征或抑制噪声。
MATLAB 7.0 的图像处理工具箱支持多种标准的图像处理操作,以方便用户对图像进行 分析和调整。这些图像处理操作主要包括: • 获取像素值及其统计数据;
第 11 章 图像处理工具箱
–419–
• 分析图像,抽取其主要结构信息; • 调整图像,突出其某些特征或抑制噪声。
像素值及其统计
MATLAB 7.0 的图像处理工具提供多个函数以返回与构成图像的数据值相关的信息,这 些函数能够以多种形式返回图像数据的信息,主要包括: • 选定像素的数据值(pixval 函数和 impixel 函数); • 沿图像中某个路径的数据值(improfile 函数); • 图像数据的轮廓图(imcontour 函数); • 图像数据的柱状图(imhist 函数); • 图像数据的摘要统计值(mean2 函数、std2 函数和 corr2 函数); • 图像区域的特征度量(imfeature 函数)。
MATLAB 7.0 的图像处理工具提供多个函数以返回与构成图像的数据值相关的信息,这 些函数能够以多种形式返回图像数据的信息,主要包括: • 选定像素的数据值(pixval 函数和 impixel 函数); • 沿图像中某个路径的数据值(improfile 函数); • 图像数据的轮廓图(imcontour 函数); • 图像数据的柱状图(imhist 函数); • 图像数据的摘要统计值(mean2 函数、std2 函数和 corr2 函数); • 图像区域的特征度量(imfeature 函数)。
图像分析
在 MATLAB 7.0 中的图像分析技术可以提取图像的结构信息。例如,可以利用图像处理 工具箱中提供的 edge 函数来探测边界。这里所谓的边界,其实就是图像中包含的对象所对应 的位置。下面介绍几种常见图像分析函数。
1.灰度图像的边缘:edge 函数
2.行四叉树分解:qtdecomp 函数
4.设置四叉树分解块值:qtsetblk 函数
实例:
(1)图像分析中的灰度边缘检测实例 源代码设置如下: %调入与显示 RGB 图像
RGB = imread(’peppers.png’);
isrgb(RGB);
figure(1);
imshow(RGB); %RGB 图转换为灰度图像
I = rgb2gray(RGB);
figure(2);
imshow(I);
colorbar(’horiz’);
isgray(I); %边缘检测
ED = edge(I,’sobel’,0.08);
figure(3)
imshow(ED);
3.获取四叉树分解块值:qtdgetblk 函数
(2)Sobel 边界探测器和 Canny 边界探测器再图像分析中的应用实例 源代码设置如下: %读入原始图像
I = imread(’coins.png’);
imshow(I)
%sobel 边界探测器
BW1 = edge(I,’sobel’); %canny 边界探测器
BW2 = edge(I,’canny’);
figure
imshow(BW1)
figure, imshow(BW2)
在 MATLAB 7.0 中的图像分析技术可以提取图像的结构信息。例如,可以利用图像处理 工具箱中提供的 edge 函数来探测边界。这里所谓的边界,其实就是图像中包含的对象所对应 的位置。下面介绍几种常见图像分析函数。
1.灰度图像的边缘:edge 函数
2.行四叉树分解:qtdecomp 函数
4.设置四叉树分解块值:qtsetblk 函数
实例:
(1)图像分析中的灰度边缘检测实例 源代码设置如下: %调入与显示 RGB 图像
RGB = imread(’peppers.png’);
isrgb(RGB);
figure(1);
imshow(RGB); %RGB 图转换为灰度图像
I = rgb2gray(RGB);
figure(2);
imshow(I);
colorbar(’horiz’);
isgray(I); %边缘检测
ED = edge(I,’sobel’,0.08);
figure(3)
imshow(ED);
3.获取四叉树分解块值:qtdgetblk 函数
(2)Sobel 边界探测器和 Canny 边界探测器再图像分析中的应用实例 源代码设置如下: %读入原始图像
I = imread(’coins.png’);
imshow(I)
%sobel 边界探测器
BW1 = edge(I,’sobel’); %canny 边界探测器
BW2 = edge(I,’canny’);
figure
imshow(BW1)
figure, imshow(BW2)
图像调整
MATLAB 7.0 中的图像调整技术用于图像的改善。此处的改善有两个方面的含义,即客 观方面,例如提高图像的信噪比;主观方面,例如通过修正图像的颜色和强度(灰度)使其 某些特征更容易辨识
1.灰度调整
在 MATLAB 7.0 中,相关的函数为 imadjust,该函数可用于调整灰度值或颜色图
下面是一个调整图像的对比度的程序:
I = imread(’cameraman.tif’);
J = imadjust(I,[0 0.2],[0.5 1]);
subplot(1,2,1)
imshow(I)
subplot(1,2,2)
imshow(J)
2.直方图调整法
在 MATLAB 7.0 中,histeq 函数用直方图均衡增强对比度。
下面是对图像 pout.tif 进行直方图均匀化的程序: %读入图像
I = imread(’pout.tif’); %进行直方图均匀化
J = histeq(I);
subplot(2,2,1)
imshow(I);
subplot(2,2,2)
imshow(J)
subplot(2,2,3)
imhist(I)
subplot(2,2,4)
imhist(J)
图像平滑
图像平滑主要目的是减少图像噪声。图像噪声来自多方面,有来自于系统外部的干扰(如 经过电源窜进系统内部的外部噪声),也有来自于系统内部的干扰(如摄像机的热噪声)。实 际获得的图像都因受到干扰而含有噪声,噪声产生的原因决定了噪声分布的特性及与图像信 号的关系。减少噪声的方法可以在空间域或在频率域处理,即:在空间域进行时,基本方法 就是求像素的平均值或中值;在频率域中则运用低通滤波技术。 图像处理工具箱提供了许多方法来去除图像中的噪声,针对不同的噪声类型,有不同的 去噪的方法。这些方法概括起来有以下三大类: • 线性滤波; • 中值滤波; • 自适应滤波。 线性滤波的方法所采用的线性滤波器大部分在第 10 章中做了详细的介绍,所以这里我 们着重对后面的两种处理方法进行介绍。
在 MATLAB 7.0 图像处理工具中,提供了 medfilt2 函数用于实现中值滤波。
下面给出的例子将采用中值滤波对加有椒盐噪声的图像进行滤波,源代码设置如下: %读入图像
I = imread(’eight.tif’);
imshow(I) %加入椒盐噪声
J = imnoise(I,’salt & pepper’,0.02); %显示加入噪声后的图像
figure, imshow(J) %进行中值滤波
L = medfilt2(J,[3 3]); %显示中值滤波后的图像
figure, imshow(L)
自适应滤波
MATLAB 7.0 的图像处理工具箱中提供了 wiener2 函数来实现自适应滤波,该函数的用 法如下:
自适应滤波对高斯白噪声的去除效果最好,下面是自适应滤波的示例代码: %载入图像
RGB = imread(’saturn.png’); %RGB 转换为灰度图
I = rgb2gray(RGB); %加入高斯白噪声
J = imnoise(I,’gaussian’,0,0.005); %采用自适应滤波
K = wiener2(J,[5 5]); %显示原始图像、加入噪声的图像以及滤波后的噪声
imshow(I)
figure,imshow(J)
figure, imshow(K)
MATLAB 7.0 的图像处理工具箱中提供了 wiener2 函数来实现自适应滤波,该函数的用 法如下:
自适应滤波对高斯白噪声的去除效果最好,下面是自适应滤波的示例代码: %载入图像
RGB = imread(’saturn.png’); %RGB 转换为灰度图
I = rgb2gray(RGB); %加入高斯白噪声
J = imnoise(I,’gaussian’,0,0.005); %采用自适应滤波
K = wiener2(J,[5 5]); %显示原始图像、加入噪声的图像以及滤波后的噪声
imshow(I)
figure,imshow(J)
figure, imshow(K)
MATLAB 7.0 中对特定区域的处理是通过二值掩模来实现的,通过选定一个区域后 会生成一个与原图大小相同的二值图像,选定的区域为白色,其余部分为黑色。通过掩模图 像,就可以实现对特定区域的选择性处理。下面介绍创建区域的方法:
1.多边形选择方法
roipoly 函数用于设定图像中的多边形区域,该函数返回与输入图像大小一致的二值图像 BW,选中的区域值为 1,其余的部分值为 0。其语法格式为:
下面是一个根据指定的坐标选择一个六边形区域的程序: %载入图像
I = imread(’eight.tif’); %指定六边形的角点
c = [222 272 300 272 222 194];
r = [21 21 75 121 121 75]; %生成对应的二值图像
BW = roipoly(I,c,r);
figure,imshow(I);
figure,imshow(BW);
其他选择方法
另外,在 MATLAB 7.0 的图像处理工具箱中提供了可以实现按灰度选择区域的函数 roicolor 函数,其语法格式为
下面是一个按灰度图像中的目标进行分割的程序: %载入图像
I = imread(’coins.png’); %选择图像灰度范围在 128~255 之间的像素
BW = roicolor(I,128,255);
figure,imshow(I)
figure,imshow(BW)
特定区域滤波
在 MATLAB 7.0 的图像处理工具箱中提供的 roifilt2 函数用于对特定区域进行滤波,其语 法格式为:
下面是一个对指定区域进行锐化滤波的程序清单: %载入图像
I = imread(’pout.tif’);
第 11 章 图像处理工具箱
–433–
%生成对应的二值图像
imshow(I) %交互式选择区域
BW = roipoly %定义滤波器
h = fspecial(’unsharp’); %进行区域滤波
I2 = roifilt2(h,I,BW);
figure, imshow(I2)
在 MATLAB 7.0 的图像处理工具箱中提供的 roifilt2 函数用于对特定区域进行滤波,其语 法格式为:
下面是一个对指定区域进行锐化滤波的程序清单: %载入图像
I = imread(’pout.tif’);
第 11 章 图像处理工具箱
–433–
%生成对应的二值图像
imshow(I) %交互式选择区域
BW = roipoly %定义滤波器
h = fspecial(’unsharp’); %进行区域滤波
I2 = roifilt2(h,I,BW);
figure, imshow(I2)
特定区域填充
在 MATLAB 7.0 的图像处理工具箱中提供的 roifill 函数用于对特定区域进行填充,其语 法格式为:
下面是特定区域填充的示例代码。 %载入图像
load trees %RGB 转换为灰度图
I = ind2gray(X,map);
MATLAB 7.0
–434–
imshow(I) %指定特定区域,并进行填充
I2 = roifill;
imshow(I2)
在 MATLAB 7.0 的图像处理工具箱中提供的 roifill 函数用于对特定区域进行填充,其语 法格式为:
下面是特定区域填充的示例代码。 %载入图像
load trees %RGB 转换为灰度图
I = ind2gray(X,map);
MATLAB 7.0
–434–
imshow(I) %指定特定区域,并进行填充
I2 = roifill;
imshow(I2)
图形处理高级/
句柄图形(Handle Graphics)是一种面向对象的绘图系统。该系统提供创建计算机图形 所必须的各种软件。它所支持的指令,可以直接创建线、文字、网格、面以及图形用户界面。 在第 4 章所介绍的各种 MATLAB 7.0 高层(High-level)图形指令(如 plot、mesh)都是以句 柄图形软件为基础写成的。也正是这个原因,句柄图形也被称为低层(Low-level)图形
P448GUI UI设计
句柄图形(Handle Graphics)是一种面向对象的绘图系统。该系统提供创建计算机图形 所必须的各种软件。它所支持的指令,可以直接创建线、文字、网格、面以及图形用户界面。 在第 4 章所介绍的各种 MATLAB 7.0 高层(High-level)图形指令(如 plot、mesh)都是以句 柄图形软件为基础写成的。也正是这个原因,句柄图形也被称为低层(Low-level)图形
P448GUI UI设计