主要内容

大规模约束线性最小二乘法,基于解算器

此示例演示如何通过解决大规模边界约束线性最小二乘优化问题来恢复模糊图像。此示例使用基于解算器的方法。有关基于问题的方法,请参阅基于问题的大规模约束线性最小二乘法.

问题

这是一张人们坐在车里的照片,上面有一个有趣的车牌。

负载optdeblur[m,n]=尺寸(P);mn=m*n;imshow(P)标题(sprintf)('原始图像,大小%d-by-%d,%d像素',m,n,mn)

图中包含一个Axis对象。标题为原始图像、大小为149×311、46339像素的Axis对象包含一个Image类型的对象。

问题是拍摄这张照片的模糊版本并尝试去模糊。起始图像是黑白的,这意味着它由m x n矩阵P中从0到1的像素值组成。

添加运动

通过平均每个像素上下5个像素来模拟垂直运动模糊的效果。构造一个稀疏矩阵D使用单个矩阵进行模糊。

模糊=5;mindex=1:mn;nindex=1:mn;对于i=1:blur mindex=[mindex i+1:mn 1:mn-i];nindex=[nindex 1:mn-i+1:mn];终止D=稀疏(mindex,nindex,1/(2*模糊+1));

画一幅D。

cla轴ijxs=31;ys=15;xlim([0,xs+1]);ylim([0,ys+1]);[ix,iy]=meshgrid(1:(xs-1),1:(ys-1));l=abs(ix-iy)<=5;text(ix(l),iy(l),“x”)文本(ix(~l),iy(~l),'0')文本(xs*one(ys,1),1:ys,'...'); 文本(1:xs,ys*one)(xs,1),'...'); 头衔('模糊运算符D(x=1/11)')

将图像P乘以矩阵D以创建模糊图像G。

G=D*(P(:);图形显示(重塑(G,m,n));标题(“模糊图像”)

Figure包含axes对象。标题模糊图像的axes对象包含Image类型的对象。

图像清晰得多;您无法再读取车牌。

去模糊图像

为了消除模糊,假设您知道模糊算子D。您能在多大程度上消除模糊并恢复原始图像P?

最简单的方法是解决一个最小二乘问题x:

( D x - G 2. ) 从属于 0 x 1. .

这个问题采用模糊矩阵D并试图找到x那就Dx最接近G=数据处理. 为了使解决方案表示合理的像素值,请将解决方案限制在0到1之间。

lb=0(mn,1);ub=1+lb;sol=lsqlin(D,G,[],[],[],[],[],[],[],[],lb,ub);
找到满足约束的最小值。优化完成是因为目标函数在可行方向上不递减,在最优性公差值范围内,且约束满足在约束公差值范围内。
xpic=重塑(sol、m、n);图imshow(xpic)标题(“去模糊图像”)

图中包含一个Axis对象。标题为“去模糊图像”的Axis对象包含一个类型为“图像”的对象。

去除模糊的图像比模糊的图像清晰得多。您可以再次读取车牌。但是,去除模糊的图像有一些瑕疵,例如右下人行道区域的水平带。也许可以通过正则化来消除这些瑕疵。

正规化

正则化是平滑解的一种方法。有许多正则化方法。对于一种简单的方法,在目标函数中添加一个术语,如下所示:

( ( D + ε ) x - G 2. ) 从属于 0 x 1. .

术语 ε 使生成的二次问题更加稳定 ε = 0 . 0 2. 然后再解决这个问题。

addI=speye(mn);sol2=lsqlin(D+0.02*addI,G,[],[],[],[],[],[],lb,ub);
找到满足约束的最小值。优化完成是因为目标函数在可行方向上不递减,在最优性公差值范围内,且约束满足在约束公差值范围内。
xpic2=重塑(sol2,m,n);图imshow(xpic2)标题(“去模糊正则化图像”)

图中包含axes对象。标题为“去模糊正则化图像”的axes对象包含Image类型的对象。

显然,这种简单的正则化并不能消除伪影。

相关话题