放大黑线的门槛

时间:2013-06-13 14:14:04

标签: image-processing colors

给定图像(如下面给出的图像)我需要将其转换为二进制图像(仅限黑白像素)。这听起来很容易,我尝试过两个阈值函数。问题是我无法使用这些功能之一获得完美的边缘。任何帮助将不胜感激。

我尝试过的滤镜是RGB和HSV空间中的欧几里德距离。

示例图片:

enter image description here

这是在运行RGB阈值过滤器之后。 (此后40%更多的艺术效果)

enter image description here

这是在运行HSV阈值过滤器之后。 (30%的路径几乎看不到,但由于噪音明显无法使用)

enter image description here

我使用的代码非常简单。将输入图像更改为适当的颜色空间,并使用黑色检查欧几里德距离。

sqrt(R*R + G*G + B*B)

因为我正在与黑色(0,0,0)进行比较

5 个答案:

答案 0 :(得分:3)

您的问题似乎是扫描图像上的光照变化,这表明局部自适应阈值处理方法可以为您提供更好的结果。

Sauvola方法基于原始图像的窗口中的像素的平均值和标准偏差来计算二值化像素的值。这意味着如果图像的某个区域通常更暗(或更亮),则会针对该区域调整阈值,并且(可能)在二值化图像中为您提供更少的暗斑点或褪色线。

http://www.mediateam.oulu.fi/publications/pdf/24.p

我还发现了Shafait等人的一种方法。以更高的时间效率实施Sauvola方法。缺点是你必须计算原始的两个积分图像,一个是每像素8位,另一个可能是每像素64位,这可能会给内存约束带来问题。

http://www.dfki.uni-kl.de/~shafait/papers/Shafait-efficient-binarization-SPIE08.pdf

我还没有尝试过这些方法中的任何一种,但它们确实看起来很有前途。我通过粗略的Google搜索找到了Java实现。

答案 1 :(得分:1)

在HSV颜色空间中的V通道上运行自适应阈值应该会产生出色的结果。最好的结果是高于11x11大小的窗口,不要忘记为阈值选择值。

自适应阈值处理基本上是:

if (Pixel value + constant > Average pixel value in the window around the pixel )
    Pixel_Binary = 1;
else
    Pixel_Binary = 0;

答案 2 :(得分:1)

由于噪音和照明变化,您可能需要自适应的局部阈值处理,这要归功于Beaker的答案。

因此,我尝试了以下步骤:

  • 将其转换为灰度。

  • 进行均值或中值局部阈值处理,我使用10作为窗口大小,使用10作为截距常量并获得此图像(较小的值也可能有效): image

    如果您需要更多信息,请参阅:http://homepages.inf.ed.ac.uk/rbf/HIPR2/adpthrsh.htm 有关此技术的信息。

  • 为了确保阈值处理工作正常,我将其镂空以查看是否存在换行符。这个骨架可能是进一步处理所需的骨架。

image

  • 为了获得剩余噪音,您可以在骨架化图像中找到最长的连通分量。

谢谢。

答案 3 :(得分:0)

您可能希望将此操作分为三步操作。

  1. 使用水准测量,而不仅仅是阈值处理:获取输入并使用简单调整中间色调的参数调整强度(伽马校正),而不去除黑暗或光线(例如,您的rgb阈值太强,例如你失去了一些线路。

  2. 使用小内核卷积边缘检测生成的图像(对于二进制图像,5x5应该绰绰有余)。用一个简单的[1 2 3 2 1; 2 3 4 3 2; 3 4 5 4 3; 2 3 4 3 2; 1 2 3 2 1]内核(规范化)

  3. 阈值生成的图像。你现在应该有一个更好的二进制图像。

答案 4 :(得分:0)

您可以尝试黑色top-hat transform。这涉及从图像的关闭中减去图像。我使用的结构元素窗口大小为11,常量阈值为0.1(255级为25.5)

你应该得到类似的东西:

enter image description here

然后您可以轻松达到阈值:

enter image description here

祝你好运。