引言:特征提取是缺陷检测和分类器的重要基础,由于网络资料匮乏,这个系列的贴子勇哥会长期更新,以充实其内容。
函数原型:
gray_projections(Region, Image:: Mode: HorProjection, VerProjection)
功能:
计算在水平和垂直方向的灰度值投影
当Mode = 'rectangle'时,
选取输入区域的任意方向的最小内接矩形,在其主轴方向上实现投影。即,水平投影方向对应大轴,垂直投影方向对应小轴。
参数列表:
第1个参数(in):所计算的区域
第2个参数(in):输入图像
第3个参数(in):模式
第4个参数(out):水平投影值
第5个参数(out):垂直投影值
这个算子计算在水平和垂直方向的灰度值投影。(可理解为记录每行、列的灰度平均值的数组,不同mode算法不同)
read_image(Image1, 'D:/分类器/t1.bmp') get_image_size(Image1, Width, Height) gen_rectangle1(Rectangle, 0, 0,Height,Width) gray_projections(Rectangle, Image1, 'simple', HorProjection, VertProjection)
测试图片宽高大小是288*354,因此水平投影HorProjection的X轴是0-353,垂直投影的VertProjection的X轴是0-287。
我们还看到垂直投影的函数图像跟图片中齿的轮廓比较近似。
来看一个简单的小例子:
用gray_projections分割图中的文字。(勇哥的车牌号)
read_image(Image1, 'd:/1833.png') get_image_size(Image1, Width2, Height2) gen_rectangle1(Rectangle2, 0, 0,Height2, Width2 ) gray_projections(Rectangle2, Image1, 'simple', HorProjection1, VertProjection1)
查阅VertProjection1,函数图像如下:
勇哥画了个分割示意图如下:
勇哥按上面的意图写了份自动拆分的代码如下:
read_image(Image1, 'd:/1833.png') get_image_size(Image1, Width2, Height2) gen_rectangle1(Rectangle2, 0, 0,Height2, Width2 ) gray_projections(Rectangle2, Image1, 'simple', HorProjection1, VertProjection1) *创建函数 create_funct_1d_array(VertProjection1,Function) *获取一维离散函数的x和y值 funct_1d_to_pairs(Function, XValues, YValues) *找灰度值比243大的YValues值 newYvalue:=find(sgn(YValues-243),1) *生成|newYvalue|个常量,值为107 tuple_gen_const(|newYvalue|, 107, Newtuple) *按点数组绘制region gen_region_points(Region, Newtuple, newYvalue) connection(Region, ConnectedRegions) *求出拆散后的region的中心位置 area_center(ConnectedRegions, Area, Row, Column) dev_set_draw('margin') dev_display(Image1) dev_display(ConnectedRegions) *显示拆分线 gen_rectangle1(Rectangle, [Row]-45, Column, [Row]+45, Column)
鄂字也被拆分成两部分了,有点搞笑。
在上面的代码中,我们学到下面的知识点:
(1)gray_projections的结果是可以被函数化处理的。
算子create_funct_1d_array,funct_1d_to_pairs可以方便的处理函数值。
(2)gray_projections的结果还可以被region化处理。
如算子gen_region_points。
(3)Sgn(number)
number 参数是任何有效的数值表达式。
返回值如果 number 大于0,则Sgn 返回1,等于0,返回0,小于0,则返回-1
(4)Find()
是在一个数值序列中找指定的值
(5)关联知识
勇哥再介绍一个和本例无关的知识点,因为和Sgn类似,是一种特殊的表达式,所以在此连带着介绍一下。
下面代码的作用是把一个region的内容生成灰度共生矩阵,然后从这个矩阵里挑出能量小于value的部分做为掩码,再把region中对应的部分选择出来。
cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast) Mask := Energy [<=] value select_mask_obj (Basins, outobj, Mask)
这么说太空洞,勇哥会后续写篇文章介绍一下,然后会把贴子连接更新上来。
从这个例子各位可以看到,halcon的表达式是相当的强大,可以以简洁的代码表示出复杂的意图。
勇哥网站还有另几篇类似的贴子,也是使用gray_projections和函数化算子来工作的。
例如:
这个例子是用来分割如下图所示的物料。
另一个例子:
是用来找无仿布料的竖线缺陷的。
最后……
勇哥的车牌号不是AC88888,我吹牛B了。
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

