我有一张非常模糊的432x432的数独拼图,它的自适应阈值不好(取5x5像素块大小的平均值,然后减去2):
正如你所看到的,数字有点失真,有很多破损,一些5s融合成6s,6s融合成8s。此外,还有大量噪音。为了修复噪声,我必须使用高斯模糊使图像更加模糊。然而,即使是相当大的高斯核和自适应阈值块大小(21x21,减去2)也无法消除所有中断,并将数字融合到一起,甚至更严重:
我还尝试过在阈值化后放大图像,这与增加块大小有相似的效果;和锐化图像,这样或那样都没什么用。我还应该尝试什么?
始终应用高斯函数以获得更好的结果。
cvAdaptiveThreshold(original_image, thresh_image, 255,
CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 11, 2);
看看平滑图像OpenCV教程。除了GaussianBlur,还有medianBlur
和bilateralFilter
,您也可以使用它们来降低噪声。我从您的源图像(右上角)中获得了这张图像:
更新:和下面的图片,我得到后删除小轮廓:
更新:还可以锐化图像(例如,使用拉普拉斯算子)。看看这个讨论。
一个很好的解决方案是使用形态学闭合使亮度均匀,然后使用常规(非自适应)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);
}
}
结果:
如何设置模糊图像的阈值以使数字尽可能清晰? 在之前的一篇文章中,我尝试自适应地对模糊的图像进行阈值化(左),这导致数字失真和断开连接(右): 从那时起,我尝试使用本文中描述的形态学关闭操作来使图像的亮度均匀: 如果我自适应地设置此图像的阈值,则不会得到明显更好的结果。但是,由于亮度大致一致,我现在可以使用普通阈值: 这比以前好多了,但我有两个问题: 我必须手动选择阈值。虽然关闭操作会产生均匀的亮度
主要内容:其他类型的自适应阈值在简单的阈值处理中,阈值是全局的,即对于图像中的所有像素是相同的。 自适应阈值法是针对较小区域计算阈值的方法,因此对于不同区域将存在不同的阈值。 在OpenCV中,可以使用类的方法对图像执行自适应阈值操作。 以下是此方法的语法。 该方法接受以下参数 - src - 表示源(输入)图像的类的对象。 dst - 表示目标(输出)图像的类的对象。 thresh - 表示阈值的双重类型的变量。 maxva
我在试着模糊图像 它会模糊图像,但不是图像的所有部分。 我所缺少的地方,这样它就会模糊完整的图像。没有任何路径。
图像阈值 目标 在本教程中,您将学习简单阈值处理,自适应阈值处理,Otsu阈值处理等。 您将学习以下函数:cv2.threshold, cv2.adaptiveThreshold等。 一、单的阈值 在这里,事情是直截了当的。如果像素值大于阈值,则为其分配一个值(可以是白色),否则为其分配另一个值(可以是黑色)。使用的函数是cv2.threshold。第一个参数是源图像,它应该是灰度图像。第二个参数
问题内容: 我正在尝试在Java游戏中实现模糊机制。如何在运行时创建模糊效果? 问题答案: 请参阅/ Google“卷积滤镜”,这是一种根据周围像素值更改像素值的方法。因此,除了模糊之外,您还可以进行图像锐化和寻线。
目标 在本教程中,您将学习简单阈值,自适应阈值和Otsu阈值。 你将学习函数cv.threshold和cv.adaptiveThreshold。 简单阈值 在这里,问题直截了当。对于每个像素,应用相同的阈值。如果像素值小于阈值,则将其设置为0,否则将其设置为最大值。函数cv.threshold用于应用阈值。第一个参数是源图像,它应该是灰度图像。第二个参数是阈值,用于对像素值进行分类。第三个参数是分