Halcon边缘检测和线条检测(1),文章含自适应动态二值化等算子

更新时间:2023-07-18 22:25:40 阅读: 评论:0

Halcon边缘检测和线条检测(1),⽂章含⾃适应动态⼆值化
等算⼦
先看代码实践
dev_update_off ()
dev_clo_window ()
*读图
read_image (Image, 'D:/1.bmp')
get_image_size (Image, Width, Height)
*测试提取边缘
edges_image(Image,Amp,Dir,'lanr2',0.5,'none',-1,-1)
hysteresis_threshold(Amp,Margin,20,30,30)
*彩⾊转灰度图
count_channels (Image, Channels)
if (Channels == 3)
rgb1_to_gray (Image, GrayImage)
*真彩⾊转灰度图
elif (Channels == 4)
decompo4 (Image, ImageR, ImageG, ImageB, ImageA)
compo3 (ImageR, ImageG, ImageB, MultiChannelImage)
rgb1_to_gray (MultiChannelImage, GrayImage)
endif
*显⽰图
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
t_display_font (WindowHandle, 16, 'mono', 'true', 'fal')
dev_display (Image)
*⾃适应⼆值化
median_image (Image, Median, 'circle', 3, 'mirrored')
auto_threshold(Median, Regions, 2)
*动态⼆值化
D := 100
mean_image(Image, Mean, D*2+1, D*2+1)
dyn_threshold(Image, Mean, Seg, 5, 'light')
regiongrowing (Image, Regions, 1, 1, 6, 1)
gen_contour_region_xld (Regions, Contours, 'border')
*threshold_sub_pix只能取外轮廓
threshold_sub_pix(Image, Border, 128)
derivate_gauss(Image,Laplace,3,'laplace')
zero_crossing_sub_pix(Laplace,ZeroCrossings)
*测试soble
sobel_amp (Image, EdgeAmplitude1, 'thin_max_abs', 5)
sobel_amp (GrayImage, EdgeAmplitude2, 'thin_max_abs', 5)
*图像的“边缘”指的是:图像中灰度有明显跳变的地⽅。如果在图中画⼀条“有⼀定宽度的线”,那么线的两侧应该都可以提取到边缘。
*⽽线条提取的算⼦(例如lines_gauss)提取的是这条“有⼀定宽度的线”的“⾻架线”,它⼀般只有⼀根。
*提取⾻架线条
MaxLineWidth := 10中华五岳
Contrast := 20
calculate_lines_gauss_parameters (MaxLineWidth, Contrast, Sigma, Low, High)
lines_gauss (GrayImage, Lines, Sigma, Low, High, 'dark', 'true', 'parabolic', 'true')
f的笔顺怎么写count_obj (Lines, Number)
* lines_gauss (GrayImage, Lines, 2.3, 0.0, 0.7, 'dark', 'true', 'parabolic', 'true')
*亚像素提取边缘
*Alpha数值越⼤,轮廓越圆滑
edges_sub_pix (GrayImage, Edges1, 'canny', 1, 3, 5)
*edges_sub_pix (GrayImage, Edges2, 'canny_junctions', 1, 5, 10)
*edges_sub_pix (GrayImage, Edges3, 'lanr1', 0.5, 20, 40)
*edges_sub_pix (GrayImage, Edges4, 'lanr2', 0.5, 20, 40)
*edges_sub_pix (GrayImage, Edges5, 'deriche1', 0.5, 20, 40)
*edges_sub_pix (GrayImage, Edges6, 'deriche2', 0.5, 20, 40)
*edges_sub_pix (GrayImage, Edges7, 'shen', 0.5, 20, 40)
*edges_sub_pix (GrayImage, Edges8, 'mshen', 0.5, 20, 40)
*edges_sub_pix (GrayImage, Edges9, 'sobel', 0.5, 20, 40)
旅顺火车站*合并邻近的XLD,使得细⼩线段拼接起来
*lect_contours_xld (Edges1, SelectedContours, 'contour_length', 5, 99999, -0.5, 0.5)
union_adjacent_contours_xld (Edges1, UnionContours, 5, 1, 'attr_keep')
*根据轮廓特征选择XLD
*这个算⼦⽤到的轮廓特征如下:contour-length轮廓长度,direction轮廓回归线⽅向,⽤参数min1,max1;*curvature曲率,轮廓XLD到回归线的平均距离和标准差各有范围选择,平均距离使⽤参数min1,max1;*标准差使⽤min2,max2,条件是在两参数的⼤⼩范围之内。
lect_contours_xld (UnionContours, SelectedContours, 'contour_length', 10, 99999, -0.5, 0.5)
*clo_contours_xld(SelectedContours, ClodContours)
count_obj(SelectedContours, NumberContours)
stop()
for i := 1 to NumberContours by 1
lect_obj (SelectedContours, ObjectSelected, i)
length_xld (ObjectSelected, Length)
*计算xld的⾯积以及中⼼位置
area_center_xld(ObjectSelected, area, row, column, PointOrder)
get_contour_xld (ObjectSelected, row, col)
endfor
dev_t_color ('green')
dev_display (Image)
dev_display (Lines)
dev_display (Edges1)
stop()
*测试彩⾊
edges_color_sub_pix (Image, EdgesColor, 'canny', 1, 5, 10)
dev_display (Image)
dev_t_color ('blue')
dev_display (EdgesColor)
*测试HSV
decompo3(Image, r, g, b)
trans_from_rgb(b, g, r, h, s, v, 'hsv')
Sigma := 4
auto_threshold (h, Region1, Sigma)
auto_threshold (s, Region2, Sigma)
auto_threshold (v, Region3, Sigma)
edges_sub_pix (r, Edge1, 'canny', 1, 2, 5)
edges_sub_pix (g, Edge2, 'canny', 1, 2, 5)
edges_sub_pix (b, Edge3, 'canny', 1, 2, 5)
edges_sub_pix (h, Edge4, 'canny', 1, 2, 5)
edges_sub_pix (s, Edge5, 'canny', 1, 2, 5)
edges_sub_pix (v, Edge6, 'canny', 1, 2, 5)
stop ()
谈话笔录再看理论知识:
⼀、边缘提取
随风而来的玛丽阿姨1、设置ROI兴趣区域
2、快速⼆值化,并连接相邻区域。
这样做的⽬的是进⼀步减少⽬标区域,通过⼆值化将⽬标区域⼤概轮廓提取出来
3、提取最接近⽬标区域的轮廓
常⽤函数有boundary,gen_contour_region_xld
4、根据⾃⼰的需求提取需要的初步轮廓
诗词文章5、将初步提取的初步轮廓进⾏膨胀操作
6、将膨胀后的区域和原图进⾏减操作(在这步之前有可能需要对原图进⾏⾼斯滤波)。这样就能得到只有边缘的真实图像
7、⽤canny或其他算⼦(根据需要)提取亚像素轮廓,⼀般使⽤edges_sub_pix函数
8、处理和计算
得到真实的边缘XLD后你可能需要进⼀步处理得到你想要的线、弧等。
你可能⽤到的函数gment_contours_xld(分割)  union_collinear_contours_xld(联合相邻或相同⾓度直
线)lect_contours_xld(提取想要的轮廓) union_cocircular_contours_xld(联合相同圆)等等
得到轮廓后如果你不知道怎么处理后得到你想要的东西(线、弧、圆、⾓、矩形)你都可以将轮廓转化为点,然后⽤点集合来拟合任何你想要的东西。
⼆、BLOB分析检测(前⾯⼀篇有详细讲解,本骗只讲思路)
(1)应⽤ROI,可以使Blob分析加速。
(2)匹配ROI区域或图像,详将GUIDEIIB以形状为基础的匹配。
(3)校正图像<;经常⽤来去除镜头畸变或把图像转换到参考点视⾓,如双⽬视觉时的图像校正>
(4)图像前处理
(5)引⽤分割参数
(6)分割图像
(7)区域处理
(8)特征提取
(9)把提取的结果转换到世界坐标中
(10)结果可视化。
相机的标定和矫正不在本篇的学习之中。直接讲提取BLOB
1、⼀般先使⽤均值滤波去噪
2、利⽤去噪图像与平滑图像的OFFSET提取区域边缘,常见函数dyn_threshold
3、提取连通域dyn_threshold
4、根据形状或是灰度等特征来提取你想要的blob。
另⼀种⽅法就是分⽔岭算法
watersheds (ImageGauss, Basins, Watersheds)/
1、对图像进⾏⾼斯滤波
还有的图形更简单直接⼆值化就可以啦
bin_threshold (Fin, Dark) //分割图像,输出Dark区域,Fin已经被处理为区域//
difference (Fin, Dark, Background) //计算Fin与Dark两个区域的补集//
还有个函数应该说是让你⾼兴还是沮丧呢,以为⼀个函数就可以直接提取你想要的,但是参数很难调整
lines_gauss(Image, Lines, 6, 0.3, 0.5, 'light', 'true', 'gaussian', 'true')
三、赃物检测
1、得到两个不同⾼斯标准差的⾼斯积卷
2、对原始图像进⾏傅⾥叶变换'to_fre'
3、⽤之前的积卷对图像做积卷滤波
4、傅⾥叶反变换‘from_fre’
⼆值化算⼦与例程
auto_threshold
dyn_threshold
var_threshold
binary_threshold
fast_threshold
fast_threshold_vs_threshold
柳树造句histo_to_thresh
local_threshold
threshold
threshold_sub_pix
C:\Urs\Public\Documents\MVTec\HALCON-19.11-Progress\examples\hdevelop\Segmentation\Threshold Halcon中实现Otsu 算法
Halcon算⼦学习:图像阈值分割-threshold、binary_threshold、dyn_threshold算⼦
1.threshold-全局固定阈值分割
2.Binary Threshold-⾃动全局阈值分割
3.dyn_threshold-局部动态阈值分割
4.var_threshold算⼦-均值和标准偏差局部阈值分割
5.dual_threshold-双重阈值分割(有符号图像的阈值算⼦)
6.auto_threshold-⾃动全局阈值分割
7.fast_threshold-快速全局阈值分割
8.watersheds-分⽔岭算法分割
---
参考⽂章:
官⽅⾃带的例⼦:measure_grid.hdev lines_gauss.hdev
edge_gments.hdev rim_simple.hdev
sort_contours_xld.hdev
>唯美古风句子

本文发布于:2023-07-18 22:25:40,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1086922.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:提取   图像   轮廓   区域   分割
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图