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.mzph.cn/news/748555.shtml

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

相关文章

如何在iPhone上恢复已删除的微信聊天记录?

你好,我前几天删除了微信聊天记录。有什么办法可以恢复iPhone上已删除的微信聊天记录吗? 有些人每次使用设备时都会遇到在 iPhone 上丢失消息的风险。特别是,由于多种因素,可能会丢失第三方数据,微信消息也是如此。微…

2024Vue高频面试题

前言: Vue 在前端开发领域拥有强劲的发展势头,以下是一些 Vue 的发展趋势: 1.持续增长的用户数量: Vue 作为一款轻量级、易学易用的前端框架,吸引了越来越多的开发者和企业选择使用。其活跃的社区和丰富的资源也促进了用户数量的不断增长。 2.生态系统不断丰富: 随着 V…

远超预期,特效吹爆!《武庚纪》:建议漫改都按这个标准来!

作为《武庚纪》动画党,听闻要改编成真人电视剧时,最害怕的无非五毛钱特效,流水线仙侠,无脑古偶。但在看过《烈焰》(原名:武庚纪)之后,不得不感叹一句:“倒也不用这么还原…

【计算机网络篇】计算机网络的性能指标

文章目录 🍔计算机网络的性能指标🗃️常见的计算机网络性能指标⭐速率⭐带宽⭐吞吐量⭐时延⭐时延带宽积⭐往返时间⭐利用率⭐丢包率 🔎总结 🍔计算机网络的性能指标 计算机网络的性能指标被用来从不同方面度量计算机网络的性能 …

算法的渐进时间复杂度

T(n) = O(F(n)) T(n):Time 渐进时间复杂度 O:正比例关系 F(n):代码执行次数 只要代码执行的次数越来越多 所耗费的时间也就越来越高 常见的5种: O(n^2) O(n logn) O(n) O(logn) O(1):不管重复多少次1次也是这个时间,10次也是这个时间。 时间复杂度排序:由小到…

JAVA22 FFM实战之HelloWorld

前言 JDK22即将发布,Java Foreign Function & Memory API将会退出预览,是时候开始学习一波了。 FFM API介绍 FFM API由两大部分组成,一个是Foreign Function Interface,另一个是Memory API。前者是外部函数接口&#xff0c…

对模型性能进行评估(Machine Learning 研习十五)

在上一篇我们已然训练了一个用于对数字图像识别的模型,但我们目前还不知道该模型在识别数字图像效率如何?所以,本文将对该模型进行评估。 使用交叉验证衡量准确性 评估模型的一个好方法是使用交叉验证,让我们使用cross_val_score…

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

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

MySQL大小写敏感、MySQL设置字段大小写敏感

文章目录 一、MySQL大小写敏感规则二、设置数据库及表名大小写敏感2.1、查询库名及表名是否大小写敏感2.2、修改库名及表名大小写敏感 三、MySQL列名大小写不敏感四、lower_case_table_name与校对规则4.1、验证校对规则影响大小写敏感4.1、验证校对规则影响排序 五、设置字段内…

Selenium控制已运行的Edge和Chrome浏览器——在线控制 | 人机交互(详细启动步骤和bug记录)

文章目录 前期准备1. 浏览器开启远程控制指令(1)Edge(2)Chrome 2. 执行python代码(1)先启动浏览器后执行代码(2)通过代码启动浏览器(3)Bug问题记录1&#xff…

蓝桥杯决赛2023 RE CyberChef2

思路很清晰,爆IV 但是题目出的有点屎,六位字符串,62的6次方,要我爆到猴年马月? 就当练习脚本吧 #Cyber2 wp from Crypto.Cipher import DES, AES from Crypto.Util.Padding import pad, unpad key_des b0a0b0c0…

PHP异世界云商系统开源源码

系统更新与修复列表 1. 基于彩虹的二次开发 - 对彩虹系统进行了二次开发,增强了系统的功能和性能。2. 新增自定义输入框提示内容(支持批量修改) - 用户可以自定义输入框的提示内容,并支持批量修改,提升用户体验。3. 新…

TCP相关特性

协议段格式 • 源/⽬的端⼝号:表⽰数据是从哪个进程来,到哪个进程去; • 32位序号/32位确认号:后⾯详细讲; • 4位TCP报头⻓度:表⽰该TCP头部有多少个32位bit(有多少个4字节);所以TCP头部最⼤⻓度是15*460 • 6位标志位: ◦ URG:紧急指针是否有效 ◦ ACK:确认号是否有效…

ARMv8架构特殊寄存器介绍-0

一、zero 寄存器 零寄存器用作源寄存器时读取零,用作目标寄存器时丢弃结果。您可以在大多数指令中使用零寄存器,但不是所有指令。二、sp寄存器 在ARMv8架构中,要使用的堆栈指针的选择在某种程度上与Exception级别。默认情况下,异…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:ScrollBar)

滚动条组件ScrollBar,用于配合可滚动组件使用,如List、Grid、Scroll。 说明: 该组件从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 可以包含单个子组件。 接口 ScrollBar(val…

6、Design Script之列表

Range 在DesignScript中,Range是从起点到终点的一系列数字,使用指定的步距(间距类型),并有以下的初始化方法: start..end..step; start..end..#amount; start..end..~approximate; Range可以是数字的,也可以是字母的。 字母范围因大小写而异。 开始,结束. .#数量范围(…

springboot276基于JS的个人云盘管理系统的设计与实现

个人云盘管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装个人云盘管理系统软件来发挥其…

P6技巧:导出XER设置老版本/新版本

前言 在一个大型的项目中,虽然业主方已要求承包商必须使用P6格式来提交计划,但实际情况是承包商会给到你多种不同版本的XER文件,使得得在Oracle Primavera P6 之间导入或导出。 如果收到的 XER 文件不适合你使用的 Primavera P6 版本&#x…

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从键盘输入 栗子…

南大通用数据库-Gbase-8a-学习-43-SQL长时间处于Writing to net状态排查

目录 一、问题截图 二、排查思路 1、Gbase8a SQL有几种状态 2、问题导致原因猜想 3、观察服务端(集群端)网络情况 4、观察客户端网络情况 5、排查客户端程序处理数据慢 5.1、send (1)声明 (2)作用…