设置首页收藏本站
开启左侧

halcon提取网状物

[复制链接]
UKimiF 发表于 2025-9-17 10:28:14 | 显示全部楼层
楼上有佬用空间域频域互转的方式去实现,这里我就用纯形态学和几何辅助的方式去抓边,代码如下:
  1. read_image (Image, './锯片.png')
  2. *//预处理
  3. set_system ('clip_region', 'false')
  4. get_image_size (Image, Width, Height)
  5. decompose3 (Image, R, G, B)
  6. trans_from_rgb (R, G, B, H, null, null, 'hsv')

  7. *//获得有效区域
  8. threshold (H, RegionB, 0, 60)
  9. connection (RegionB, RegionB)
  10. select_shape_std (RegionB, RegionB, 'max_area', 70)
  11. fill_up_shape (RegionB, RegionB, 'area', 1, 500)
  12. fill_up (RegionB, RegionBF)
  13. difference (RegionBF, RegionB, RegionInHole)
  14. smallest_circle (RegionInHole, Row, Column, Radius)
  15. gen_circle (RegionInHole, Row, Column, Radius)
  16. difference (RegionB, RegionInHole, RegionB)
  17. opening_circle (RegionBF, RegionBF, 3.5)

  18. *//预处理
  19. scale_image (H, H, 1.5, 0)
  20. mean_image (H, ImageD, 3, 3)

  21. *//动态阈值分割
  22. mean_image (ImageD, ImageDM, 25, 25)
  23. dyn_threshold (ImageD, ImageDM, RegionD, 1, 'light')
  24. intersection (RegionD, RegionB, RegionD)
  25. opening_circle (RegionD, RegionD, 1.5)
  26. connection (RegionD, RegionD)
  27. select_shape (RegionD, RegionD, 'area', 'and', 50, 9999999)
  28. union1 (RegionD, RegionD)

  29. *//补偿区域
  30. ang:=30
  31. gen_rectangle2 (RectSEHor, Height/2, Width/2, rad(ang), 3, 0.75)
  32. closing (RegionD, RectSEHor, RegionD1)
  33. gen_rectangle2 (RectSEVer, Height/2, Width/2, rad(90+ang), 5, 0.75)
  34. closing (RegionD1, RectSEVer, RegionD2)

  35. *//获得有效洞口区域
  36. fill_up (RegionD2, RegionD2F)
  37. difference (RegionD2F, RegionD2, RegionHole)
  38. connection (RegionHole, RegionHole)
  39. select_shape (RegionHole, RegionHole, ['area','rectangularity'], 'and', [260,0.6], [1500,1])
  40. closing_circle (RegionHole, RegionHole, 5.5)
  41. opening_circle (RegionHole, RegionHole, 3.5)
  42. select_shape (RegionHole, RegionHole, ['rect2_len1','rect2_len2'], 'and', [0,0], [10.5,10.5])
  43. union1 (RegionHole, RegionHole)

  44. *//横向处理
  45. *网格间距
  46. BTDisMin:=22
  47. BTDisMax:=30
  48. *//获得横向连接区域
  49. gen_rectangle2 (RectSEHor, Height/2, Width/2, rad(ang), 20, 0.5)
  50. closing (RegionHole, RectSEHor, RegionHoleH)
  51. connection (RegionHoleH, RegionHoleH)
  52. *//排序每列只取最左侧区域
  53. area_center (RegionHoleH, Area, RowHoleH, ColHoleH)
  54. select_shape_std (RegionHoleH, RegionHoleHM, 'max_area', 70)
  55. smallest_rectangle2 (RegionHoleHM, Row1, Col1, Phi, L1, L2)
  56. hom_mat2d_identity (HomMat2DI)
  57. hom_mat2d_rotate (HomMat2DI, -Phi, Row1, Col1, HomMat2DR)
  58. affine_trans_pixel (HomMat2DR, RowHoleH, ColHoleH, RowHoleHAF, ColHoleHAF)
  59. tuple_sort_index (RowHoleHAF, SortIdx)
  60. tuple_sort (RowHoleHAF, RowHoleHAF)
  61. *//计算行间距
  62. tuple_select (RowHoleHAF, [0:|RowHoleHAF|-2], RowHoleHAF1)
  63. tuple_select (RowHoleHAF, [1:|RowHoleHAF|-1], RowHoleHAF2)
  64. HDiff:=RowHoleHAF2-RowHoleHAF1
  65. if(HDiff[|HDiff|-1]>BTDisMax)
  66. else
  67.     HDiff[|HDiff|]:=(BTDisMin+BTDisMax)/2
  68. endif
  69. tuple_select_by_range (HDiff, BTDisMin, BTDisMax, Idx)
  70. tuple_select (SortIdx, Idx, SortIdxS)
  71. *//得到筛选后的区域
  72. select_obj (RegionHoleH, RegionHoleH, SortIdxS+1)
  73. *//计算每一列的间距位
  74. smallest_rectangle2 (RegionHoleH, RowH, ColH, PhiH, L1H, L2H)
  75. tuple_gen_const (|RowH|, Phi, PhiH)
  76. gen_rectangle2 (RectH, RowH, ColH, PhiH, L1H+9999, L2H)
  77. union1 (RectH, RectH)
  78. difference (RegionBF, RectH, RectH)
  79. connection (RectH, RectH)
  80. sort_region (RectH, RectH, 'first_point', 'true', 'row')
  81. count_obj (RectH, Number)
  82. select_obj (RectH, RectH, [2:Number-1])
  83. difference (RectH, RegionInHole, RectH)
  84. skeleton (RectH, RectH)

  85. *//纵向处理
  86. *//获得纵向连接区域
  87. gen_rectangle2 (RectSEVer, Height/2, Width/2, rad(90+ang), 20, 0.5)
  88. closing (RegionHole, RectSEVer, RegionHoleV)
  89. connection (RegionHoleV, RegionHoleV)
  90. *//排序每行只取最左侧区域
  91. area_center (RegionHoleV, Area, RowHoleV, ColHoleV)
  92. select_shape_std (RegionHoleV, RegionHoleVM, 'max_area', 70)
  93. smallest_rectangle2 (RegionHoleVM, Row1, Col1, Phi, L1, L2)
  94. hom_mat2d_identity (HomMat2DI)
  95. hom_mat2d_rotate (HomMat2DI, -Phi, Row1, Col1, HomMat2DR)
  96. affine_trans_pixel (HomMat2DR, RowHoleV, ColHoleV, RowHoleVAF, ColHoleVAF)
  97. tuple_sort_index (RowHoleVAF, SortIdx)
  98. tuple_sort (RowHoleVAF, RowHoleVAF)
  99. *//计算行间距
  100. tuple_select (RowHoleVAF, [0:|RowHoleVAF|-2], RowHoleVAF1)
  101. tuple_select (RowHoleVAF, [1:|RowHoleVAF|-1], RowHoleVAF2)
  102. HDiff:=RowHoleVAF2-RowHoleVAF1
  103. if(HDiff[|HDiff|-1]>BTDisMax)
  104. else
  105.     HDiff[|HDiff|]:=(BTDisMin+BTDisMax)/2
  106. endif
  107. tuple_select_by_range (HDiff, BTDisMin, BTDisMax, Idx)
  108. tuple_select (SortIdx, Idx, SortIdxS)
  109. *//得到筛选后的区域
  110. select_obj (RegionHoleV, RegionHoleV, SortIdxS+1)
  111. *//计算每一行的间距位
  112. smallest_rectangle2 (RegionHoleV, RowV, ColV, PhiV, L1V, L2V)
  113. tuple_gen_const (|RowV|, Phi, PhiV)
  114. gen_rectangle2 (RectV, RowV, ColV, PhiV, L1V+9999, L2V)
  115. union1 (RectV, RectV)
  116. difference (RegionBF, RectV, RectV)
  117. connection (RectV, RectV)
  118. sort_region (RectV, RectV, 'first_point', 'true', 'column')
  119. count_obj (RectV, Number)
  120. select_obj (RectV, RectV, [2:Number-1])
  121. difference (RectV, RegionInHole, RectV)
  122. skeleton (RectV, RectV)

  123. dev_clear_window ()
  124. dev_display (Image)
  125. dev_display (RectH)
  126. dev_display (RectV)
复制代码
效果1.png
效果2.png
效果3.png
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复 支持 3 反对 0

使用道具 举报

大凡光学,专注标定板提供
Mr.Han 发表于 2025-9-18 14:47:35 | 显示全部楼层

这个是用的什么滤波器啊
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
testway1022 发表于 2025-9-19 15:46:41 | 显示全部楼层
UKimiF 发表于 2025-9-17 10:28
楼上有佬用空间域频域互转的方式去实现,这里我就用纯形态学和几何辅助的方式去抓边,代码如下:

...
一个很好的思路,感谢不吝分享!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
nousstar 发表于 2025-9-25 09:25:07 | 显示全部楼层
UKimiF 发表于 2025-9-17 10:28
楼上有佬用空间域频域互转的方式去实现,这里我就用纯形态学和几何辅助的方式去抓边,代码如下:

...

你这代码中有自定义算子吧
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
UKimiF 发表于 2025-9-25 10:48:00 | 显示全部楼层
nousstar 发表于 2025-9-25 09:25
你这代码中有自定义算子吧

有的,不过都是很简单的
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
panwang666 发表于 2025-9-25 14:30:24 | 显示全部楼层
向大神学习
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
347784474 发表于 2025-9-29 14:37:58 | 显示全部楼层
求大佬代码
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
holybang 发表于 2025-10-8 09:58:38 | 显示全部楼层
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
testway1022 发表于 2025-10-9 10:51:40 | 显示全部楼层
holybang 发表于 2025-9-16 14:18
2025年10月7日更新
最初发的图,因为是基于C++的算法库自己跑出来的,没有第一时间分享halcon的实现。现在 ...

话说我上回就您上一次评论分享的图片,尝试了一下实现代码,也是很难得到一样的效果图,哈哈哈哈哈我得赶紧试试,以解心头之惑,感谢不吝赐教!
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
holybang 发表于 2025-10-12 13:06:10 | 显示全部楼层
testway1022 发表于 2025-10-9 10:51
话说我上回就您上一次评论分享的图片,尝试了一下实现代码,也是很难得到一样的效果图,哈哈哈哈哈我得赶 ...

有问题欢迎继续交流,大家一起提升
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表