gray_opening和opening_circle:详解什么是灰度值开运算闭运算我们在进行开运算和闭运算的时候会遇到两种类型的算子,一种是opening_circle这样的,一种是gray_opening这样的,可能你看了Halcon的帮助文档也没弄清楚怎么回事,那我就按自己的理解多讲几句这两种算子到底是什么区别吧。首先要明白一件事:开运算=腐蚀+膨胀;(断开细小的地方,所以叫开)闭运算=膨胀+腐蚀。(连接细小的地方,所以叫闭)然后,一定要仔细琢磨透在图像处理中所谓region和image到底有什么区别。这两者的区别很大,而且很重要。我相信你肯定遇到过自己找到一个算子,想对image进行处理,结果发现这个算子的参数只能是region这样的情况。好,不废话了,打字比较快,说的比较乱,如果有语句不通顺或者难以理解的地方,请见谅,恳请指出我们一起交流。dilation1是对一个region进行膨胀,注意这里变量是一个region,region从某种意义上来说已经失去了灰度值这一性质,因为region基本上都是在灰度值的性质下提取出来的image的一个子集。而gray_dilation是对图像Image进行膨胀,也就是变量是Image,而不是region。你可以这么理解region和image的区别,region基本上一个region就是一个灰度值,不存在什么所谓的灰度值差异,而image是由各种各样的灰度值组成的,有灰度值的差异。我们经常用到的opening_circle和closing_circle等开运算闭运算的算子是“二值图像形态学运算”,再回忆一下二值图像是什么,region是什么以及用threshold对图像进行阈值分割之后是不是得到一个region,这个时候图像就是一个二值图像,这个时候的膨胀和腐蚀就是你所理解的将一个region变粗或者变细了。而灰度值开运算和闭运算,也就是gray_opening和gray_closing其实是“灰度图像的形态学运算”。想想二值图像和灰度图像有什么区别?那么要理解灰度值开运算和闭运算,由于开运算是只先腐蚀再膨胀,而闭运算是先膨胀再腐蚀,所以必须先知道灰度值膨胀和灰度值腐蚀是什么意思。灰度值膨胀:我先说结果:原图像中被膨胀的区域的灰度值会相应地增大,所以也就对应着膨胀之后的图像更亮一些,原图像中那些暗一些的细节都会变小或消失,这主要取决于你所用的结构元素的大小。那么为什么会增大呢?这是因为膨胀的原理是取原图像和结构元素之和所包围的那一部分小邻域内的灰度值的最大值。还有这里的结构元素和二值图像中的元素也有本质的区别,这里的结构元素是带有灰度值信息的,也就是说即使你给定的是同样大小的圆,如果灰度值大小不一样,得到的结果也不一样。其实二值图像中的膨胀和这个道理也是一样的,原区域和结构元素相加,取相加之和所包围小邻域内的最大值,由于在二值的情况下,只有0和1,那么最大值自然就是1了,这就是你为什么会在二值图像的膨胀操作的情况下会看到原来的区域变得更大了的原因。其实这也可以理解成并不是区域变大了,而是这些点出原来的灰度值被变成了另外一种相反的灰度值,和我们所膨胀的区域的灰度值是一样的,所以才看起来和我们之前的区域连在一起成为一个区域了。那么你再想想把0,1两种情况扩展到0-255共256个情况的时候,会发生什么事情?为什么在这种情况下你看不到明显的区域变大或者变小的现象,甚至膨胀本来应该是变大,结果你看到一些线条反而变细甚至消失了?因为我们仍然实在修改灰度值,膨胀就是让处理的区域内的灰度值变大,如果原来的线条是黑色的,灰度值变大之后,可不就是黑色的减少了,看起来就像是线条变细了么?这下你明白了吧?其实是一个道理,只不过这里分成了256种灰度级,让人看起来变化更细微而已。灰度值腐蚀:把膨胀的过程反过来就是了。我想你肯定想到了,这种操作处理之后图像会变得比原来暗,亮的细节会被抑制。