Halcon 图像处理技巧:抠图与形态学操作指南

一,抠图


1, dev_get_window (WindowHandle)// 获取窗口句柄

* draw_rectangle2 (WindowHandle, Row, Column, Phi, Length1, Length2)// 绘制仿射矩形

* gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)//显示roi区域

*Image 裁剪的图片

*Rectangle 裁剪的形状

*ImageReduced 裁剪之后的图片

* reduce_domain (Image, Rectangle, ImageReduced) //裁剪区域

* dev_clear_window ()// 清空窗体

* dev_display (ImageReduced) //展示裁剪区域


二,区域轮廓


1,找区域的轮廓信息

read_image (Image, 'brik')

get_image_size (Image, Width, Height) //获取图片大小

*dev_open_window (0, 0, Width, Height, 'black', WindowHandle1)

//打开指定大小的窗体

dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) //

打开窗体适应这个图片大小

dev_display (Image)

2,圆形开运算 先腐蚀后膨胀, 先减少部分小的噪声,再整体对区域进行放大

*RegionOpening 开运算之后的图

*3.5 开运算的半径

opening_circle (SelectedRegions, RegionOpening, 3.5)

3,改变区域形状

shape_trans (RegionOpening, RegionTrans, 'rectangle1') //将填充后的区域转换为外接矩形(最小外接矩形)

reduce_domain (Image, RegionTrans, ImageReduced) //按照形状进行裁剪

threshold (ImageReduced, Region1, 80, 255)

boundary (Region1, RegionBorder, 'inner') // 内轮廓

boundary (RegionBorder, RegionBorder1, 'outer') //外轮廓


三,保存图片


1,图片保存

read_image (Image, 'printer_chip/printer_chip_01') //读取图片
dev_get_window (WindowHandle)

dev_disp_text ('hello', 'window', 'top', 'left', 'black', [], [])

【1】,导出窗体 并且窗体上其他标注信息一同导出

*参数1 窗口句柄
*参数2 导出的格式 默认的格式'postscript' 后缀名是.ps,一种资源类型 ,也可以保存成其他格式
*参数3 保存文件名称和路径 相对路径
dump_window (WindowHandle, 'postscript', '1')
dump_window (WindowHandle, 'bmp', '2')

【2】,把窗体转成图片格式

dump_window_image (Image1, WindowHandle)

【3】,保存圆图片

第 1 个参数:要保存的图像

第 2 个参数:保存格式(tiff/png/jpg)

第 3 个参数:质量 / 压缩(0 = 无损)

第 4 个参数:保存的文件名

write_image (Image, 'tiff', 0, '3')

【4】,保存窗体转成的图片

write_image (Image1, 'tiff', 0, '4')

2,生成棋盘格图片

【1】,参数1 生成棋盘格的区域

参数34 生成区域的大小
参数5/6 生成格子的大小
gen_checker_region (RegionChecker, 511, 511, 32, 32)

【2】,把区域转成二值化的图片格式

BinImage 输出的二值化图片
255 是前景颜色
*0 是背景颜色
region_to_bin (RegionChecker, BinImage, 255, 0, 512, 512)

【3】,裁剪指定区域的图像

read_image (Image2, 'monkey')

裁剪的是 100, 100(坐标),

28, 128(宽度和高度) 的部分

crop_part (Image2, ImagePart, 48, 154, 37, 20)

//绘制椭圆,分割区域

draw_ellipse (WindowHandle, Row, Column, Phi, Radius1, Radius2)
gen_ellipse (Ellipse, Row, Column, Phi, Radius1, Radius2)

reduce_domain (Image2, Ellipse, ImageReduced)


四,阈值分割和其他算子


1,快速阈值分割方式 :该算子不会逐步检查每个像素点,从20*20这个范围内查找中心像素值,如果中间像素,灰度值在128-255范围 ,可以认为这个范围就是一个连通区域,体现快速阈值分割

fast_threshold (Image, Region, 128, 255, 20)

2,对图片使用均值处理

参数10 和10 结构图的大小, 值越大 越模糊,
mean_image (Image, ImageMean, 10, 10)

3,动态阈值分割 传递俩张图片,使用俩张图片进行阈值处理

参数1 原始图片
参数2 图像处理之后的图像,中值滤波、均值滤波、高斯滤波等处理之后的图片
参数3 输出区域
参数4 偏移值 原始图减去处理之后的图偏移范围
参数5 提取亮的部分

dyn_threshold (Image, ImageMean, Region, 10, 'light')

4,anisometry 外接矩形长轴和短轴的比例

select_shape (ConnectedRegions, SelectedRegions, ['area','anisometry'], 'and', [150,1], [9999,2])

5,填充形状

填充选中区域内部的孔洞(把空心变成实心)

fill_up (SelectedRegions, RegionFillUp)

将填充后的区域转换为外接矩形(最小外接矩形)

shape_trans (RegionFillUp, RegionTrans, 'rectangle2')

orientation_region (SelectedRegions, Phi) // 获取角度

length:=30

area_center (RegionTrans, Area, Row, Column)// 获取区域中心点
dev_get_window (WindowHandle)

boundary (RegionTrans, RegionBorder, 'inner')//找轮廓

dev_display(Image)

dev_display (RegionBorder)
disp_arrow (WindowHandle, Row, Column, Row-length*sin(Phi),//绘制箭头 Column+length*cos(Phi), 1)


五,腐蚀、膨胀、打开、关闭 (图形预处理)


1,圆形的腐蚀:

3.5腐蚀区域的半径
erosion_circle (Region, RegionErosion, 3.5)

2,形态学膨胀

dilation_circle (RegionErosion, RegionDilation, 3.5)

3,打开运算 先腐蚀后膨胀

opening_circle (Region, RegionOpening,3.5)

4,关闭运算 先膨胀再腐蚀

closing_circle (Region, RegionClosing, 11.5)

5,gen_circle (Circle, 200, 200, 3.5)

参数1 传入的区域
参数2 结构图 可以使用gen_circle等绘制出来结构图
参数3 输出的区域
参数4 形态学操作迭代次数,1 形态学操作一次
dilation1 (Region1, Circle, RegionDilation1, 1)

*dilation_circle (Region1, RegionDilation2, 3.5)// 等同于上面这俩句所实现的功能


六,顶帽和底帽


1,创建一个SE结构图

byte 创建一个结构转成byte类型的图片
100 、100 结构图的大小
最后一个参数 结构图中间灰度值

gen_disc_se (SE, 'byte',100, 100, 255)

2,获取像素点灰度值 原图中心点灰度值

get_grayval (Image, Width/2, Height/2, Grayval)

3,对原始图片进行开运算 结构图是顶帽的结构图

gray_opening ( Image,SE, ImageOpening)
get_grayval (ImageOpening,Width/2, Height/2, Grayval2)

4,顶帽:顶帽之后的图= 原始图片-gray_opening(打开运算之后的图)

顶帽使用的场景:提取图像当中的微小的亮斑(如医学上影像中病灶、工业检测中亮的缺陷)
参数1 输入图片
参数2 输入结构图
参数3 经过顶帽之后的处理图

gray_tophat (Image, SE, ImageTopHat)

获取顶帽之后的图中心点的灰度值

get_grayval (ImageTopHat, Width/2, Height/2, Grayval1)

5,底冒

底帽之后的图= 原始图片-gray_closing(闭运算之后的图)
底帽使用的场景:提取图像当中的微小的暗斑(如医学上影像中肿瘤、工业检测中暗的缺陷)

gray_bothat (Image, SE, ImageBotHat)

相关推荐
qq_416018722 小时前
移动平台C++开发指南
开发语言·c++·算法
自动化智库2 小时前
西门子S7-1200PLC与V90PN伺服基于FB284模块的定位控制应用
开发语言·科技
3GPP仿真实验室2 小时前
【MATLAB源码】CSI-RS:信道估计仿真与评估平台
开发语言·matlab
AI-小柒2 小时前
DataEyes 聚合平台 + Claude Code Max 编程实战
android·开发语言·人工智能·windows·python·macos·adb
王璐WL2 小时前
【C++】string的经典算法题
开发语言·c++·算法
兑生2 小时前
【灵神题单·贪心】2279. 装满石头的背包的最大数量 | 排序贪心 | Java
java·开发语言
阿贵---2 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
南 阳3 小时前
Python从入门到精通day56
开发语言·python
m0_569881473 小时前
C++中的组合模式高级应用
开发语言·c++·算法