引言:特征提取是缺陷检测和分类器的重要基础,由于网络资料匮乏,这个系列的贴子勇哥会长期更新,以充实其内容。
函数原型:
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
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路



















