实验二 静态图像分割
一、实验目的 1、使学生通过实验体会一些主要的分割算法对图像处理的效果,以及各种因素对分割效果的 影响;
2、使用 Matlab 软件进行图像的分割; 3、能够自行评价各主要算子在有无干扰环境下的分割性能; 4、能够掌握分割条件(算法中各种参数等)的选择; 5、完成规定图像的处理并要求正确评价处理结果,能够在算法原理层面作出合理的解释。 二、实验内容 1、将图1和图2水表图像中的指示指针从背景中分离(指针部分显示为白色,其余部分显示为 黑色);(注:尽量采用统一代码)
2、旋转校正(可提取图像中的水平数字区域,并根据其与x方向的夹角做旋转校正) 3、利用二值形态学对分割后的二值图像进行处理以消除分割噪声; 4、根据分割结果给出水表读数(各位置指针所对应的单位可通过人为先验确定)。
三、关键方法(此处所提及的方法只是一个提示,并不需要全部用,更不是依次用,也不是 唯一的方法)
1. 阈值分割法(也可以用其它分割算法)
基本原理是:通过设定不同的特征阈值,把图像象素点分为若干类。
常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到 的特征。
设待分割图像为 f (x, y) (灰度图像或某颜色通道图像),按照一定的准则 f (x, y) 中找到
阈值 T,将图像分割为两个部分,分割后的图像为:若 f (x, y) T ,则 g(x, y) 0 (黑色),
若f(x,y)T,则g(x,y)1 (白),即为我们通常所说的图像二值化。 Matlab 关键代码(示例)为:
I=imread(‘xl-130-16.tiff’);
f=rgb2gray(I); % 选取灰度通道,也可尝试采用各彩色通道 g=zeros(size(f));
id=f <= T;
g(id)=1;
2、基于区域的分割方法 包括区域生长法和分裂合并算法。算法原理见讲义。算法代码可参考冈萨雷斯《数字图像
处理 (Matlab 版)》或网上资源。 3. 聚类分割算法
包括 k-means、EM 和 mean-shift 算法。各算法原理见讲义。算法代码可采用网上资源。 4. 数学形态学运算
经过阈值化后的二值图片并不完美(即不仅药板部分为白色,其它部分也存在白色斑点), 为此,可采用二值形态学对其进行处理。
二值形态学中的运算对象是集合,通常给出一个图像集合和一个结构元素集合,利用结 构元素对图像进行操作。其基本运算有四种:腐蚀、膨胀、开运算和闭运算。基于这些基本 运算和组合来进行图像形状和结构的分析及处理。如果 A 是图像集合, B 是结构元素( B 本身也是一个图像集合),形态学运算将使用 B 对 A 进行操作。结构元素往往比图像小得多。 基本运算将遵循这个原则。
可能采用的二值形态学操作包括:
膨胀和腐蚀
膨胀是在二值图像中“加长”或“变粗”的操作。这种特殊的方式和变粗的程度由一个称为 结构元素的集合控制。
数学上,膨胀定义为集合运算。A 被B 膨胀,记为A ⊕ B
腐蚀“收缩”或“细化”二值图像中的对象。像在膨胀中一样,收缩的方式和程度由一个结 构元素控制。腐蚀的数学定义与膨胀相似, A 被B 腐蚀记为 AB
数学形态学膨胀的matlab程序为:
se=strel(‘disk’,3); % 可更改结构元素的大小
A1=imdilate(A,se); % 膨胀 (A为二值图像) 数学形态学腐蚀的matlab程序为:
se=strel(‘disk’,10); % 可更改结构元素的大小 (试着将10更改为5和20) A2=imerode(A,se); % 腐蚀
开运算和闭运算 在图像处理的实际应用中,更多地以各种组合的形式来使用膨胀和腐蚀,它们可以级连
结合使用。膨胀后再腐蚀,或者腐蚀后再膨胀,通常不能恢复成原来图像(目标),而是产 生一种新的形态变换,这就是开运算和闭运算。
A 被B 的形态学开运算可以记做AB,这种运算是A 被B 腐蚀后再用B 来膨胀腐蚀结 果:
A B ( AB) B
A 被B 的形态学闭运算记做A• B ,它是先膨胀再腐蚀的结果
A B ( A B)B
当处理二值图像时,采用上述的形态学变换组合,主要应用于提取某一区域的边界线、 图像边缘轮廓、物体骨架特征和目标识别等众多的实际应用。
数学形态学开、闭的matlab程序为: se=strel(‘square’,20); fo=imopen(A,se); figure,imshow(fo);title(‘开运算后’) fc=imclose(f,se); figure,imshow(fc);title(‘闭运算后’)
孔洞填充 若二值图像中存在孔洞需要被填充时,可采用imfill()命令,示例为: BW2 = imfill(A, 'holes');
连通域标记 若需要对二值图像中不同的目标点进行处理和分析时,需进行连通域标记,其程序如下: L=bwlabel(A); % 连通域标记,A 为待标记二值图像
figure,map=[0 0 0;jet(10)];imshow(L+1,map);
5. 连通域分析 通过提取连通域的大小、形状、颜色、纹理等特征对目标区域进行判别。
6. 边缘检测
可利用微分算子进行边缘提取,主要的算子包括 Robert 算子,Sobel 算子,Prewitt 算子,
LoG 算子和 Canny 算子等。Matlab 函数为:
edge(图像 [, edge 类型] [, 阈值])
比如 edge(img, 'sobel');
可选的 edge 类型有 'sobel', 'prewitt', 'log', 'roberts', 'canny'等。
四、实验步骤
1 打开计算机,启动 MATLAB 程序;
2 调入数字图像,根据实验内容,参考关键方法,进行图像分割处理; 3 分析不同的分割方法或方法中的参数对结果的影响;
4 记录和整理实验报告。
五、实验仪器
1 计算机;
2 MATLAB 等程序;
3 移动式存储器(软盘、U 盘等),存储处理图像和子函数代码。 4 记录用的笔、纸。
六、实验报告内容
1 阐述实验过程,分析实验中出现的问题;
2 分析不同的方法或方法中的不同参数对实验结果的影响;
3 分析干扰环境下检测时结果上的差异;
4 阐述实验心得。
实验报告要求:纸张大小 A4,小四号字,1.25 倍行距,基本信息,正文(包括:实验目
的,实验内容,实验步骤+源程序(加中文注释)+实验算法分析,实验结果(图形)+结果 分析和讨论。
实验三 运动目标分割
一、实验目的
1. 采用差分法,背景差法实现运动目标提取,基本掌握运动目标提取的基本原理和方法 2. 了解不同帧率、不同运动速度条件下对检测结果的影响。
二、实验内容
1 利用MATLAB读取图像的基本命令imread和读取视频的基本命令aviread或mmreader;
2 调用各种运动目标检测函数进行运动目标分割;
2 利用MATLAB形态学算子调整分割结果;
3 了解形态学滤波中结构元strel命令的调用格式,通过改变结构元形状和大小,比较运动目 标检测效果
三、关键方法
1. 帧差法
tic;
clear all
mov = mmreader('???.avi');
x = read(mov,2);
fr_size = size(x);
width = fr_size(2);
height = fr_size(1);
c =zeros(height, width);
for k=1:mov.NumberOfFrames-1
x = read(mov,k);
y = read(mov,k+1);
m = rgb2gray(x);
n = rgb2gray(y);
q=im2double(n); w=im2double(m);
c=q–w ;
t=40; %%阈值,此值可以调节 t=t/255;%%转化为double型数据 id = c > t;
cc =zeroes(fr_size);
cc(id) = 1; figure(1),subplot(2,2,1),imshow(m) subplot(2,2,2),imshow(n)
% 可将1改为其它值,观察结果的不同
subplot(2,2,3),imshow(c) figure(2),imshow(cc) ;
Mov1(k) = im2frame(uint8(cc),gray);
end movie2avi(Mov1,’fd_output’,’fps’,15);
% put frames into movie
2. 背景差法
2.1 时间平均法
% This M-file uses average model for background pixels clear all;
N = 40;% N frames to train the Gaussian model
h = fspecial(‘gaussian’);
imagedata = filter2(h,rgb2gray(imread(‘****.bmp’))); mu = imagedata;
[m,n] = size(mu);
pro = zeros(m,n);
for i=1:N
% 根据实际图片序列信息进行修改
filename = sprintf(‘******/0%d.bmp’,i); % 根据实际图片序列信息进行修改 tmp =filter2(h,rgb2gray(imread(filename)));
mu = mu+tmp;%(tmp+(i-1)*sav_mu)./i;%
end;
mu=mu./N; figure(1),imshow(uint8(mu)); % test the new frame
for num = N+1:500
filename = sprintf(‘**********/0%d.bmp’,num); imagedata = filter2(h,rgb2gray(imread(filename)));
t=20; % 阈值,可调节
pro = abs(imagedata-mu)> t; imshow(pro),title(sprintf(‘frame number %d’,floor(num))); %%update mean
mu = (mu*(num-1) +imagedata)/num; %(1-a)*mu+a*(imagedata-mu);
% display the results
Mov1(num-N) = im2frame(uint8(255*pro),gray); % put frames into movie
end;
movie2avi(Mov1,’ave_output_20′,’fps’,15);
2.2 单高斯法
% This M-file uses single Gaussian model for background pixels
clear all;
N = 40;% N frames to train the Gaussian model
h = fspecial(‘gaussian’);
imagedata = filter2(h,rgb2gray(imread(‘*****.bmp’))); mu = imagedata;
[m,n] = size(mu);
cov = zeros(m,n);
pro = zeros(m,n);
sav_mu = mu;
a = 0.01;
%根据实际图片信息进行修改
for i=1:N
filename = sprintf(‘***/0%d.bmp’,i);
tmp =filter2(h,rgb2gray(imread(filename)));
mu = (tmp+(i-1)*sav_mu)./i;
cov = ((tmp-mu).^2+(i-1)*cov)./(i)+(mu-sav_mu).^2; sav_mu = mu;
end;
cov = cov+0.001; %防止cov为0
% test the new frame for num = N+1:500
filename = sprintf(‘vipman_bmp/0%d.bmp’,num);
imagedata = double(filter2(h,rgb2gray(imread(filename))));
T=1e-3; % 阈值,可调节
pro = (2*pi)^(-1/2)*exp(-0.5*(imagedata-mu).^2./cov)./sqrt(cov)< T;
%% update covariance and mean
mu = mu +a*(1-pro).*(imagedata-mu); %(1-a)*mu+a*(imagedata-mu);
cov = cov + a*(1-pro).*((imagedata-mu).^2-cov);%(1-a)*cov+a*(imagedata-mu).^2; % display the results
imshow(mat2gray(pro)),title(sprintf('frame number %d',floor(num))); Mov1(num-N) = im2frame(uint8(255*pro),gray); % put frames into movie pause(0.000001);
%根据实际图片信息进行修改
end; movie2avi(Mov1,'gaussian_output','fps',15);
2.3 混合高斯法(选做) (自行查阅网上资料及代码) 四、实验步骤
1 打开计算机,启动 MATLAB 程序;
2 调入数字图像序列,根据实验内容,参考关键方法,进行运动目标分割处理; 3 分析不同的方法所对应的结果;
4 分析当阈值等参数发生改变时,对结果的影响;
3 记录和整理实验报告。
五、实验仪器 1 计算机;
2 MATLAB 等程序;
3 移动式存储器(软盘、U 盘等),存储处理图像和子函数代码。 4 记录用的笔、纸。
六、实验报告内容
1 阐述实验过程,分析实验中出现的问题;
2 分析不同的方法,不同参数条件对实验结果的影响;
3 阐述实验心得。
实验报告要求:纸张大小 A4,小四号字,1.25 倍行距,基本信息,正文(包括:实验目
的,实验内容,实验步骤+源程序(加中文注释)+实验算法分析,实验结果(图形)+结果 分析和讨论。
七.拓展实验
1. 对检测出的车或人根据形状等简单特征进行判别,并利用 text 命令在图上做标注。
一、实验目的:
1、学会使用 PCA 主成分分析法。
2、初步了解人脸识别的特征法。
3、更熟练地掌握 matlab 的使用。 二、实验原理:
1、 PCA(主成分分析法介绍)
实验四 人脸识别
PCA 方法的基本原理是:利用离散 K-L 变换提取人脸的主要成分,构成特征脸空间,识 别时把测试样本投影到该空间,构成一组投影系数,通过与特征脸的距离比较,距离最小的 特征脸对应的即是识别结果。
基于 PCA 的人脸识别分为三个阶段,第一个阶段利用训练样本集构建特征脸空间;第二 个阶段是训练阶段,主要是将训练图像投影到特征脸子空间上;第三个阶段是识别阶段,将 测试样本集投影到特征脸子空间,然后与投影后的训练图像相比较,距离最小的为识别结果。 基于 PCA 的人脸识别其实一种统计性的模板比配方法,原理简单,易于实现,但也有不足, 它的识别率会随着关照,人脸角度,训练样本集的数量而变换,但仍不失为一种比较好的方 法。
三、实验步骤
1 打开计算机,安装和启动 MATLAB 程序;
2 将库里的 400 张照片(40 个个体,每个个体 10 张照片)分成两组。一组作为训练,一
组作为测试。可尝试下列分组情况:
(1) 每个人的任意 5/8 张照片作为训练并作为测试样本库,其它 5/2 张作为测试待识别图
片。(即测试时所识别的个体出现在训练库中,后面的步骤描述和参考代码以此为基础)
(2) 前 30/38 个人作为训练,后 10/2 个人作为测试,其中测试库中每个人的任意 5/8 张 照片为测试样本库,其它 5/2 张照片作为待识别图片。(即测试时所识别个体未出现在识别代
码会与参考代码不同)
训练的照片按照顺序的数字重命名。
参考代码:
clear;
n = 1; p=1;
for i=1:40
a=1:10;
Ind = a(:,randperm(size(a,2))); for h = 1:5
j= Ind(1,h); File=['C:\Users\dell\Desktop\ORL\s',sprintf('%d',i),'\',sprintf('%d',j),'.pgm']; Filesave=['C:\Users\dell\Desktop\new',sprintf('%d',1),'\',sprintf('%03d',n),'.pgm'];
copyfile(File,Filesave)
n = n + 1; end
for h = 6:10
j= Ind(1,h);
File=['C:\Users\dell\Desktop\ORL\s',sprintf('%d',i),'\',sprintf('%d',j),'.pgm']; Filesave=['C:\Users\dell\Desktop\new',sprintf('%d',2),'\',sprintf('%03d',p),'.pgm']; copyfile(File,Filesave)
p = p + 1;
end end
3 库照片处理
1 将每一张库的照片转化成 N 维的向量,然后把这些向量存入一个矩阵里。可将这 200
个向量以列的形式存在了矩阵里。 即
X x1 x2 x200
2 将这 200 个向量的每个元素相加起来求出平均值。再用 X 里的每一个向量减去这个平 均 值得到每个的偏差。
1 200
平均值x200xi ,每个向量的偏差x'xx
i1
最后得到
X ' x 1' x 2' . . . x 2' 0 0 。
3 计算协方差矩阵
参考代码如下:
% 批量读取指定文件夹下的图片 path = uigetdir;
img_path = dir(strcat(path,'\*.pgm')); img_num = length(img_path); imagedata = [];
if img_num >0
for j = 1:img_num
img_name = img_path(j).name;
temp = imread(strcat(path, ‘/’, img_name)); temp = double(temp(:));
imagedata = [imagedata, temp];
end
end
wts = size(imagedata,2);
% 中心化并计算协方差矩阵 img_pj = mean(imagedata,2); for i = 1:wts
imagedata(:,i) = imagedata(:,i) – img_pj; end
covMat = imagedata’*imagedata;
4 利用协方差矩阵进行主成分分析,提取特征脸,获取训练样本特征数据
参考代码如下:
%说明:[PC,latent,explained]=pcacov(X)通过协方差矩阵 X 进行主成分分析,返回主成分 (PC)、%协方差矩阵 X 的特征值 (latent)和每个特征向量表征在观测量总方差中所占的百分 数%(explained)。
[COEFF, latent, explained] = pcacov(covMat); % 选择构成 95%能量的特征值
i = 1;
proportion = 0;
while(proportion < 95)
proportion = proportion + explained(i); i = i+1;
end
k = i - 1;
%求出原协方差矩阵的特征向量,即特征脸
V = imagedata*COEFF; % N*M 阶
V = V(:,1:k);
% 训练样本在 PCA 特征空间下的表达矩阵 k*M
W = V'*imagedata;
msgbox(['训练完成'])
5 对于测试样本,读取图像,将其变换至 PCA 空间,利用近邻法识别 参考代码:
im=imread(‘test_face.jpg’);
im = double(im(:));
objectone = V'*(im - imgpj);
distance = 1e8; for k = 1:wts
temp(k) = norm(objectone - W(:,k)); end
[s_temp,id]=sort(temp,’ascend’);
6 显示识别结果(为便于分析,对每一幅测试图像显示距离排名在前三位的识别结果) % 代码自编
5 记录和整理实验报告。
四、实验仪器
1 计算机;
2 MATLAB 程序;
3 移动式存储器(软盘、U 盘等),存储处理图像。
4 记录用的笔、纸。
五、实验报告内容
1 叙述实验过程,分析实验中出现的问题,并显示前 5 张特征脸;
2 记录不同数量训练样本条件下人脸识别的准确率,并以图表形式呈现; 3 对实验结果进行分析;
4 进行实验总结,写心得。
六、拓展实验
1 利用 Matlab GUI 设计一个简单的人脸识别软件。