2016-10-06 91 views
-1

林在计算机视觉项目在这里我的工作(我是一个 工程从业者),我有比较电路板的两个图像之前,以发现错误(如果有的话)机器做组装。图像二值化,自适应阈值参数的麻烦

我不知道如果我的方法是好的,但我发现我可以比较两个二进制图像,然后应用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

我只是想知道,如果有一些参数,使线条更清晰(或者可能是另一个二进制mehotd,我只是错过了)

回答

0

我只是想知道我F时,有一些参数,使线条更清晰(或者其他二进制mehotd,我只是错过了)

可以使线条更加清晰进一步过滤。例如,在引导你引用的门槛起着重要的作用,因为它标识了两块电路板缺少的对象。如果阈值被设置为0,则所识别的每个微小的白点(这可能是由于不同的照明 - 从guide建议的)将被认为是在两个板之间的“差异”的检测。检测阈值对于检测满足像素最小阈值的分段非常重要。

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

有很多考虑为“准确”的检测和得到你想要的,因为不同的像素簇(如在输出“异或”图像显示)可以在整个板的阈值而改变什么结果。

为您的特定sitation,看着doc'sImgproc.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. 

假设你有255的包括maxValue(按你原来的问题状态)。然后块大小为13,C为10。

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

我建议的解决方案:

  • 采取笔记,努力提高对5.0局限性作为guide/article建议您链接到以下。
  • 而不是搜索整个图像,搜索图像的部分可能会提高准确性,因为您可以有图像不同部分的可变阈值(例如,如果在图像的一个角落有较小的噪声与较大的差异在图像的另一个角落更多的噪音 - 那么你可能会潜在地过滤时消除缺失部分的合法集群的潜在损失)

注:通过张贴您所使用的源图像和您正在使用,以更好的代码帮助复制您的设置(请参阅how to ask a good question

编辑:请参阅相关示例adaptive threshold和openCV(相关)。