【问题标题】:Adaptive threshold of blurry image模糊图像的自适应阈值
【发布时间】:2012-11-03 16:08:00
【问题描述】:

我有一个相当模糊的 432x432 数独拼图图像,它不能很好地自适应阈值(取 5x5 像素块大小的平均值,然后减去 2):

如您所见,数字略有扭曲,其中有很多破损,少数5s融合为6s,6s融合为8s。此外,还有大量的噪音。为了修复噪点,我必须使用高斯模糊使图像更加模糊。然而,即使是相当大的高斯核和自适应阈值块大小(21x21,减去 2)也无法消除所有破损并将数字更多地融合在一起:

我也尝试过在阈值化后对图像进行扩张,这与增加 blockSize 的效果类似;和sharpening the image,它并没有做太多的一种方式或另一种方式。我还应该尝试什么?

【问题讨论】:

  • 你见过this thread?
  • 我最近确实看过这个,但是对于凸性代码(我最终没有费心实现),而不是规范化代码。我现在一定会看看的。
  • 你能通过假设一个格式正确的谜题来添加非图像处理策略吗?如果是这样,您可以应用一些不依赖于图像质量的其他规则。例如,对于您对 OCR 结果的置信度较低的单元格,您可以检查所讨论单元格的三个房屋中的每一个中的高置信度数字,这可能允许您限制低置信度单元格的可能性。您还可以使用高置信度单元格部分解决难题,这会增加约束。
  • @DaveK 我认为这是一个非常有创意的解决方案。我喜欢使用附近的细胞来提高信心的想法。而且我认为您甚至不需要部分解决这个难题,即使使用简单的 DFS 解决方案只需要很少的时间。然后你可以简单地采用你得到的第一个解决方案并假设它是正确的。加入一些并行处理,其中每个内核采用不同的假定板,您很快就会得到解决方案。
  • 我正在使用 OpenCV 的 HoG 和 SVM 对数字进行分类。我不知道有可能从该界面获得信心。即使可以,我也宁愿提高检测中的图像质量。不过这个想法很酷,如果一切都失败了,我可能会考虑。

标签: image-processing opencv threshold


【解决方案1】:

一个很好的解决方案是使用形态闭合使亮度均匀,然后使用常规(非自适应)Otsu阈值:

// Divide the image by its morphologically closed counterpart
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(19,19));
Mat closed = new Mat();
Imgproc.morphologyEx(image, closed, Imgproc.MORPH_CLOSE, kernel);

image.convertTo(image, CvType.CV_32F); // divide requires floating-point
Core.divide(image, closed, image, 1, CvType.CV_32F);
Core.normalize(image, image, 0, 255, Core.NORM_MINMAX);
image.convertTo(image, CvType.CV_8UC1); // convert back to unsigned int

// Threshold each block (3x3 grid) of the image separately to
// correct for minor differences in contrast across the image.
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        Mat block = image.rowRange(144*i, 144*(i+1)).colRange(144*j, 144*(j+1));
        Imgproc.threshold(block, block, -1, 255, Imgproc.THRESH_BINARY_INV+Imgproc.THRESH_OTSU);
    }
}

结果:

【讨论】:

  • 如何合并区块?
【解决方案2】:

看看Smoothing Images OpenCV tutorial。除了 GaussianBlur,还有medianBlurbilateralFilter,你也可以使用它们来降低噪音。我从您的源图片(右上角)中获得了这张图片:

更新:我在去除小轮廓后得到以下图像:

更新:您还可以锐化图像(例如,使用Laplacian)。看this discussion

【讨论】:

  • 感谢您的提示!这比原来的要好,但不能充分解决数字断裂的问题。
【解决方案3】:

始终应用高斯以获得更好的结果。

cvAdaptiveThreshold(original_image, thresh_image, 255,
            CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 11, 2);

【讨论】:

  • 高斯阈值并不总能带来更好的结果。
猜你喜欢
  • 2013-09-08
  • 1970-01-01
  • 2016-02-03
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 2020-05-27
  • 2017-10-07
相关资源
最近更新 更多