Image processing 我应该使用什么处理步骤来清理线条图的照片?

Image processing 我应该使用什么处理步骤来清理线条图的照片?,image-processing,imagemagick,python-imaging-library,Image Processing,Imagemagick,Python Imaging Library,我通常使用的100%对比度和一些亮度调整来调整截止点的方法,通常可以很好地清理小型子电路或方程式的照片,以便发布在E&R.SE上,但有时效果不太好,如下图所示: 除了对比(或替代)之外,我还可以使用哪些方法来提供更一致的输出 我希望得到一个相当一般的答案,但我可能会使用ImageMagick和/或PIL(Python)在脚本中实现它(我可以将文件转储到脚本中),因此如果您有任何特定于它们的内容,我将非常欢迎 理想情况下,一个更好的源图像会更好,但我偶尔会在其他人的图像上使用它来添加一些润色。怎

我通常使用的100%对比度和一些亮度调整来调整截止点的方法,通常可以很好地清理小型子电路或方程式的照片,以便发布在E&R.SE上,但有时效果不太好,如下图所示:

除了对比(或替代)之外,我还可以使用哪些方法来提供更一致的输出

我希望得到一个相当一般的答案,但我可能会使用ImageMagick和/或PIL(Python)在脚本中实现它(我可以将文件转储到脚本中),因此如果您有任何特定于它们的内容,我将非常欢迎

理想情况下,一个更好的源图像会更好,但我偶尔会在其他人的图像上使用它来添加一些润色。

怎么样?那应该能找到线条图

以下是图像上Sobel边缘检测的结果:

如果然后对图像设置阈值(使用经验确定的阈值或),则可以使用(例如,膨胀和侵蚀)清理图像。这将帮助你摆脱断线/双线

正如Lambert指出的,如果不希望网格线出现在结果中,可以使用蓝色通道对图像进行预处理,以去除网格线


如果在成像之前均匀地照亮页面(或仅使用扫描仪),您也将获得更好的效果,因为这样您就不必担心全局阈值和局部阈值。

第一步是在考虑白平衡问题的同时均衡图像中的光照差异。这里的理论是,有限区域内图像最亮的部分代表白色。通过预先模糊图像,我们消除了图像中噪声的影响

from PIL import Image
from PIL import ImageFilter
im = Image.open(r'c:\temp\temp.png')
white = im.filter(ImageFilter.BLUR).filter(ImageFilter.MaxFilter(15))
下一步是从RGB输入创建灰度图像。通过缩放到白点,我们可以纠正白平衡问题。通过取R,G,B的最大值,我们不强调任何非纯灰色的颜色,例如网格中的蓝线。这里给出的第一行代码是一个伪代码,用于创建正确大小和格式的图像

grey = im.convert('L')
width,height = im.size
impix = im.load()
whitepix = white.load()
greypix = grey.load()
for y in range(height):
    for x in range(width):
        greypix[x,y] = min(255, max(255 * impix[x,y][0] / whitepix[x,y][0], 255 * impix[x,y][1] / whitepix[x,y][1], 255 * impix[x,y][2] / whitepix[x,y][2]))
这些操作的结果是图像的值基本一致,可以通过简单的阈值转换为黑白。


编辑:很高兴看到一些竞争。他提出了一种非常类似的方法,使用减法而不是缩放来消除白电平的变化。我的方法增加了光线不足区域的对比度,而nikie的方法没有——你更喜欢哪种方法取决于光线不足区域是否有你希望保留的信息

我尝试重新创建此方法的结果是:

for y in range(height):
    for x in range(width):
        greypix[x,y] = min(255, max(255 + impix[x,y][0] - whitepix[x,y][0], 255 + impix[x,y][1] - whitepix[x,y][1], 255 + impix[x,y][2] - whitepix[x,y][2]))


我正在研究一种技术组合,以提供更好的结果,但它还没有完全准备好。

消除不同背景照明的一种常见方法是从图像中逐个计算“白色图像”

from PIL import Image
from PIL import ImageFilter
im = Image.open(r'c:\temp\temp.png')
white = im.filter(ImageFilter.BLUR).filter(ImageFilter.MaxFilter(15))
在这个倍频程代码示例中,我使用了图像的蓝色通道,因为背景中的线条在此通道中最不突出(编辑::使用圆形结构元素产生的视觉伪影少于简单的方框):

结果:

然后从源图像中减去:

background_subtracted = opened-blue;
(对比增强版)

最后,我将使用固定阈值对图像进行二值化:

binary = background_subtracted < 35;
binary=background\u减去<35;

颜色怎么样?我对图像处理不太熟悉,但如果你删除了某个蓝色范围内的所有内容,网格就会被删除。只是“竞赛”中的一条评论:你的建议和我的建议之间的主要区别是,你使用的是(高斯?)模糊过滤器,然后是最大过滤器(=膨胀)。矿山使用形态开口,使大规模梯度几乎保持不变。问题是,PIL不包含形态过滤器(或者我没有找到它们)。我在for循环上得到了索引超出范围的错误。[x,y]之后的4,5,7,8,9,10指数是什么意思?@DeepakGarud问得好!我以为我粘贴了我用过的代码,但那看起来肯定是错的。很难记得我在将近8年前做了什么。