Halcon图像预处理、阈值分割

1、blob(Binary Large Object)是指二值图像中连通区域。

预处理通常包括一系列步骤,例如去噪、形态学操作、特征提取等。

read_image(Image,'claudia')
get_image_size(Image,Width,Height)
dev_open_window_fit_size (0, 0, Width, Width, -1, -1, WindowHandle)
dev_display(Image)* 高斯分布
gauss_distribution (60, Distribution)
* 添加高斯噪声分布
add_noise_distribution (Image, ImageNoise, Distribution)* 生成图像(保存到本地)这里保存的使‘bmp’格式的图片,第三个参数是保存的路径
* 生成图像保存到本地
* 参数一:句柄
* 参数二:保存的图片格式
* 参数三:保存的路径
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/高斯噪声')* 均值平滑 (对图像进行平均滤波处理,以降低图像中的噪声。)
* 参数一:原始图像
* 参数二:输出图像
* 参数三、四:计算局部均值时使用的窗口的宽高
mean_image (ImageNoise, ImageMean, 5,5)
dump_window (WindowHandle, 'bmp', 'D:/Halcon课程/绘制图形/均值平滑')* 中值滤波
* 参数一:输入图像,
* 参数二:输出图像,
* 参数三:滤波器形状(圆circle、正方形square)
* 参数四:尺寸,
* 参数五:'mirrored' 表示边缘处理方式,当窗口超出图像边界时,使用镜像方式进行处理
median_image (ImageMean, ImageMedian, 'circle', 1, 'mirrored')
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/中值滤波1')median_image (ImageMean, ImageMedian, 'square', 5, 'mirrored')
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/中值滤波5')median_image (ImageMean, ImageMedian, 'square', 7, 'mirrored')
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/中值滤波7')* 椒盐噪声分布
* 参数一、二:生成噪声的宽度和高度
sp_distribution (5, 5, Distribution)
* 生成的随机噪声添加到图像中
add_noise_distribution (ImageMedian, ImageNoise1, Distribution)
dump_window (WindowHandle, 'bmp', 'D:/Halcon/绘制图形/椒盐噪声')

参考文章:median_image

在这里插入图片描述

2、将彩图转化为灰度图

read_image (Image, 'patras')
*将彩色图像转成灰色图像
rgb1_to_gray (Image, GrayImage)dev_display (GrayImage)*RGB彩色图像分解为单独的通道(红色、绿色、蓝色)
decompose3 (Image, R, G, B)*RGB彩色图像的红、绿、蓝通道合并为灰度图像
rgb3_to_gray (R, G, B, ImageGray)dev_display (ImageGray)

在这里插入图片描述

3、全阈值分割 threshold(二值化)

* 获取当前活动窗口的句柄(handle)
dev_get_window (WindowHandle)
read_image (Image, 'pellets.png')* 全局阈值分割,适用于环境稳定,目标与背景存在明显的灰度差的情况
* 参数一、二:输入图像和输出区域
* 参数三、四:阈值上限和下限
threshold (Image, Region, 128, 255)* connection 连通性,对区域进行链接操作
* 参数一:输入的二值化或分割后的图像区域。
* 参数二:输出链接
connection (Region, Connection)* select_shape 根据形状的特征选择目标区域
* 参数一:输入图像链接或区域
* 参数二:输出的选择后的区域
* 参数三:选择区域的特征,'area'表示区域的面积
* 参数四:多个条件的逻辑关系,'and'表示满足所有条件的区域
* 参数五、六:表示选择面积的最大值和最小值
select_shape (Connection, SelectedRegions, 'area', 'and', 550, 99999)* erosion_circle 对选定的区域进行圆形腐蚀操作,断开链接区域
* 参数一:输入选定区域
* 参数二:输出腐蚀后的区域
* 参数三:腐蚀半径大小
erosion_circle (SelectedRegions, RegionErosion, 7.5)* connection 连通性
connection (RegionErosion, ConnectedRegions2)* 膨胀:对每个连通域做圆形膨胀操作,还原轮廓大小,目的是为了绘制边缘(半径越大,膨胀越明显)
dilation_circle (ConnectedRegions2, RegionDilation, 7.5)* 设置绘制操作,'margin' 参数表示设置绘图模式为绘制边缘。
dev_set_draw ('margin')dev_display (Image)
dev_display (RegionDilation)* area_center 用于计算给定区域的面积以及重心的位置
* 参数一:要计算属性的输入区域
* 参数二:表示计算得到的区域的面积
* 参数三、四:计算得到的区域中心的行和列坐标
area_center (RegionDilation, Area, Row, Column)* gen_cross_contour_xld 生成一个由两条相互垂直的线段组成的轮廓,形成一个十字形状。
gen_cross_contour_xld (Cross, Row, Column, 15, 0.785398)* count_obj 计数器:出现一次++  RegionDilation出现一次++,加的值在Number
count_obj (RegionDilation, Number)* 设置绘图颜色
dev_set_color('green')
* 设置显示字体属性
* 参数一:句柄
* 参数二:字体大小
* 参数三:'mono' 表示选择单色字体
* 参数四:表示字体是否加粗
* 参数五:表示是否设置字体倾斜
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')* 设置文本放的位置
set_tposition (WindowHandle,10,240)
* 设置文本的内容
write_string (WindowHandle, '数量:'+Number)

参考文章:select_shape

在这里插入图片描述

4、局部阈值分割

read_image (Image, 'clip')
* 全自动阈值分割,主要原理是两个波峰图像的自动阈值分割
* 参数一:输入的灰度图像
* 参数三: max_separability(最大限度的可分型)smooth_histo(直方图平滑)
* 参数四:'dark'表示目标为暗色物体
* 参数五:输出的阈值
binary_threshold (Image, Region, 'max_separability', 'dark', UsedThreshold)* 计算图像的平均值图像(可以通过对图像中每个像素周围的邻域进行像素值的平均来生成一个平均值图像。)
mean_image (Image, ImageMean, 7, 7)* 根据图像的局部特性和平均值图像进行动态阈值分割,可以根据图像的不同区域自适应地选择阈值进行分割。
* 参数一:输入的图像
* 参数二:平均值图像
* 参数三:输出的动态阈值分割的结果区域
* 参数四:指定斑点的大小,用于控制动态阈值计算的斑点尺寸
* 参数五:'light'表示目标为亮色物体(目标像素灰度值较大)
* dyn_threshold (Image, ImageMean, RegionDynThresh, 5, 'light')* 根据图像的局部方差和均值进行阈值分割。它可以根据图像局部区域的方差和均值来选择合适的阈值,从而实现图像的分割。主要是用来区分目标和背景
* 参数一:输入的平均值图像
* 参数二:输出的阈值分割结果区域
* 参数三、四:指定邻域的宽高
* 参数五:指定方差缩放因子,用于调整方差的权重
* 参数六:'dark' 表示目标为灰色物体
var_threshold (ImageMean, Region1, 15, 15, 0.2, 2, 'dark')* 自动计算图像的阈值,并将图像分割成不同的区域
* 2代表sigma,数值越大代表提取区域越小
auto_threshold (ImageMean, Regions, 2)* 快速全局阈值分割类似于threshold,速度更快
* 参数三、四:指定阈值的下限和上限
* 参数五:指定阈值类型
fast_threshold (ImageMean, Region2, 128, 255, 20)* 基于阈值的分水岭算法对图像进行分割
* 参数三:指定阈值
watersheds_threshold (ImageMean, Basins, 10)

参考文章:dyn_threshold

在这里插入图片描述

5、blob斑点检测案例

read_image (Image, 'progres')
get_image_size(Image,Width,Height)
dev_open_window(0,0,Width,Height,'black',WindowHandle)
dev_display(Image)
dev_set_color ('green')
dev_set_draw ('margin')* 创建旋转矩形
gen_rectangle2 (ROI_0, 308, 212, rad(4.15129), 124, 36)
* 裁剪
reduce_domain (Image, ROI_0, ImageReduced)
* 阈值分割
threshold (ImageReduced, Region, 0, 160)* 连接区域
connection (Region, ConnectedRegions)
* 根据面积筛选
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 30)* 计算选定区域的椭圆轴参数
* 参数二:椭圆的半长轴长度。
* 参数三:椭圆的半短轴长度。
* 参数四:椭圆的旋转角度。
elliptic_axis (SelectedRegions, Ra, Rb, Phi)* 获取区域面积与中心点
area_center (SelectedRegions, Area, Row, Column)dev_display (Image)
dev_set_color ('red')
dev_display (SelectedRegions)

在这里插入图片描述

6、形态学调整

* 关闭窗口更新
dev_update_window ('off')
* 清空显示窗口内容
dev_clear_window ()
dev_open_window (0, 0, 730, 520, 'black', WindowID)
read_image (Bond, 'die/die_03.png')
dev_display (Bond)
set_display_font (WindowID, 16, 'mono', 'true', 'false')* 在窗口中显示消息
* 参数二:表示消息的颜色为黑色
* 参数三:显示消息时是否等待用户确认
disp_continue_message (WindowID, 'black', 'true')
* 停止程序执行
stop ()* 用于进行图像阈值分割
threshold (Bond, Bright, 100, 255)
* 将二值化区域转化成一个带方向的矩形。主要的用途是定位,将来也可以做orc识别
shape_trans (Bright, Die, 'rectangle2')
* 设置字体颜色
dev_set_color ('green')
* 设置绘制线条的宽度
dev_set_line_width(3)
* 设置显示设备的绘制模式,边缘
dev_set_draw('margin')
dev_display (Die)
disp_continue_message (WindowID, 'black', 'true')
stop ()* 裁剪图像
reduce_domain (Bond, Die, DieGray)
* 对输入图像进行阈值处理
threshold (DieGray, Wries, 0, 50)
* 填充具有给定形状特征的区域中的空,限定条件是面积在1~100的孔进行填充。
fill_up_shape (Wries, WiresFilled, 'area', 1, 100)
dev_display (Bond)
dev_set_draw ('fill')
dev_set_color ('red')
dev_display (WiresFilled)
disp_continue_message (WindowID, 'black', 'true')
stop ()* 对对象进行圆形开运算  先腐蚀后膨胀
* 平滑和连接对象边界,去除小的噪点或连接断裂的部分。
* 参数三:开运算所使用的圆形结构元素的半径大小。
opening_circle (WiresFilled, Balls, 15)
dev_set_color ('green')
dev_display (Balls)
disp_continue_message (WindowID, 'black', 'true')
stop ()* 把整个区域断开
* connection (Balls, ConnectedRegions)
* select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 0, 2000)
* count_obj(SelectedRegions, Number)
* area_center(SelectedRegions, Area, Row, Column)
* for i:=1 to |Number| by 1
*     a:=sqrt(Area/3.14)
*     b:=Row[i]+20
*     c:=Column[i]-10
*     dev_set_color ('red')
*     set_tposition (WindowID, b, c)
*     write_string (WindowID, '半径:'+a)
* endfor* 把整个区域断开
connection (Balls, ConnectedRegions)
* 选择圆的相似度在0.9~1之间
select_shape (ConnectedRegions, SelectedRegions, 'circularity', 'and', 0.9, 1)
* 如果不进行 connection 断开,则是整个区域,没办法使用
* connection (SelectedRegions, ConnectedRegions1)* 对输入的区域进行排序操作
* 参数三:指定排序的依据,'first_point' 按照区域的第一个点的坐标进行排序。
* 参数四:是否采用升序排序
* 参数五:排序的方式,这里是按照列的顺序进行排序。
sort_region (SelectedRegions, SortedRegions, 'first_point', 'true', 'column')
dev_display (Bond)
dev_display (SortedRegions)* 找到包围输入区域的最小圆
* 参数二、三:最小圆的圆心的XY坐标。
* 参数四:最小圆的半径
smallest_circle (SortedRegions, Row, Column, Radius)* 准备元组取出来Radius
NumBalls:=|Radius|
* 直径
Diameter:=2*Radius
* 最小值
minDiameter := min(Diameter)
* 最大值
maxDiameter := max(Diameter)
* 平均值
meanDiameter := mean(Diameter)dev_display (Bond)
disp_circle (WindowID, Row, Column, Radius)
dev_set_color ('white')
for i:=1 to NumBalls by 1* 1.输入窗口句柄 2.输入要打印的信息 3.参考的位置 4&&5.打印的位置 6.颜色 7.边框disp_message (WindowID, '直径:'+Diameter, 'window', Row, Column, 'black', 'true')
endfor
dev_set_color ('green')
dev_update_window ('on')
disp_continue_message (WindowID, 'black', 'true')
stop ()

在这里插入图片描述

7、开运算、闭运算

* read_image (Image, 'claudia')
* 转灰度
* rgb1_to_gray (Image, GrayImage)
* 设置阈值
* threshold (GrayImage, Regions, 32, 113)
* 阈值分割
* connection (Regions, ConnectedRegions)
* 选择区域
* select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20377.7, 83996)
* area_center (SelectedRegions1, Area, Row, Column)* 形态学操作 圆形膨胀
* dilation_circle (SelectedRegions1, RegionDilation, 3.5)
* dilation_rectangle1* 形态学操作 腐蚀
* erosion_circle (RegionDilation, RegionErosion, 3.5)********** 开运算(先腐蚀后膨胀)
* read_image (Image, 'pellets')
* 全局阈值分割
* threshold (Image, Regions, 106, 255)
* connection (Regions, ConnectedRegions1)
* select_shape(ConnectedRegions1,SelecteRegions,'area','and',500,9999)* 腐蚀
* erosion_circle (SelecteRegions, fushi, 7.5)
* connection 分割区域:将所关联的像素区域连成一组
* connection (fushi, ConnectedRegions)* 膨胀
* dilation_circle (ConnectedRegions, pengzhang, 7.5)
* dev_display (Image)
* dev_display (pengzhang)********** 闭运算(先膨胀后腐蚀)
* 结构元素半径:边长越大,膨胀或腐蚀越明显
* 增加像素:使用膨胀或闭运算
* 减少像素:使用腐蚀或开运算
read_image (Image, 'pellets')
threshold (Image, Region, 128, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
dilation_circle (SelectedRegions, pengzhang, 3.5)
connection (pengzhang, ConnectedRegions1)
erosion_circle (ConnectedRegions1, fushi, 3.5)
dev_display (Image)
dev_display(fushi)

参考文章:数学形态学运算——腐蚀、膨胀、开运算、闭运算

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/542832.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java学习之路-程序逻辑控制

目录 1.分支结构 1.1 if语句 栗子 判断奇数还是偶数 判断一个年份是否为闰年 1.2switch语句 栗子 2. 循环结构 2.1while 循环 栗子 2.2break和continue break continue 2.3for循环 基本语法 栗子 2.4 do while 循环 3.输入输出 3.1输出 3.2从键盘输入 栗子…

Webapi(.net6) 批量服务注册

如果不考虑第三方库,如Autofac这种进行服务注入,通过本身的.Core Weabpi实现的,总结了两种实现方法, 1.一种是参考abp框架里面的形式; 1.1 新建个生命周期的文件夹: 三个接口分别为: public interface IScopedDependency { }pu…

因为manifest.json文件引起的 android-chrome-192x192.png 404 (Not Found)

H5项目打包之后,总是有这个报错,有时候还有别的icon也找不见 一通调查之后,发现是因为引入了一个vue插件 这个插件引入之后,webpack打包的时候就会自动在dist文件夹中产生一个manifest.json文件这个文件里面主要就是一些icon地址的…

最详细爬虫零基础教程02——http协议和请求头的介绍

文章目录 复习一、http和https协议二、网络请求的过程1.浏览器发送http请求的过程2.DNS服务器 三、Headers参数介绍总结 复习 在本节开始讲述的时候,我们先来复习一下爬虫的基本步骤: 一、http和https协议 HTTP协议(Hypertext Transfer Pr…

【C++ RB树】

文章目录 红黑树红黑树的概念红黑树的性质红黑树节点的定义红黑树的插入代码实现总结 红黑树 AVL树是一颗绝对平衡的二叉搜索树,要求每个节点的左右高度差的绝对值不超过1,这样保证查询时的高效时间复杂度O( l o g 2 N ) log_2 N) log2​N),…

【C++ 设计模式】策略模式与简单工厂模式的结合

文章目录 前言一、为什么需要策略模式简单工厂模式二、策略模式简单工厂模式实现原理三、UML图四、示例代码总结 前言 在软件设计中,常常会遇到需要根据不同情况选择不同算法或行为的情况。策略模式和简单工厂模式是两种常见的设计模式,它们分别解决了对…

机器学习-04-分类算法-02贝叶斯算法

总结 本系列是机器学习课程的系列课程,主要介绍机器学习中分类算法,本篇为分类算法与贝叶斯算法部分。 本门课程的目标 完成一个特定行业的算法应用全过程: 懂业务会选择合适的算法数据处理算法训练算法调优算法融合 算法评估持续调优工程…

如何使用Python进行数据可视化:Matplotlib和Seaborn指南【第123篇—Matplotlib和Seaborn指南】

如何使用Python进行数据可视化:Matplotlib和Seaborn指南 数据可视化是数据科学和分析中不可或缺的一部分,而Python中的Matplotlib和Seaborn库为用户提供了强大的工具来创建各种可视化图表。本文将介绍如何使用这两个库进行数据可视化,并提供…

数据结构与算法第八套试卷

1.建立一个长度为n的有序单链表的时间复杂度 0(n^2) 2.哈希算法 key%p:p最好为质数 如果两个关键字的值不等但哈希函数值相等,则称这两个关键字为同义词(正确); 3.二分查找 注意: 二分查找是向下查询…

pytest生成allure的报告

首先要下载安装配置allure allure serve ./outputs/allure_report 可以生成html的文件自动在默认浏览器中打开

栈的应用——括号匹配

用栈实现 1、初始化一个栈,用来存左括号 2、遍历扫描括号字符串 如果遇到左括号,无脑入栈如果遇到右括号,此时栈空返回false,不空的话进行括号匹配。匹配不成功返回false,匹配成功将栈顶的那个左括号出栈。 遍历完之后…

Android Kotlin知识汇总(三)Kotlin 协程

Kotlin的重要优势及特点之——结构化并发 Kotlin 协程让异步代码像阻塞代码一样易于使用。协程可大幅简化后台任务管理,例如网络调用、本地数据访问等任务的管理。本主题介绍如何使用 Kotlin 协程解决以下问题,从而让您能够编写出更清晰、更简洁的应用代…