利用Mathematica删除复印产生的黑边
假设复印的图像为
1 |
img=图像或其地址 |
手动指定欲删除区域的点
第一种是手动指定欲删除区域的一个或多个点, 并利用RegionBinarize来二值化图像
1 |
imgdel = RegionBinarize[img, {{1220, 1341}}, .25] |
这里, {1220,1341}是黑边中的一点, Mathematica可以通过在图像上右键获得对应点坐标.
最后利用Inpaint去水印从原图中删除黑边.
1 |
Inpaint[img, imgdel] |
自动生成欲删除区域
利用FillingTransform函数我们可以自动定位黑边区域, 从而再利用去水印Inpaint函数删除黑边.
1 |
Inpaint[#, ColorNegate@FillingTransform[#]] &@img |
一个完整的处理
接下来, 我将演示如何实际地批量处理一个文档.
定义处理函数
1 |
DelBlack[img_] := Inpaint[img, ColorNegate@FillingTransform[img]] |
定义工作目录
为了方便, 我们将所有待处理的图像放到一个目录中, 请通过插入->”文件路径”(并删除最后的文件路径, 因为我们要的是该文件所在目录), 这里我假设是在
C:\Users\van\Desktop\new下, 则
1 |
SetDirectory["C:\\Users\\van\\Desktop\\new"]; |
查找工作目录下所有图像文件, 请自行添加没有的扩展名
1 |
FileList = FileNames[{"*.jpg", "*.png", "*.gif"}]; |
由于数据巨大, 尝试采用并行运算(多核)
1 |
DistributeDefinitions[DelBlack] |
遍历整个文件列表, 并将处理后的图片放入当前目录的\new\目录下
1 |
Parallelize[Do[Export["new\\"<>i, DelBlack[Import[FindFile[i]]]], {i, FileList}]] |
效果如图
本作品采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循署名-非商业用途-保持一致的创作共用协议.
我转载您了您的日志,您的想法不错,我平常只是拿他来算东西。不过您这个方法是有瑕疵的,应该处在最后一步,其实用纯数学的办法给他做差效果更好,ColorNegate[
Image[(ImageData[FillingTransform[img]] /.
Head -> List) – (ImageData[img] /. Head -> List)]]。您试一下,这样误差只会出现在FillingTransform这个函数上,只要内部没有黑块应该不会有错,这个可以看作纯数学运算,能否用GPU运算呢。
没懂你意思, 而且你的代码我也不能运行, 希望能把你的代码拆成几步, 分开运行才知道哪里可能错了. 其次, 你说的误差我不懂, 事实上所有过程的关键就只有那个去水印的函数FillingTransform, 二值化函数只是为了把图像变成二值的, 便于去水印.
又, 我这个办法去掉黑边后会留下黑色区域的一些字, 这个怎么去掉也是值得研究的.