我应该使用哪些处理步骤来清理线条图的照片?

Nic*_*k T 14 imagemagick image-processing python-imaging-library

我通常使用100%对比度和一些亮度调整以调整截止点的方法通常可以很好地清理小子电路的照片或方程式以便在E&R.SE上发布,但有时它并不是那么好,就像这张图片一样:

替代文字

除了对比(或代替)之外还有哪些其他方法可以用来给我一个更一致的输出?

我期待一个相当普遍的答案,但我可能会使用ImageMagick和/或PIL(Python)在脚本中实现它(我可以将文件转储到其中),所以如果你有任何特定的东西,那将是受欢迎的.

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

Mar*_*som 17

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

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))
Run Code Online (Sandbox Code Playgroud)

替代文字 下一步是从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]))
Run Code Online (Sandbox Code Playgroud)

这些操作的结果是具有大致一致值的图像,并且可以通过简单的阈值转换为黑白. 替代文字


编辑:很高兴看到一点竞争.nikie提出了一种非常类似的方法,使用减法而不是缩放来消除白色级别的变化.我的方法增加了光照较差区域的对比度,而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]))
Run Code Online (Sandbox Code Playgroud)

替代文字

我正在研究一种技术组合,以提供更好的结果,但它尚未准备好.


Nik*_*iki 17

去除不同背景照明的一种常见方式是通过打开图像从图像计算"白色图像" .

在这个Octave代码示例中,我使用了图像的蓝色通道,因为背景中的线条在此通道中最不突出(EDITED:使用圆形结构元素产生的视觉效果比简单框更少):

src = imread('lines.png');
blue = src(:,:,3);
mask = fspecial("disk",10);
opened = imerode(imdilate(blue,mask),mask);
Run Code Online (Sandbox Code Playgroud)

结果: 打开

然后从源图像中减去它:

background_subtracted = opened-blue;
Run Code Online (Sandbox Code Playgroud)

background_subtracted (对比增强版)

最后,我只是用固定的阈值对图像进行二值化:

binary = background_subtracted < 35;
Run Code Online (Sandbox Code Playgroud)

二进制