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

halcon提取网状物

[复制链接]
gaga1012 发表于 2025-9-16 09:08:23 | 显示全部楼层 |阅读模式
求助,怎么提取锯片上的网状物,颜色很接近,而且很密集,阈值分割有很多干扰
锯片.png
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
大凡光学,专注标定板提供
小马哥 发表于 2025-9-16 10:59:15 | 显示全部楼层
打光 打光 打光 打光
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
holybang 发表于 2025-9-16 14:18:50 | 显示全部楼层
本帖最后由 holybang 于 2025-10-7 11:29 编辑

2025年10月7日更新
最初发的图,因为是基于C++的算法库自己跑出来的,没有第一时间分享halcon的实现。现在跟大家分享halcon代码如下
  1. * 1. 读取彩色图片
  2. read_image (Image, '输入图片路径')

  3. * 2. 简单降噪一下并转换为HSV颜色空间并提取H通道
  4. gauss_filter (Image, ImageGaussed, 5)
  5. decompose3(ImageGaussed, ImageR, ImageG, ImageB)
  6. trans_from_rgb (ImageR, ImageG, ImageB, ImageH, ImageS, ImageV, 'hsv')

  7. * 3. 对H通道进行局部自适应拉伸,增强局部对比度
  8. convert_image_type(ImageH, ImageH_real, 'real')
  9. gen_image_proto (ImageH_real, ImageP3, 3)
  10. gen_image_proto (ImageH_real, ImageScale, 255.0/6.0)

  11. mean_image (ImageH_real, ImageMean, 31, 31)
  12. sub_image (ImageMean, ImageP3, ImageH_LB, 1, 0)

  13. sub_image(ImageH_real, ImageH_LB, ImageH1, 1, 0)
  14. mult_image(ImageH1, ImageScale, ImageEnhanced, 1.0, 0)

  15. threshold(ImageEnhanced, RegionBZ, -100000, 0)
  16. overpaint_region (ImageEnhanced, RegionBZ, 0, 'fill')

  17. threshold(ImageEnhanced, Region255, 255, 100000)
  18. overpaint_region(ImageEnhanced, Region255, 255, 'fill')

  19. * 4. 获得增强对比度之后的H通道的频谱图
  20. fft_generic (ImageEnhanced, HFFT, 'to_freq', -1, 'none', 'dc_center', 'complex')
  21. power_ln (HFFT, HFFT_ln)

  22. * 5. 将频谱图最大最小归一化到0-255
  23. get_image_size(Image, Width, Height)
  24. gen_rectangle1(ImageEntireReg, 0, 0, Width, Height)
  25. min_max_gray(ImageEntireReg, HFFT_ln, 0, Min, Max, Range)
  26. scale_image_range(HFFT_ln, HFFT_ln_scaled, Min, Max)
  27. convert_image_type (HFFT_ln_scaled, HFFT_ln_8u, 'byte')

  28. * 6. 对频谱图简单降噪一下
  29. gauss_filter (HFFT_ln_8u, GaussFiltered, 3)

  30. * 7. 自适应阈值处理,得到频谱局部极值点的region,因为图中要增强的网格特征是一种重复纹理,所以频谱图上一定会表现为距离相等的一些极值点
  31. local_threshold(GaussFiltered, img_thresh, 'adapted_std_deviation', 'light', ['mask_size', 'scale'], [61, 0.35])

  32. * 8. 对频谱极值点区域进行形态学膨胀
  33. dilation_circle (img_thresh, Dilated, 2.5)

  34. * 9. 保留面积<100的区域,期望丢弃频谱图中面积比较大的区域,因为网格纹理对应的频谱极值点一定都会比较小
  35. connection (Dilated, ConnectedRegions)
  36. select_shape (ConnectedRegions, SmallRegions, 'area', 'and', 0, 100)

  37. * 10. 将区域转换成real类型的蒙版图像,因为后续要将区域作为频域滤波器使用,所以也得做最大最小归一化
  38. region_to_bin(SmallRegions, ImageMaskFiltered, 255, 0, Width, Height)
  39. convert_image_type(ImageMaskFiltered, ImageMaskFiltered, 'real')
  40. min_max_gray(ImageEntireReg, ImageMaskFiltered, 0, Min, Max, Range)
  41. scale_image(ImageMaskFiltered, ImageMaskFiltered, 1.0/Max, 0)

  42. * 11. 应用自定义蒙版图像作为滤波器
  43. convol_fft (HFFT, ImageMaskFiltered, ImageComplex)

  44. ****** 为了可视化ImageComplex ******
  45. power_ln (ImageComplex, ImageComplex_ln)
  46. connection(SmallRegions, ConnectedSmallRegions)
  47. union1 (SmallRegions, RegionUnion)
  48. min_max_gray(RegionUnion, ImageComplex_ln, 0, Min, Max, Range)
  49. scale_image_range(ImageComplex_ln, ImageComplex_ln_scaled, Min, Max)
  50. convert_image_type (ImageComplex_ln_scaled, ImageComplex_ln_scaled_8u, 'byte')
  51. ****** 为了可视化ImageComplex ******

  52. * 12. 逆傅里叶变换得到增强网格后的H通道
  53. fft_generic(ImageComplex, ImageResult, 'from_freq', 1, 'none', 'dc_center', 'real')

  54. * 保存结果
  55. min_max_gray(ImageEntireReg, ImageResult, 0, Min, Max, Range)
  56. scale_image(ImageResult, ImageResult, 255.0/(Max-Min), -255.0*Min/(Max-Min))
  57. convert_image_type(ImageResult, ImageResult, 'byte')
  58. write_image(ImageResult, 'png', 0, 'result.png')
复制代码




halcon结果

halcon结果

这是以上halcon代码保存下来的result.png的效果,和最初的C++的效果基本一致,我略有改进所以结果还更好了一点。

总体思路是:

1. 由于是彩色图片,总是先观察哪个通道的图能够以最小的噪声凸显最明显的纹理(对应代码中的ImageH)

色度通道

色度通道


2. 由于原图亮度和对比度都不均匀,所以尝试了使用局部自适应拉伸来增强色度通道的对比度,如下图所示(对应代码中的ImageEnhanced)
image_enhanced.png

3. 由于2的结果ImageEnhanced依旧不够好,所以考虑使用纹理增强中常见的频域方法,这个图片中重复的小方格纹理特征对应到频谱图上就是一系列距离相等的亮点(如下图所示,对应代码中的HFFT_ln),因此接下来就是设法保留频谱图上的这些间距相等的小亮点,去掉其他频率的能量
hfft.png

4. 对ImageEnhanced进行傅里叶变换,得到频谱图HFFT,通过归一化和一些基础的图像处理套路,得到小亮点的区域,如下图(对应代码中的SmallRegions)
mask_filter.png

5. 基于这些小亮点区域,对频谱图进行卷积之后,得到(对应的代码中的ImageComplex_ln_scaled_8u)
image_complex.png

6. 最后,将步骤5得到的频谱图转换回到空域,即可得到最终结果(对应代码中的ImageResult)


有问题欢迎交流

以下是最初发的帖子内容


色度通道
hue_fft_20250916_141702_076212900.png
色度通道频域图
hue_fft_filter_20250916_141752_693001400.png
色度通道频域滤波结果

频域处理后

频域处理后

色度通道重建最终结果

以上类似效果可以吗?





点评

可以分享一下代码吗 想学习一  发表于 2025-9-29 14:40
可以分享一下代码吗 想学习一下  发表于 2025-9-17 16:59
大佬太猛了  发表于 2025-9-17 16:58
厉害啊,学习学习  发表于 2025-9-16 17:02
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
回复 支持 2 反对 0

使用道具 举报

myhalcon0806 发表于 2025-9-16 16:08:26 | 显示全部楼层

技术杠杠的,大哥牛逼
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
暗翼小哥 发表于 2025-9-16 16:29:36 | 显示全部楼层

大佬,你说的这个色度通道具体是指哪个通道?

点评

已更新的代码  发表于 2025-10-7 11:32
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| gaga1012 发表于 2025-9-16 18:05:14 | 显示全部楼层

非常可以,有代码吗,借鉴借鉴
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| gaga1012 发表于 2025-9-16 18:26:28 | 显示全部楼层
暗翼小哥 发表于 2025-9-16 16:29
大佬,你说的这个色度通道具体是指哪个通道?

没猜错应该是HSV通道的H通道
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
暗翼小哥 发表于 2025-9-17 08:42:59 | 显示全部楼层
gaga1012 发表于 2025-9-16 18:26
没猜错应该是HSV通道的H通道

好的,谢谢指点。我试试
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
天才的狂想 发表于 2025-9-17 08:44:20 | 显示全部楼层
66666666666
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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