医工互联

 找回密码
 注册[Register]

手机动态码快速登录

手机号快速登录

微信登录

微信扫一扫,快速登录

QQ登录

只需一步,快速开始

查看: 507|回复: 0
收起左侧

halcon-通过视觉提取血管造影中血管并测量直径

[复制链接]

  在线 

发表于 2022-9-27 02:23:01 | 显示全部楼层 |阅读模式 <
1.血管造影

血管造影,是一种介入检测方法,将显影剂注入血管里。因为X光无法穿透显影剂,血管造影正是利用这一特性,通过显影剂在X光下所显示的影像来诊断血管病变的
1.1 原始图

032513pt7a7taxaqaiasit.png

1.2 处理后的图

(1)提取血管轮廓线

032513wa9gc7qalaa9iv0i.png

032513jq6kbbvp6dbbbbmk.png

 (2)直径测量

032514pj3c3di2w9hrh2qp.png

 
2.halcon实现代码

  1. *把其他显示窗更新关闭,一般放在开头
  2. dev_update_off ()
  3. *读取图片
  4. read_image (Angio, 'angio-part')
  5. *获取图片长宽
  6. get_image_size (Angio, Width, Height)
  7. *关闭窗口
  8. dev_close_window ()
  9. *新增显示窗口句柄
  10. dev_open_window (0, 0, Width, Height, 'black', WindowID)
  11. *设置显示模板
  12. set_display_font (WindowID, 14, 'mono', 'true', 'false')
  13. *显示图片
  14. dev_display (Angio)
  15. *显示字体
  16. disp_message (WindowID, 'Original image', 'window', 12, 12, 'black', 'true')
  17. *在荧幕上显示暂停程序继续操作的信息。
  18. disp_continue_message (WindowID, 'black', 'true')
  19. stop ()
  20. *根据要提取线的最大宽度以及对比度计算出lines_gauss算子输入的Sigma、Low、High值
  21. calculate_lines_gauss_parameters (8, [12,0], Sigma, Low, High)
  22. *检测线条以及其宽度
  23. lines_gauss (Angio, Lines, Sigma, Low, High, 'dark', 'true', 'parabolic', 'true')
  24. * 选择特定形状特征要求的xld轮廓或多边形
  25. select_contours_xld (Lines, RelLines, 'length', 5.0, 999, 0, 0)
  26. *设置多个输出颜色
  27. dev_set_colored (12)
  28. *显示图片
  29. dev_display (Angio)
  30. *显示检测的线条
  31. dev_display (RelLines)
  32. *显示消息
  33. disp_message (WindowID, 'Extracted lines', 'window', 12, 12, 'black', 'true')
  34. *在荧幕上显示暂停程序继续操作的信息。
  35. disp_continue_message (WindowID, 'black', 'true')
  36. stop ()
  37. *count_obj算子是用来计算输入区域中连通域的个数。
  38. count_obj (RelLines, Number)
  39. *对xld进行排序, 以外接矩形的相应顶点(左上,右上,左下,右下)为排序点,true时升序,false降序
  40. sort_contours_xld (RelLines, RelLines, 'lower_left', 'true', 'row')
  41. *创建一个空的object
  42. gen_empty_obj (PrintedLines)
  43. *遍历所有检测的线
  44. for I := 1 to Number by 1
  45.     dev_display (Angio)
  46.     dev_set_color ('white')
  47.     dev_display (PrintedLines)
  48.    
  49.     *选择索引
  50.     select_obj (RelLines, Line, I)
  51.     dev_set_color ('green')
  52.     dev_display (Line)
  53.    
  54.     *把两个区域连接在一起
  55.     concat_obj (PrintedLines, Line, PrintedLines)
  56.     *返回XLD轮廓(contour)的坐标
  57.     get_contour_xld (Line, Row, Col)
  58.     meanRow := sum(Row) / |Row|
  59.     meanCol := sum(Col) / |Col|
  60.     get_contour_attrib_xld (Line, 'width_left', WidthL)
  61.     get_contour_attrib_xld (Line, 'width_right', WidthR)
  62.     get_contour_attrib_xld (Line, 'contrast', Contrast)
  63.    
  64.     *
  65.     meanContrast := sum(Contrast) / |Contrast|
  66.     * To display the lines widths, the point at which the gray value drops
  67.     * to 25% of the contrast between the line and the background will be
  68.     * displayed.  This point is given by sqrt(3/4) for the parabolic line
  69.     * model.
  70.     Diameter := (WidthL + WidthR) * sqrt(0.75)
  71.     Diam := sum(Diameter) / |Diameter|
  72.     if (meanRow > Height - 50)
  73.         disp_message (WindowID, 'diam: ' + Diam, 'image', Height - 70, meanCol, 'yellow', 'false')
  74.     else
  75.         disp_message (WindowID, 'diam: ' + Diam, 'image', meanRow, meanCol, 'yellow', 'false')
  76.     endif
  77.     disp_message (WindowID, 'Diameters of line segments', 'window', 135, 60, 'black', 'true')
  78.     if (I < 5)
  79.         disp_continue_message (WindowID, 'black', 'true')
  80.         stop ()
  81.     else
  82.         wait_seconds (0.2)
  83.     endif
  84. endfor
  85. dev_update_on ()
复制代码
3.核心函数讲解

3.1 calculate_lines_gauss_parameters


calculate_lines_gauss_parameters( : : MaxLineWidth, Contrast : Sigma, Low, High)
(1)功能


根据要提取线的最大宽度以及对比度计算出lines_gauss算子输入的Sigma、Low、High值。
(2)参数列表


MaxLineWidth (input_control) : lines_gauss要提取线条的最大宽度
Contrast (input_control) :lines_gauss要提取线的对比度。Contrast 值不仅可以一个,也可以为两个。当值为两个时,数组中的第二个值是要提取线的最小对比度,并且其值不能大于第一个值。比如:[20,10]
Sigma (output_control) :获取用于lines_gauss输入的Sigma值
Low (output_control):获取用于lines_gauss输入的Low 值
High (output_control) :获取用于lines_gauss输入的High 值
(3)详解


对于参数Contrast 需要说明的是,如果只选择一个值时,最小对比度将会默认为最大对比度的1/3,最小对比度越小,线条将会延伸到对比度较低的区域,即线条越长。反之,值越高,线条越短,但越突出。
lines_gauss算子用到的滞后阈值方法中的Low、High值是根据线的最大宽度以及对比度(两个高低对比度)计算得出的。

3.2 lines_gauss


(1)原型



lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )
功能
检测线条以及其宽度。
(2)参数列表


Image (input_object) :输入图像
Lines (output_object) :检测线条(XLD)
Sigma (input_control) :高斯滤波值
Low (input_control) :滞后阈值分割的低阈值
High (input_control) :滞后阈值分割的高阈值
LightDark (input_control) :提取线条类型( ‘dark’,‘light’)
ExtractWidth (input_control) :是否提取线宽(‘false’,‘true’)
LineModel (input_control) :用来调整线条位置和宽度的线模型(‘bar-shaped’, ‘gaussian’, ‘none’, ‘parabolic’)
CompleteJunctions (input_control) :在断连的部分是否添加节点使线条连续(‘false’, ‘true’)
(3)详解


lines_gauss 主要功能是提取图像上的线条,提取的结果属于亚像素精度的XLD轮廓。
参数LightDark 其实就是让你选择你要提取线条的类型,暗色还是亮色,选’dark’, ‘light’。
参数ExtractWidth是否提取每条XLD轮廓线的线宽,true提取,false不提取。
参数LineModel 如果选择 除’none’以外的参数,lines_gauss算子会补偿非对称线条(即在线条的中心两侧有不同对比度的线条),来校正提取出的线条的位置和宽度。用于校准的线模型有’bar-shaped’, ‘gaussian’, ‘none’, ‘parabolic’四种。线模型’bar-shaped’适用于大多数应用;如果管状物体采用背光方式打光(比如血管的X光图像),提取线条可以使用’gaussian’, 'parabolic’模型;’parabolic’模型常用来提取边缘比较锐利的线条(比如采用背光照明图像中的线条);’gaussian’则用来提取边缘相对不那么锐利的线条。只有将ExtractWidth设置为true时,参数LineModel才有意义。
由于微分几何算法的原因,线提取器(lines_gauss)不能提取出所有线段结合点,当CompleteJunctions 设置为true时,lines_gauss试图通过不同算法提取出那些被遗漏的节点。
 

来源:https://blog.csdn.net/thehappysheep/article/details/120755120
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

提醒:禁止复制他人回复等『恶意灌水』行为,违者重罚!
您需要登录后才可以回帖 登录 | 注册[Register] 手机动态码快速登录 微信登录

本版积分规则

发布主题 快速回复 收藏帖子 返回列表 客服中心 搜索
简体中文 繁體中文 English 한국 사람 日本語 Deutsch русский بالعربية TÜRKÇE português คนไทย french

QQ|RSS订阅|小黑屋|处罚记录|手机版|联系我们|Archiver|医工互联 |粤ICP备2021178090号 |网站地图

GMT+8, 2024-9-20 00:04 , Processed in 0.272825 second(s), 61 queries .

Powered by Discuz!

Copyright © 2001-2023, Discuz! Team.

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