利用Mathematica删除复印产生的黑边

假设复印的图像为

手动指定欲删除区域的点

第一种是手动指定欲删除区域的一个或多个点, 并利用RegionBinarize来二值化图像


这里, {1220,1341}是黑边中的一点, Mathematica可以通过在图像上右键获得对应点坐标.

最后利用Inpaint去水印从原图中删除黑边.

自动生成欲删除区域

利用FillingTransform函数我们可以自动定位黑边区域, 从而再利用去水印Inpaint函数删除黑边.

一个完整的处理

接下来, 我将演示如何实际地批量处理一个文档.

定义处理函数

定义工作目录

为了方便, 我们将所有待处理的图像放到一个目录中, 请通过插入->”文件路径”(并删除最后的文件路径, 因为我们要的是该文件所在目录), 这里我假设是在
C:\Users\van\Desktop\new下, 则

查找工作目录下所有图像文件, 请自行添加没有的扩展名

由于数据巨大, 尝试采用并行运算(多核)

遍历整个文件列表, 并将处理后的图片放入当前目录的\new\目录下

效果如图

处理前处理后

3 Comments

  1. 我转载您了您的日志,您的想法不错,我平常只是拿他来算东西。不过您这个方法是有瑕疵的,应该处在最后一步,其实用纯数学的办法给他做差效果更好,ColorNegate[
    Image[(ImageData[FillingTransform[img]] /.
    Head -> List) – (ImageData[img] /. Head -> List)]]。您试一下,这样误差只会出现在FillingTransform这个函数上,只要内部没有黑块应该不会有错,这个可以看作纯数学运算,能否用GPU运算呢。

    • 没懂你意思, 而且你的代码我也不能运行, 希望能把你的代码拆成几步, 分开运行才知道哪里可能错了. 其次, 你说的误差我不懂, 事实上所有过程的关键就只有那个去水印的函数FillingTransform, 二值化函数只是为了把图像变成二值的, 便于去水印.

    • 又, 我这个办法去掉黑边后会留下黑色区域的一些字, 这个怎么去掉也是值得研究的.

发表评论