图像二值化,自适应阈值参数麻烦

时间:2016-10-06 22:36:11

标签: java opencv

我在我的工作中参与计算机视觉项目(我是一个 工程从业者)我必须比较电路板的两个图像,以便在机器进行组装之前发现错误(如果有的话)。

我不知道我的方法是不是很好但是我发现我可以比较两个二进制图像然后应用XOR操作来找到两个图像之间的差异(这就是我正在做的:http://www.electroschematics.com/10482/pcb-defects-detection-opencv/

但是当我在我的代码中应用自适应阈值的功能时,得到的图像不是我想要的结果(它有很多黑色空格或电路线缺失或粗体)我尝试了很多参数但是我找不到好的。

以下是门槛的代码:

[Imgproc.adaptiveThreshold(img1,src, 255,   Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 13,10);]

这是结果

circuit board

我只是想知道是否有一些参数可以使线条更清晰(或者可能是我错过的另一个二进制文件)

1 个答案:

答案 0 :(得分:0)

  

我只是想知道是否有一些参数可以使线条更清晰(或者可能是我错过的另一个二进制文件)

您可以通过进一步过滤使行更清晰。例如,在您引用的指南中,阈值起着重要作用,因为它识别两个电路板上缺少的对象。如果阈值设置为0,那么识别的每个微小的小白点(这可能是由于不同的照明 - 如guide所示)将被视为检测到两个板之间的“差异”。提高阈值对于检测满足最小像素阈值的片段非常重要。

  

但是当我在我的代码中应用自适应阈值的功能时,得到的图像不是我想要的结果(它有很多黑色空格或电路线缺失或粗体)我尝试了很多参数但是我找不到好的。

为了“准确”检测并获得您想要的结果,需要考虑很多因为不同像素的簇(如输出'xor'图像中所示)在整个板上的阈值可能会有所不同。

针对您的特定观点,查看doc's以获取 Imgproc.adaptiveThreshold

public static void adaptiveThreshold(Mat src,
                 Mat dst,
                 double maxValue,
                 int adaptiveMethod,
                 int thresholdType,
                 int blockSize,
                 double C)

我发现以下参数可能会帮助您配置更可接受的阈值。这些参数是(尽管所有参数都起着重要作用):

maxValue - Non-zero value assigned to the pixels for which the condition is satisfied. See the details below.
blockSize - Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on.
C - Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well.

假设您的maxValue为255(根据原始问题状态)。然后是blockSize为13,C为10。

根据我的理解,如果旁观者在这里得到一些东西,我也会从学习中受益,13 * 13块总共约169个像素,阈值是255,具有常数因子C的变化或10.所以我不认为这些数字不能最大化它们的潜力。

我建议的解决方案:

  • 请注意并尝试按照与您关联的guide/article中的建议改进 5.0限制
  • 不是搜索整个图像,而是通过图像的某些部分进行搜索可以提高准确度,因为您可以为图像的不同部分设置可变阈值(例如,如果图像的一个角落中的噪声较小而差异很大,那么差异很大在图像的另一个角落有更多的噪音 - 那么你可能有可能在过滤时消除合法的丢失部分群的潜在损失)

注意:通过发布您正在使用的源图像和您正在使用的代码来更好地帮助复制您拥有的设置(请参阅how to ask a good question

编辑:有关adaptive threshold和openCV(相关)的示例,请参阅相关内容。