2016年认证杯SPSSPRO杯数学建模
B题 低分辨率下看世界
原题再现:
数码摄像技术被广泛使用于多种场合中。有时由于客观条件的限制,拍摄设备只能在较低的分辨率下成像。为简单起见,我们只考虑单色成像。假设成像的分辨率为 32 × 64,成像方式是将整个矩形视野划分成 32 × 64 个相同大小的矩形格子,图像中每个像素的取值为对应格子的亮度平均值。每间隔一定时间拍摄一帧图像,运动的画面体现为图像的序列。
第一阶段问题: 现在整个视野区域向某个方向缓慢运动,拍摄到的系列图像实时地传输到计算机中。请你建立合理的数学模型和算法,通过分析实时拍摄的图像,使用尽量少的时间,以判断出运动的方向。
整体求解过程概述(摘要)
随着数码光学的软硬件发展,数码摄像技术得到广泛应用,由于成像设备等各方面因素的限制,设定成像分辨率为32×64,每个像素取对应网格亮度平均值。在图像摄取过程中,整个视野区域向某个方向(理解为直线)缓慢运动时,每隔一段时间拍摄一帧图像获得一组图像序列,实时传输给计算机,要求以尽量少的时间判断出运动的方向,并保证足够的精度。若图像满足“各向同性的一阶马尔科夫过程”假设,则使用一到两帧图像便可判断出运动方向。由于没有对帧率明确定义,进行分类讨论:
一、摄像帧率较低,或者说不考虑单帧画面的运动性,图像是清晰的,则根据运动跟踪理论,利用至少两帧图像可判断出运动方向。拍摄了一组图像来模拟不同真实运动方向的连续两帧图像,在MATLAB编程环境下,建立了简洁的基于特征的图像跟踪算法模型,跟踪计算二值化处理后图像中的目标形心。涵盖全部方向范围的试验,结果验证了当背景中目标较明显时,模型可以以较高精度判断出运动方向,并可扩展到解决更复杂的图像跟踪问题。模型可应用到行人跟踪、智能交互等领域中。
二、摄像帧率较高,每帧图像包含了因为视野区域发生运动导致的位移,即图像是模糊的,通过设计图像模糊算法,仅利用一帧图像便可判断出运动方向。利用Photoshop生成了一组模拟不同真实运动方向的模糊图像,基于滤波方向为运动模糊方向时,微分图像灰度绝对值之和最小,在MATLAB编程环境下,建立高通滤波算法模型,涵盖全部方向范围的试验结果验证了可以在大角度范围内准确地判断出运动方向;通过建立基于频谱预处理的算法模型补充解决小角度运动方向判断精度不足问题。这两个模型可应用到视频监视、智能交通等领域中。
本文还对以上两种情况下建立的模型进行讨论、修正和优化。另外,两帧图像间的运动方向判断模型可以推广到序列图像的方向识别中;不过,本文只考虑了平面运动,没有分析空间运动情况。
问题分析:
题目给出的前提和条件有:
(1)成像方式
像素(Pixel)指基本原色素及其灰度的基本编码。通过数码摄像设备等设备获得图像传输到计算机,可得到由像素组成的点阵图(即题目中的相同大小矩形格子的组合),以每英寸的像素数(PPI,Pixels Per Inch)来衡量。图像分辨率的表达方式也为“水平像素数×垂直像素数”,题目给定成像分辨率取32×64。点阵图具有精细的图像结构、丰富的灰度层次和广阔的颜色阶调(色调值)。题目为简单起见,给定只需考虑单色成像,即用灰阶图(Gray Scale)来显示图像,图像的所有轮廓都是由深浅不同的灰色像素构成,是把白色和黑色之间按对数关系分为0~255共256阶,称为灰度,这里每个像素的取值为对应格子的亮度(lightness)平均值。其实,亮度是与颜色多明亮有关系的色彩空间的一个维度,调整亮度的方法就是设置Gamma值——其定义恰恰是图像的灰度值[14]。
(2)运动方式
运动方向:题目给定视野区域向“某个方向”运动,则认为始终是直线运动,即将成像系统看成线性系统。当然,并未说明是平面运动还是空间运动,即没有说明成像设备与成像目标物体之间的距离是否发生改变。首先讨论平面运动的情况,空间运动的情况将在后面进行说明。
运动速度:“缓慢”是一个相对拍摄时间间隔(帧率)而言的概念,没有具体说明,我们进行讨论:
一、帧率较低,也就是两帧图像之间隔了数秒甚至更久,成像目标物体发生相对很大位移变化的情况,如图2-1 a)所示,不考虑单帧画面存在运动,即对“运动的画面体现为图像的序列”的一种理解,那么每一幅图像都是清晰地,需要通过设计数学算法,对至少两幅连续图像进行追踪分析才能够判断出运动方向。
二、考虑实际情况,帧率是较高的,一般是十几至数十秒分之一,则“缓慢”运动,也就是说在两帧之间成像设备与成像目标物体相对位移较小,必然产生模糊运动的情况,如图2-1 a)所示。那么可以通过设计数学算法,仅利用一帧图像便可判断出运动方向,以实现时间尽量少的要求。
运动形式:可能匀速运动,加速运动,(振动),主要考虑匀速运动,对分析问题影响不大。
(3)实时传输
题目中说明了拍摄图像“实时”传递给计算机,则计算机可以进行实时分析运算,以判断运动方向和修正,认为这个传递时间可以忽略不计,理论上,求出的计算机每次运算耗时应足够短。
第一阶段问题:要求用最优方法判断出摄影视野区域运动的方向。具体理解为应在结合数码摄像技术和生活实际的前提下,约定满足要求而尽量小的误差区间,以此前提给出以最快时间获取运动方向的数学模型和算法,并对若干满足题目给定条件的图像案例进行试验,验证模型是否符合运行时间最快、判断精度够高的要求。我们按照对题意的不同考虑及是否会产生图像运动模糊来分类,分别用运动跟踪算法和运动模糊算法建立不同模型,判断运动方向,计算误差。
模型假设:
(1)假设摄像时的环境等客观条件不发生任何改变,即控制无关变量。
(2)假设图像是自然图像,即每帧图像是“各向同性的一阶马尔科夫过程”,即图像的自相关及其功率谱是各向同性的,即每一帧图像只依赖于前一帧而不依赖过往图像。
(3)假设是直线的相对运动,因为题目中说明了只是“向某个方向”。在实际应用中,匀速直线运动问题更具有一般性和普遍性;并且,变速的、非直线运动在某些条件下可以被分解成分段匀速直线运动。只要解决匀速直线运动图像序列的方向判断问题,变速的、非直线运动图像序列的方向判断问题就相对容易解决。
(4)因为运动方向不变,则可将一序列图像移动问题简化成相邻两帧甚至一帧图像间移动的问题,制定出有效算法后再推广到序列图像问题。
(5)依题,为了辨识方便和计算简单,可以将图像进行灰度化甚至二值化处理。
(6)只考虑平面运动,不扩展到空间运动。
论文缩略图:
全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可
部分程序代码:(代码和文档not free)
clc
clear
M=32; %图像的像素点宽度
N=64; %图像的像素点高度
%--------------将原始图像处理成符合要求的格式---------------------------%
A=read_seqim(5); %imread 函数读取图像 1 文件
B=read_seqim(8); %imread 函数读取图像 2 文件
for i=1:2if i==1Origin=A;elseOrigin=B;end
% imshow(Origin); %显示原图像
% title('原始彩色图像');
hsv=rgb2hsv(Origin); %提取黑白图像的亮度
H=hsv(:,:,1);%色彩
S=hsv(:,:,2);%深度
V=hsv(:,:,3);%亮度
A=size(Origin);%判断原始数据的像素
%-------------将原图像分割成 32X64 快区域,对每一个区域进行------------%
m=floor(A(1)/M); %原图宽度上将原图分为几块
n=floor(A(2)/N); %原图高度上将原图分为几块
Scolor=zeros(M,N);
t=1;
for i1=1:Mt1=1;for j1=1:NMedium=V(t:i1*m,t1:j1*n);Scolor(i1,j1)=sum(sum(Medium))/(m*n);t1=j1*n;endt=i1*m;
end
%----------------------------储存两张处理后的图像----------------------------%if i==1saveas(gcf,['C:\Users\diaosi\Desktop\matlab1\','图像 1 处理后图像.jpg']);pic_original=Scolor;elsesaveas(gcf,['C:\Users\diaosi\Desktop\matlab1\','图像 2 处理后图像.jpg']);pic_compare=Scolor;end
end
%------------显示原始图像与对比图像(都是经过处理后的)---------------%
figure(1)
imshow(pic_original);
title('图像 1 灰度处理');
figure(2)
imshow(pic_compare);
title('图像 2 灰度处理');
%----------------------------------二值化处理----------------------------------%
pic_original_bw=im2bw(pic_original);
figure(3)
imshow(pic_original_bw);
title('灰度图像 1 二值化处理');
saveas(gcf,['C:\Users\diaosi\Desktop\matlab1\','图像 1 处理后二进制图像.jpg']);
pic_compare_bw=im2bw(pic_compare);
figure(4)
imshow(pic_compare_bw);
title('灰度图像 2 二值化处理');
saveas(gcf,['C:\Users\diaosi\Desktop\matlab1\','图像 2 处理后二进制图像.jpg']);
%%_______X 代表高度,Y 代表宽度___________%%
%---------------求灰度图像 1 二值化处理后亮度的中心位置----------------%
t=0;%定义图像 1 亮度为 1 的个数
pic_original_local_sum_X=0;
pic_original_local_sum_Y=0;
for i=1:Mfor j=1:Nif (pic_original_bw(i,j)==1)pic_original_local_sum_X=pic_original_local_sum_X+i;pic_original_local_sum_Y=pic_original_local_sum_Y+j;t=t+1;endend
end
pic_original_local_X=floor(pic_original_local_sum_X/t);%定义定义图像 1 亮度中心 X 方向上的位
置
pic_original_local_Y=floor(pic_original_local_sum_Y/t);%定义定义图像 1 亮度中心 Y 方向上的位
置
%-----------求灰度图像 2 二值化处理后亮度的中心位置---------------%
t1=0;%定义图像 2 亮度为 1 的个数
pic_compare_local_sum_X=0;%x 方向上的位置
pic_compare_local_sum_Y=0;%Y 方向上的位置
for i=1:Mfor j=1:Nif (pic_compare_bw(i,j)==1)pic_compare_local_sum_X=pic_compare_local_sum_X+i;pic_compare_local_sum_Y=pic_compare_local_sum_Y+j;t1=t1+1;endend
end
pic_compare_local_X=floor(pic_compare_local_sum_X/t1);%定义定义图像 2 亮度中心 X 方向的位
置
pic_compare_local_Y=floor(pic_compare_local_sum_Y/t1);%定义定义图像 2 亮度中心 Y 方向的位
置
%------------------判别运动的方向,并输出结果到命令窗口---------------------%
if(pic_compare_local_Y>pic_original_local_Y)&&(pic_compare_local_X>pic_original_local_X)
degree=atan(abs(pic_compare_local_Y-pic_original_local_Y)/abs(pic_compare_local_X-pic_original_
local_X))*180/pi;fprintf('运动方向为右下,与 Y 轴的夹角为%f\n',degree)
elseif(pic_compare_local_Y>pic_original_local_Y)&&(pic_compare_local_X<pic_original_local_X)
degree=atan(abs(pic_compare_local_Y-pic_original_local_Y)/abs(pic_compare_local_X-pic_original_
local_X))*180/pi;fprintf('运动方向为右上,与 Y 轴的夹角为%f\n',degree)
elseif(pic_compare_local_Y<pic_original_local_Y)&&(pic_compare_local_X<pic_original_local_X)
degree=atan(abs(pic_compare_local_Y-pic_original_local_Y)/abs(pic_compare_local_X-pic_original_
local_X))*180/pi;fprintf('运动方向为左上,与 Y 轴的夹角为%f\n',degree)
elseif(pic_compare_local_Y<pic_original_local_Y)&&(pic_compare_local_X>pic_original_local_X)
degree=atan(abs(pic_compare_local_Y-pic_original_local_Y)/abs(pic_compare_local_X-pic_original_
local_X))*180/pi;fprintf('运动方向为左下,与 Y 轴的夹角为%f\n',degree)
elseif(pic_compare_local_Y>pic_original_local_Y)&&(pic_compare_local_X==pic_original_local_X
)fprintf('运动方向为右\n')
elseif(pic_compare_local_Y<pic_original_local_Y)&&(pic_compare_local_X==pic_original_local_X
)fprintf('运动方向为左\n')
elseif(pic_compare_local_Y==pic_original_local_Y)&&(pic_compare_local_X<pic_original_local_X
)fprintf('运动方向为上\n')
elseif(pic_compare_local_Y==pic_original_local_Y)&&(pic_compare_local_X>pic_original_local_X
)fprintf('运动方向为下\n')
end