关于阈值技术/图像二值化的建议

时间:2013-11-19 13:47:33

标签: c++ image visual-c++ opencv image-processing

我需要在某些图像中应用二值化过程。到目前为止,我只测试了OpenCV中的三种阈值技术(Otsu,自适应和固定),自适应是得到了更好的结果,但仍然没有预期的好。我想知道一个从事图像处理的人,有些建议我可以做一些测试。我做了一个搜索,找到了很多方法,甚至很多,很多,我不知道从哪里开始。所以,在这里,我要求那些理解这个主题的人提出建议。

图像示例: enter image description here

5 个答案:

答案 0 :(得分:2)

以下步骤给了我最好的结果:

  1. 提取图像的绿/蓝通道。\

    vector< Mat > channels(3);
    split(frame, channels);

  2. 应用高斯模糊。

    GaussianBlur(channels[0], channels[0], Size(7, 7), 0, 0);

  3. 使用THRESH_OTSU标志应用阈值。

    threshold(channels[0], channels[0], -1, 255, THRESH_BINARY+THRESH_OTSU);

  4. 另请参阅关于阈值处理的这些帖子:Adaptive threshold of blurry imageThreshold of blurry image - part 2

答案 1 :(得分:1)

我通常从一些简单的阈值开始:

1)平均强度

2)中位数强度

3)强度的平均值+ k *标准偏差(以k = 1开始)

4)中位数+ k * median absolute deviation

只有当简单的阈值不起作用时,我才会考虑更复杂的阈值,例如自适应阈值。

答案 2 :(得分:0)

你可以尝试

  1. 边缘检测然后侵蚀以消除小边缘
  2. 边缘像素周围的小邻域并找到它们的阈值
  3. 基于这些值对原始图像进行阈值
  4. 更简单的选择是使用最亮区域作为起始区段来执行均值过滤。

答案 3 :(得分:0)

数字的位置似乎是固定的,以及它们的形状和边界矩形的比例。您可以将图像分割为多个区域并单独处理,等待黑色背景上的白色数字或红色背景上的灰色数字,或类似的特定内容。

答案 4 :(得分:-1)

我会在这些基本步骤中执行此操作:

  • 将彩色像素转换为黑色。这将(希望)在黑色背景上留下白色字母。
  • 将生成的图像转换为灰度。
  • 为灰度图像创建像素强度值的直方图;
  • 近似有序直方图数据的一阶导数,以找出给定像素强度值找到的像素数量的较大变化(希望对应于字母值)。
  • 使用该值作为阈值。

这些步骤只是我将从哪里开始的简要说明。反思将是一个难以解决的问题我想(我正在研究的东西现在有部分阴影,这是一个类似的问题)。

如果这看起来非常复杂,那么就无法取代一本好的图像处理书和大量的编程实践。

希望这有帮助!