17

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

在此处输入图像描述

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

在此处输入图像描述

我还尝试在阈值处理后对图像进行扩张,这与增加块大小的效果类似;和锐化图像,这在一种或另一种方式上没有多大作用。我还应该尝试什么?

4

3 回答 3

21

一个很好的解决方案是使用形态闭合使亮度均匀,然后使用常规(非自适应)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);
    }
}

结果:

在此处输入图像描述

于 2012-12-08T22:41:45.980 回答
7

看看平滑图像 OpenCV 教程。除了 GaussianBlur 还有你medianBlurbilateralFilter可以用它来减少噪音。我从您的源图像中获得了这张图片(右上角):

结果图像

更新:删除小轮廓后得到以下图像:

在此处输入图像描述

更新:您也可以锐化图像(例如,使用Laplacian)。看看这个讨论

于 2012-11-15T10:08:16.277 回答
-1

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

cvAdaptiveThreshold(original_image, thresh_image, 255,
            CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 11, 2);
于 2014-07-31T18:09:15.187 回答