学士学位论文数学建模课程设计基于插值拟合的黑白照片修复问题.docx
《学士学位论文数学建模课程设计基于插值拟合的黑白照片修复问题.docx》由会员分享,可在线阅读,更多相关《学士学位论文数学建模课程设计基于插值拟合的黑白照片修复问题.docx(18页珍藏版)》请在冰豆网上搜索。
学士学位论文数学建模课程设计基于插值拟合的黑白照片修复问题
课程设计(论文)
课程名称
数学建模课程设计
题目
基于插值拟合的黑白照片修复问题
院(系)
理学院
专业班级
应数1401
姓名
学号
指导教师
2016年7月24日
基于插值拟合的黑白照片修复问题
摘要
自从摄影技术面世以来,照片成为人们寄托回忆,记录信息的一个重要载体。
尤其是年代久远的老照片,更承载着许多珍贵的回忆。
但由于相纸材质的自身特性,当代的保护技术限制以及保存不善等原因,现存的实体黑白照片总会有不同程度的损坏,大多是沾有污渍或者是破损变色。
那么,依靠现有的技术手段能否完美还原老照片呢?
本题将针对这一问题进行深入研究。
由于具有修复可能性和修复价值的照片整体一般较为完整,故将图片污损的一部分提取出来加以修改,再将修复好的部分与原图像合并,是较有效率的解决方案。
因问题一图像情况,利用图像文件的数据矩阵自身特性,设定合适阈值,筛选出污渍部分元素,同时利用原图像进行散乱点插值生成新图像矩阵,将污渍部分元素替换为生成新元素可以获得较理想结果。
问题二中,变色部分边缘图像元素与原图像矩阵元素差距较小,故对所有元素取平均值,并将此值作为基本检测标准,选取合适阈值,筛选出变色严重元素。
利用原图像进行最临近插值形成新图像,替换变色严重元素为新图像。
由于问题三破损区域原图像有两种颜色,故在二者范围内随机取点求平均值作为检测标准,分别对两块区域进行拟合生成新图像,并重新拼接获得修复图像。
关键词:
矩阵,二维插值,遍历法
1.问题重述
1.1问题背景
照片作为人类记录事件的重要载体,对日常生活工作拥有者不可替代的重要意义。
年代久远的黑白照片更是承载过去记忆的珍贵材料,但由于保存不善或各种原因,照片破损、发霉或沾上污渍的情况时有出现,本次将针对这类问题进行解决。
问题中的处理样本是将纸质照片进行扫描得到的图片数据。
1.2问题情况
问题一中,照片上有三处大小不一的黑色点状污渍,颜色和周边图像差距较大,且原图像颜色较为均匀;
问题二的照片有较大区域发生变色,且变色区域边界不明确;
问题三照片有一形状不规则破损,位于整个图像中央区域,且原图像此处应为不同颜色交界处。
1.3问题目标
针对三张图片各自情况设计模型,对损坏图片进行修复。
2.问题分析
2.1预处理
由于直接由原照片扫描得到的图片文件在计算机中以(4*m*n)阶三维矩阵形式存在,结构比较复杂且数据量巨大,故在不影响实际结果且简化操作,缩小数据量的目的下,将彩色图像转化为黑白图像,即将数据简化为二维矩阵,降低了数据规模。
2.2问题分析
基于问题一图像情况,因为图像文件矩阵元素均为0至255的整数[1],黑色污渍区域对应矩阵元素即为数值较小(接近0)的元素。
将黑色值(0)作为基本检测标准,设定合适阈值,筛选出全部污渍部分元素。
利用正常部分进行网格插值生成新图像矩阵,将污渍部分元素替换为接近正常部分元素的数值可以获得理想结果。
问题二中,变色部分边缘图像元素与原图像矩阵元素差距较小,变化情况接近连续函数,无法直接分辨出变色区域图像。
但原图像正常元素基本处于某一值附近,故可以对所有元素取平均值,并将此值作为基本检测标准,规定一合适阈值,筛选出变色严重元素。
利用相对正常图像进行散乱点插值形成新图像,替换变色严重元素为新图像。
问题三图像缺失部分已用黑色(元素值均为0)填充,故可以快速检验出破损区域。
由于破损区域原图像有两种颜色,故在二者大致范围内随机取点求平均值,作为检测标准,将两块区域分开;再分别对两块区域进行拟合生成新图像,并重新拼接,获得修复后图像。
3.模型假设
1.假设问题中的所有照片扫描均过程不产生色差,默认所用图像情况即为原图像情况;
2.假设扫描图片清晰程度不影响处理结果;
3.实际情况下照片破损部分边缘经常磨损发白,问题三中忽略此情况,即假设照片破损本质为矩阵元素丢失。
4.符号说明
第k问当中的被处理矩阵
第k问当中的检测标准值
第k问当中的检测阈值
第k问矩阵中需要替换的某元素
第k问中插值形成的图像曲面矩阵
第k问中的处理后矩阵
5.模型的建立与求解
由于问题中的图片均已简化为二维矩阵,故可将原图片视为连续变化的三维曲面,这样利用二维插值的方式还原图片是比较合理的[2]。
同时,为简化处理过程并提高效率,下列对问题的讨论中被处理的原图像矩阵A均视为大小适宜的,从原图像中提取出的污损部分及周边元素组成之矩阵。
5.1元素筛选模型
对于被处理矩阵A,均有方法确定一检测标准值x及检测阈值y(由于图像矩阵性质,x应为0到255间正整数,y为正整数且x±y应处于0和255之间)。
对矩阵A当中的每一个元素进行检验,若被检测元素
符合
,则将其替换为INF元素。
基本算法如下图1所示
图1元素筛选算法流程图
5.2利用二维插值生成图像模型
本步骤的核心是在图像矩阵中随机插点,将坏值点(即INF)去除后,用二维插值的方法形成新的图像矩阵。
模型的算法流程图如下。
图2二维插值算法流程图
根据最临近插值算法[4],如果想把原图像放大为
倍数大小的图像,第一步先把
倍数的矩阵画出来,此时矩阵的每个像素都是未知数(这个将要被填充的图的叫做目标图,Destination)。
然后要往空矩阵里面填值,要填的值从源图中来,先填写目标图最左上角的像素,坐标为(0,0),那么该坐标对应源图中的坐标可以由如下公式得出:
套用公式,就可以找到对应的原图的坐标了。
找到了源图的对应坐标,就可以把源图中坐标为(0,0)处的像素值填进去目标图的(0,0)这个位置了。
接下来,如法炮制,寻找目标图中坐标为(1,0)的象素对应源图中的坐标,套用公式。
然而得到的坐标可能有小数。
由于计算机里的图像像素的坐标都是整数,没有小数坐标。
这时候采用的策略是四舍五入(或直接舍掉小数位),把非整数坐标转换成整数,按照四舍五入的方法得到坐标(1,0)。
那么就可以再填一个象素到目标矩阵中了,同样是把源图中坐标为(1,0)处的像素值填入目标图中的坐标。
依次填完每个象素,图像放大就完成了。
5.3元素替换模型
由于算法的约束,新生成的
应当与被处理矩阵
相同,因此在此步骤中将对经过元素筛选算法处理的
进行元素检验,当元素值为INF时将该位置对应矩阵
中的元素值赋给
中的这个元素,最后得到处理后矩阵
。
算法如下图2所示。
Y
图3元素替换模型算法图
5.4问题一的求解
基于问题一图像情况(如下图左),将黑色值(0)作为基本检测标准,经过几次尝试,将阈值定为10,筛选出全部污渍部分元素。
利用正散乱点插值生成新图像矩阵,将污渍部分元素替换为接近正常部分元素的数值可以获得下图右结果。
图4附件1修复前后对比
5.5问题二的求解
问题二中,将所有元素平均值作为基本检测标准,经过尝试规定阈值为15,筛选出变色严重元素。
利用相对正常图像进行散乱点插值形成新图像,替换变色严重元素为新图像(下图右)。
图5附件2修复前后对比
5.6问题三的求解
问题三图像缺失部分已用黑色(元素值均为0)填充,故检测标准值为0,阈值为0。
由于破损区域原图像有两种颜色,故在二者大致范围内随机取点求平均值,获得两个检测标准值,将两块区域分开,分别对两块区域进行拟合生成新图像,并重新拼接,获得修复后图像。
图6附件3修复前后对比
6.模型的评价及推广
6.1评价
利用插值方法修复图片或扩大图片分辨率是众多图像处理软件的常用算法之一,即能证明此方法确实简单易行,效率较高。
但同时也要看到,许多更为复杂的新型算法已经被开发出来,它们拥有更好的图像还原能力和更大的发展空间。
现在的图像处理软件开发者追求的都是更加多样化,精细度更高的图片处理,二维插值的简单方法限制太多,适应力差,已经不能满足用户的所有需要了,故此算法在未来必将被更加先进的算法淘汰[5]。
6.2模型推广
由于本问题中只是处理黑白照片,故问题中所处理的数据不过只是矩阵元素为0到255之间的整数的二维矩阵。
这样的矩阵只能表现图像的灰度,而利用RGB编码的彩色图像是由一个灰度矩阵加上红、绿、蓝三个二维色相矩阵组合成的三维矩阵。
因为RGB编码下各个色相矩阵的元素值也是0到255的整数,故我们在本问题中对于灰度矩阵的讨论以及研究方法基本可以应用于RGB编码下的彩色图片上。
但RGB编码彩色图片中红绿蓝三色组合显色是服从光的三原色规律,组合更加多样,变化更加复杂,也就表示计算更加复杂,但本问题中所使用的二维插值方法比较简陋,处理彩色图片时计算量过于巨大,因而利用现有软硬件设备使用二维插值是不能满足彩色图片的处理需要的。
7.参考资料
[1].王玉英,史加荣等编.数学建模及其软件实现[M].北京:
清华大学出版社,2015年.
[2].刘卫国编.MATLAB程序设计与应用(第2版)[M].北京:
高等教育出版社,2006年.
[3].严蔚敏,吴伟民等编.数据结构(c语言版)[M].北京:
清华大学出版社,2007年.
[4].张海燕,吴方等编.几种插值算法的比较研究[J].计算机技术与发展.2012(02)
[5].卢君,张起贵等编.插值算法在图像缩放中的评估研究[J].同煤科技.2013(01)
附录
MATLAB程序
%第一问
clearall
[A1,cmap]=imread('C:
\Users\John\Desktop\学习\数学建模课程设计\附件1.jpg');
[m,n]=size(A1);
%读取图片并检测规模
x1=0;
y1=10;
fori=1:
m
forj=1:
n
ifA(i,j)>=x1&A(i,j)<=x1+y1
A(i,j)=inf
end
end
end
%标记污渍元素
N=100;
x=unifrnd(1,m,N,1);
y=unifrnd(i,n,N,1);
fori=1:
100
ifA(x(i),y(i))==inf
x(i)=[];
y(i)=[];
end
end
%随机向图片插入100个点并去除污渍区域中点
fori=1:
100
z(i)=A(x(i),y(i));
end
xi=1:
m;
yi=1:
n;
zi=interp2(x,y,z,xi,yi,'spline');
M1=zi;
%得到新矩阵
fori=1:
m
forj=1:
n
ifA1(i,j)==inf
A1(i,j)=M1(i,j);
end
end
end
B1=A1;
inshow(unit8(B1))
%第一题结束
%第二问
clearall
[A2,cmap]=imread('C:
\Users\John\Desktop\学习\数学建模课程设计\附件2.jpg');
[m,n]=size(A2);
%读取图片并检测规模
x2=sum(sum(A2))/(m*n);%求取检验标准值
y2=15;
fori=1:
m
forj=1:
n
ifA(i,j)>=x1-y1&A(i,j)<=x1+y1
A(i,j)=inf
end
end
end
%标记污渍元素
N=300;
x=unifrnd(1,m,N,1);
y=unifrnd(i,n,N,1);
fori=1:
300
ifA(x(i),y(i))==inf
x(i)=[];
y(i)=[];
end
end
%由于附件2面积较大,随机向图片插入300个点并去除污渍区域中点
fori=1:
300
z(i)=A(x(i),y(i));
end
xi=1:
m;
yi=1:
n;
zi=interp2(x,y,z,xi,yi,'spline');
M1=zi;
%得到新图像矩阵
fori=1:
m
forj=1:
n
ifA1(i,j)==inf
A1(i,j)=M1(i,j);
end
end
end
B2=A2;
inshow(unit8(B2))
%第二题结束
%第三问
clearall
[A3,cmap]=imread('C:
\Users\John\Desktop\学习\数学建模课程设计\附件3.jpg');
[m,n]=size(A3);
x1=0;
y1=10;
%读取图片并检测规模
fori=1:
m
forj=1:
n
ifA(i,j)>=x1-y1&A(i,j)<=x1+y1
A(i,j)=inf
end
end
end
%标记污渍元素
[A31,cmap]=imread('C:
\Users\John\Desktop\学习\数学建模课程设计\附件3_1.jpg');
[f,g]=size(A31);
x11=sum(sum(A31))/(f*g);
y11=10;
[A32,cmap]=imread('C:
\Users\John\Desktop\学习\数学建模课程设计\附件3_1.jpg');
[h,i]=size(A32);
x12=sum(sum(A32))/(h*i);
y12=10;
%求取两块异色区域的检测值
fori=1:
m
forj=1:
n
ifA(i,j)>=x11-y11
A2(i,j)=A(i,j);
else
A2(i,j)=inf;
end
end
end
%分离亮色区域
fori=1:
m
forj=1:
n
ifA(i,j)<=x12+y12
A3(i,j)=A(i,j);
else
A3(i,j)=inf;
end
end
end
%分离暗色区域
N=100;
x=unifrnd(1,m,N,1);
y=unifrnd(i,n,N,1);
fori=1:
300
ifA2(x(i),y(i))==inf
x(i)=[];
y(i)=[];
end
end
fori=1:
100
z(i)=A2(x(i),y(i));
end
xi=1:
m;
yi=1:
n;
zi=interp2(x,y,z,xi,yi,'spline');
M2=zi;
%随机向图片亮色区域插入100个点并去除污渍区域中点
%得到新图像矩阵
N=100;
x=unifrnd(1,m,N,1);
y=unifrnd(i,n,N,1);
fori=1:
300
ifA3(x(i),y(i))==inf
x(i)=[];
y(i)=[];
end
end
fori=1:
300
z(i)=A3(x(i),y(i));
end
xi=1:
m;
yi=1:
n;
zi=interp2(x,y,z,xi,yi,'spline');
M3=zi;
%随机向图片暗色区域插入100个点并去除污渍区域中点
%得到新图像矩阵
fori=1:
m
forj=1:
n
ifM2(i,j)==inf;
M2(i,j)=M3(i,j);
end
end
end
M1=M2;
%拼合新矩阵
fori=1:
m
forj=1:
n
ifA1(i,j)==inf
A1(i,j)=M1(i,j);
end
end
end
inshow(unit8(B2))
%第三题结束