怎么用matlab画多项式拟合函数图像?matlab仿真图怎么放大

一、实验目的
1、了解多项式拟合的基本原理
2、熟悉多项式拟合的实现方法
3、知悉二维图像的基本呈现
4、熟练掌握并结合多项式拟合原理进行数字图像的放大操作
5、熟悉matlab程序设计语言的基本特点并熟悉其软件的运行环境
二、实验要求
给定一个二维的数字图像 , 先将其缩放到原来的1、4 , 利用多项式拟合的学习内容将该图像进行一个像素点扩充 , 即读取一个2m*2n*3大小的数字图像 , 简单处理后变成一个m*n*3大小的图像 , 我们将其扩充到2m*2n*3的大小 , 而其中每个像素点的灰度值要根据缩小后图像的每个像素值进行拟合 。
三、实验内容
给定一个图像 , 我们先用img = imread(‘’)将此图像读取 , 接着采用隔两点去一点的方法将其大小缩放到原来的一半 , 实现方法为:small = img(1:2:end,1:2:end,:) , 这个命名为small的图像就是缩放后的图像名 , 接着就是用多项式拟合的方法将图像进行放大 。
我们知道 , 图像在计算机中显示其实靠的是三个通道各自的像素值叠加 , 例如R = 255,G = 255, B = 255时我们所看到的就是白色 , R = 0 , G = 0 , B = 0我们看到的就是纯黑色了 , 我们利用的就是缩小后图像每一个小范围像素矩阵内的像素值对其余未知的像素值进行拟合 , 如下图 , 是一个5*5的矩阵

怎么用matlab画多项式拟合函数图像?matlab仿真图怎么放大

文章插图
建立放大后图像的幕布figure , 大小等同于缩小前的图像 , 我们将新图像命名为large 。现在在small的每个如图大小的像素矩阵中读取像素值f , 我们不妨以中心点为坐标原点 , 那么每个点相应的像素值就可以表示成f(x , y) , 而中心点(0 , 0)本质上就是我们当前顺序选取的small矩阵上的点 , 既如此 , 那么这25个点中各个像素值都是可读取的 , 我们给这个矩阵上的像素值与其所对应的坐标(x , y)一个二元二次函数关系:f(x,y) = ax^2+by^2+cxy+dx+ey+h
如果我们可以求得这六个系数(a,b,c,d,e,h)的值 , 那么这个矩阵上的各个像素点也就可以对应的拟合出来了 。显然 , 想要使这个函数尽可能拟合的准确 , 就必须进行误差最小值分析 , 这里我们采用最小二乘法 , 即:
怎么用matlab画多项式拟合函数图像?matlab仿真图怎么放大

文章插图
(Zi是这个点的真实像素值)
尽可能取到最小 , 因为误差不会存在极大值 , 我们可以对它分别求六个系数的偏导数使分别为0 , 这时求得的系数便是最佳系数 , 具体步骤如下:
怎么用matlab画多项式拟合函数图像?matlab仿真图怎么放大

文章插图
不难得知 , 当系数满足这六个偏导公式时 , 对应的系数使得的偏差理论上最小 。将上式用矩阵表示:
怎么用matlab画多项式拟合函数图像?matlab仿真图怎么放大

文章插图
很容易求得第一个矩阵为:
怎么用matlab画多项式拟合函数图像?matlab仿真图怎么放大

文章插图
则它的逆矩阵为
怎么用matlab画多项式拟合函数图像?matlab仿真图怎么放大

文章插图
这样 , 即可根据每个5*5矩阵对应的列向量用上述逆矩阵左乘以右图列向量即可得到各个系数的值 , 求得各系数 的值以后 , 矩阵对应位置上的f就显而易见了 。不过这时又将面临一个问题 , 每取一个5*5矩阵都将产生很多个居中点的f值 , 那么就会产生很多个重合点的取值问题 , 这样 , 我们只用该函数求原点左边第一个点f(-0.5,0)、上面第一个点f(0.0.5)和左上角第一个点f(-0.5,0.5)这样就不会产生重合点的问题了
怎么用matlab画多项式拟合函数图像?matlab仿真图怎么放大

文章插图
如图显示 , 这样就既不会出现重合点的
问题也不会出现未定义的点的现象了 。(但上述处理除了精度取舍之外还伴随着黑边的问题 , 因为没取到边界 , 对于边界两到三个像素点 , 我们可以采用复制赋值的办法或其他插值等更好的方法 , 本文不论述)
算法具体就如上所述 , 在MATLAB中
的实现方法将在实验步骤中具体阐述


推荐阅读