“浓淡补正”是基恩士视觉的一个很强大的算法工具。使用“浓淡补正”的预处理,可以消除工件表面的光泽和阴影,仅抽取污点及瑕疵。(如下图)
至于它的实现原理,网上搜不到相关资料。不过根据它的实现效果,能大致窥见它的原理:排除背景渐变的浓淡变化,只抽取对比度急剧变化的部分。
看到这句话,想必有些人已经想到了一个词“动态阈值”,没错,动态阈值是跟它有几分相似,这个我们后面再分析。
一、浓淡补正近似实现
下图中,要把“黑点”和“弯曲的细黑线”提取出来,其中黑点正方形的边长是5个像素。
处理算法如下:
1 read_image (Image, '白格矩阵.jpg') 2 rgb1_to_gray (Image, GrayImage) 3 4 gen_disc_se (SE, 'byte', 11, 11, 0) //设计结构元素 5 gray_dilation (GrayImage, SE, ImageDilation) 6 gray_erosion (ImageDilation, SE, ImageErosion) 7 sub_image (ImageErosion, GrayImage, ImageSub, 1, 120) //这个120也可以设置其他值
构造的结构原图是一个11 × 11的矩形结构元素。
分析:
① gray_dilation (GrayImage, SE, ImageDilation),对图像进行灰度值像素膨胀,即灰度值较大的区域膨胀,面积变大。(如下图左ImageDilation)
② gray_erosion (ImageDilation, SE, ImageErosion),对图像进行灰度值像素收缩,即灰度值较大的区域收缩,面积变小。(如下图右ImageErosion)
③ 在灰度值像素膨胀的过程中,原图中的“小黑点”和“细长的黑线”被它们周围的高亮灰度值像素膨胀覆盖掉了。(如下图左)
④ 在灰度值像素收缩的过程中,图中的白格子面积缩小,几乎恢复原状,不过在上一步中被膨胀覆盖掉的小黑点、细黑线不可能再复原了。
⑤ sub_image (ImageErosion, GrayImage, ImageSub, 1, 120),用无黑点、黑线的图ImageErosion减去原始图,就有效提取出了黑点和黑线。(如上图所示)
使用这种方式提取复杂背景的黑点和黑线,有什么注意点呢?
① 结构元素要构造得合理,一般来说,构造正方形结构元素最通用。
② 图中“小黑点”的边长是5 pix,结构元素至少要设置为6 × 6 才行,不然不能有效提取出小黑点。
③ 点只能提取较小的,线也只能提取较细长的。(因为结构元素设计过大,可能会有难以预料的结果)
下图中展示了结构元素分别为3 × 3、50 × 50时,最终的效果图ImageSub:
二、复杂背景下的算法表现
三、动态阈值
四、diff_of_gauss
(待续)