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)

相关推荐
z落落19 小时前
C# ToCharArray + foreach遍历 + String与StringBuilder
开发语言·c#
学代码的真由酱19 小时前
Java多用户一对一网页聊天室-测试报告
java·开发语言·功能测试·测试
人道领域19 小时前
【LeetCode刷题日记】669.修剪二叉搜索树
开发语言·python·算法
xiaoshuaishuai820 小时前
C# AvaloniaUI动态显示图片
开发语言·c#
日光明媚20 小时前
一步生成视频!One-Forcing:DMD + 零成本 GAN,训练 200 步超越多步 SOTA
android·开发语言·kotlin
2301_8035389521 小时前
Java读取Word图片的两种实用方法
java·开发语言·word
bug和崩溃我都要1 天前
Qt 封装 libmpv 全功能视频播放器开发指南
开发语言·qt·音视频
郝学胜-神的一滴1 天前
Qt 高级开发 018:复刻经典登录界面布局与窗口美化全解析
开发语言·c++·qt·程序人生·用户界面
郝亚军1 天前
IEEE 754 单精度浮点的SEM表示
开发语言·c++·算法
zhangjw341 天前
第15篇:Java多线程零基础入门,进程线程、线程创建方式、线程生命周期、线程安全彻底吃透
java·开发语言·面试