用Mathematica拯救一只数字化猫(2)

来源:互联网 发布:破解版软件下载 编辑:程序博客网 时间:2024/05/22 00:17

解法

前面已经提到了这只猫:
这里写链接内容
这里写图片描述

这里直接上代码如何?

把图片放到变量 img 中(可以复制、粘贴),或者用 Import 下载等。

img=Import["http://i.stack.imgur.com/XroGQ.jpg"]

这里的所谓“封印”,实际是我们居家经常安装的防蚊子的纱窗,猫就猫在纱窗后面被拍到了! 现在要想去掉纱窗,还原猫,——现实世界中只要打开窗子,再拍一张就行了;不过,程序员都是脱离现实的;所以,只能在数字的虚拟世界里玩玩花样,——因此,问题的关键是如何找出纱窗网格的蒙板来。

ridges = ImageAdjust[ColorConvert[RidgeFilter[img, 2], "Grayscale"]]

这句代码的核心是RidgeFilter滤波器,针对每个像素计算Hessian矩阵的负的主特征值。得到的结果的几何意义——在微分几何中——相当于曲面的主曲率。注意到视图片为随着像素值灰度波动的曲面时,纱窗网格都明显地“高亮”,这样能够找出纱窗的主要部分。
这里写图片描述

这里先对彩色图片作主曲率滤波,从而对不同通道都滤波;这个滤波是非线性的,从而如果先转灰度再滤波,效果会有不同。

简单粗暴的方法

图上看,不光纱窗网格,连同其它一些亮度高的部分也都被取出来了,最简单粗暴的方式是,不妨设置一个适当的阈值生成二值化的蒙板,有了蒙板,直接用 Inpaint 处理就行:

mask = MorphologicalBinarize[ridges, {0.05, 0.5}]Inpaint[img, mask, Method -> "Diffusion"]

得到的效果是:
蒙板:
这里写图片描述
最终拯救出来的猫:
这里写图片描述

细化蒙板的结果

从处理过程知道,蒙板的好坏对最终拯救出来的猫的质量有很大影响。因此,值得作更精细的微调,得到更符合纱窗效果的蒙板,就能购尽可能少一些失真。

logX = ImageData@LaplacianGaussianFilter[img, {50, {1, 20}}];logY = ImageData@LaplacianGaussianFilter[img, {50, {20, 1}}];{logX, logY} = Map[Total, #^2, {2}] & /@ {logX, logY};{logX, logY} =   Rescale[#/(GaussianFilter[#, 10] + 10^-10)] & /@ {logX, logY};grid = Image[Rescale@(logX + logY)];mask = MorphologicalBinarize[Image@grid, {0.15, 0.5}]

对原始图片在垂直和水平方向分别用“拉普拉斯-高斯”滤波,平方处理以获取亮部和暗部的细节(我觉得其实用奇异值分解,然后对奇异值作幂运算之后重构也有类似甚至更佳效果,但效率不高)。而后高斯滤波方式取局部的平均网格亮度,再阈值二值化得到mask: 它跟前面一种方法得到的纱窗网格相比,显然更接近我们想要的效果,更少失真的可能。
这里写图片描述

最后用Inpaint 处理:

Inpaint[img, Dilation[mask, 1], Method -> "Diffusion"]

得到最终的拯救出来的猫(拯救了一只猫,也就拯救了动物世界)
这里写图片描述

小结

即使做到了,然并卵。

回地下室,继续思考国家大事去吧。

0 0