halcon特征提取(三)基于统计方式:gray_projections

引言:特征提取是缺陷检测和分类器的重要基础,由于网络资料匮乏,这个系列的贴子勇哥会长期更新,以充实其内容。



函数原型:

gray_projections(Region, Image:: Mode: HorProjection, VerProjection)

 

功能:

计算在水平和垂直方向的灰度值投影

image.png


当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。

我们还看到垂直投影的函数图像跟图片中齿的轮廓比较近似。

image.png


来看一个简单的小例子:

用gray_projections分割图中的文字。(勇哥的车牌号)

image.png

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,函数图像如下:

image.png

勇哥画了个分割示意图如下:

image.png


勇哥按上面的意图写了份自动拆分的代码如下:


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)


鄂字也被拆分成两部分了,有点搞笑。

image.png


在上面的代码中,我们学到下面的知识点:

(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和函数化算子来工作的。

例如:

http://47.98.154.65/?id=581

这个例子是用来分割如下图所示的物料。

image.png


另一个例子:

http://47.98.154.65/?id=1279

是用来找无仿布料的竖线缺陷的。

image.png

image.png



最后……

勇哥的车牌号不是AC88888,我吹牛B了。

--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!



本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864