《HALCON机器视觉与算法原理编程实践》第8章 图像的形态学处理
文章目录
- 8.1 腐蚀与膨胀
- 8.1.1 结构元素
- 8.1.2 腐蚀
- 8.1.3 膨胀
- 8.2 开运算与闭运算
- 8.2.1 开运算(先腐蚀,后膨胀)
- 8.2.2 闭运算(先膨胀,后腐蚀)
- 8.3 顶帽运算与底帽运算
- 8.3.1 顶帽运算
- 8.3.2 底帽运算
- 8.3.3 顶帽运算与底帽运算的应用
- 8.4 灰度图像的形态学运算
8.1 腐蚀与膨胀
在经阈值处理提取出目标区域的二值图像之后,区域边缘可能并不理想,这时可以使用腐蚀或膨胀操作对区域进行“收缩”或“扩张”。
8.1.1 结构元素
设有两幅图象B,X。若X是被处理的对象,而B是用来处理X的,则称B为结构元素(structure element),又被形象地称做刷子。结构元素通常都是一些比较小的图象。
8.1.2 腐蚀
腐蚀是对所选区域进行“收缩”的一种操作,可以用于消除边缘和杂点。
read_image (Image, 'data/board')rgb1_to_gray (Image, GrayImage)threshold (GrayImage, Region, 100, 255)gen_image_proto (GrayImage, ImageCleared, 0)erosion_circle (Region, RegionErosion, 7.5)erosion_circle (RegionErosion, RegionErosion2, 6.5)dev_clear_window ()dev_display (RegionErosion2)
◆腐蚀特点:对于去除图像分割后物体的突出区域以及区域边界的凸区域具有很好的效果。
◆腐蚀分类:根据腐蚀结构元的形状,在halcon中分为圆形腐蚀以及矩形腐蚀等。
erosion_circle() 圆形腐蚀
erosion_rectangle1() 矩形腐蚀
◆灰度图像的腐蚀:扩大暗色背景,腐蚀亮色区域
gray_erosion_rect()
◆灰度图像的膨胀:扩大亮色背景,腐蚀暗色区域
gray_dilation_rect()
8.1.3 膨胀
与腐蚀相反,膨胀是对选取进行“扩大”的一种操作
read_image (Image, 'data/board')rgb1_to_gray (Image, GrayImage)threshold (GrayImage, Region, 100, 255)erosion_circle (Region, RegionErosion, 7.5)erosion_circle (RegionErosion, RegionErosion2, 6.5)erosion_circle (RegionErosion2, RegionErosion3, 5.5)*膨胀操作dilation_circle (RegionErosion3, RegionDilation, 23.5)dev_clear_window ()dev_display (RegionDilation)
◆膨胀特点:对于填补图像分割后物体的空洞以及区域边界的凹陷区域具有很好的效果。
◆膨胀分类:根据膨胀结构元的形状,在halcon中分为圆形膨胀以及矩形膨胀等。
dilation_circle() 圆形膨胀
dilation_rectangle1() 矩形膨胀
8.2 开运算与闭运算
腐蚀与膨胀是形态学运算的基础,在实际检测过程中,常常需要组合运用腐蚀与膨胀对图像进行处理。
8.2.1 开运算(先腐蚀,后膨胀)
通过开运算能取出一些孤立的、细小的点,平滑毛糙的边缘线,同时原区域面积也不会有明显的改变,类似于一种“去毛刺”的效果。
◆开运算:对区域先进行腐蚀操作,然后对腐蚀的结果再进行膨胀操作,称为开运算。
◆开运算特点:具有与腐蚀相似的特点,但是能够防止区域腐蚀过度,能够很好的保持区域的形状。
opening_circle()
opening_rectangle1()
*读取待检测的图像read_image (Image,'data/board') *将图像转换为单通道的灰度图像rgb1_to_gray(Image, GrayImage)*创建矩形区域gen_rectangle1 (Rectangle, 259, 87, 957, 909)*进行裁剪,将感兴趣区域单独提取出来reduce_domain (GrayImage, Rectangle, ImageReduced)*使用阈值处理将灰度值于设定的像素选取出来threshold(ImageReduced,Light,85,255)*创建圆形结构元素,用于开运算gen_circle(StructElement,6,6,7)*进行开运算去除背景中的杂点opening(Light,StructElement,Large)dev_clear_window ()dev_display (Large)
8.2.2 闭运算(先膨胀,后腐蚀)
通俗的说,就是一种类似于“填空隙”的效果。
◆闭运算:对区域先进行膨胀操作,然后对膨胀的结果再进行腐蚀操作,称为闭运算。
◆闭运算特点:具有与膨胀相似的特点,但是能够防止区域膨胀过度,能够很好的保持区域的形状。
closing_circle()
closing_rectangle1()
read_image (Image,'data/shapes')*将图像进行通道分解,分别转换为三个通道的RGB图像decompose3 (Image, Red, Green, Blue)*使用颜色转换将RGB三个通道图像转化为HSV通道的图像trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv')*对饱和度通道的图像进行阈值处理threshold (Saturation, Regions, 180, 255)*创建圆形结构元素用于闭运算gen_circle(StructElement,10,10,10)*对图像中较亮的区域进行闭运算处理,填补了各自轮廓中的小空隙closing(Regions,StructElement,Large)dev_clear_window ()dev_display (Large)
8.3 顶帽运算与底帽运算
顶帽运算与底帽运算就是在开运算与闭运算的基础上,来处理图像中的各种杂点、空洞、小的间隙、毛糙的边缘等。
8.3.1 顶帽运算
顶帽运算的原理是用原始的二值图像减去开运算的图像。开运算的目的是“移除”某些局部像素,如去毛边、断开相邻的边缘等。而顶帽运算正式用来提取这些被移除的部分。
read_image (Image,'data/board') rgb1_to_gray(Image, GrayImage)gen_rectangle1 (Rectangle, 259, 87, 957, 909)reduce_domain (GrayImage, Rectangle, ImageReduced)threshold(ImageReduced,Light,85,255)gen_circle(StructElement,6,6,7)*清理显示窗口,以便显示结果dev_clear_window ()*进行顶帽运算,得到了开运算中移除的局部像素并高亮显示top_hat (Light, StructElement, RegionTopHat)dev_clear_window ()dev_display (RegionTopHat)
8.3.2 底帽运算
底帽运算的原理是用原始的二值图像减去闭运算的图像。闭运算的目的是对某些局部区域进行“填补”,如填空洞、使分离的边缘相连接等。而底帽运算正是用来提取这些用于填补的区域的。
read_image (Image,'data/shapes')decompose3 (Image, Red, Green, Blue)trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, 'hsv')threshold (Saturation, Regions, 180, 255)gen_circle(StructElement,10,10,10)*清理显示窗口,以便显示结果dev_clear_window ()*清理显示窗口,以便显示结果bottom_hat (Regions, StructElement, RegionBottomHat)dev_clear_window ()dev_display (RegionBottomHat)
8.3.3 顶帽运算与底帽运算的应用
(1)提取小的物件
(2)校正非均匀光照
*读取一幅光照不均匀的亮背景图像,这里选取的是一幅彩色图像read_image (Image,'data/shapes')*变换之前转为灰度图像rgb1_to_gray (Image, GrayImage)*将图像通过阈值处理转化为二值化图像。threshold (GrayImage, Regions, 145, 255)*创建一个结构元素,这里创建的是一个圆形gen_circle(StructElement,10,10,100)*清空窗口便于显示结果dev_clear_window ()*进行底帽操作,提取出较暗区域bottom_hat (Regions, StructElement, RegionBottomHat)*将较暗区域从原图中提取出来reduce_domain (Image, RegionBottomHat, ImageReduced)dev_clear_window ()dev_display (ImageReduced)
8.4 灰度图像的形态学运算
灰度图像的形态学运算也可以理解为针对暗背景、亮目标的图像进行的运算。
read_image (ImageColor, 'data/village.jpg')*将原始图像转换为灰度图像作为形态学处理的输入rgb1_to_gray (ImageColor, Image)*进行灰度图像腐蚀操作gray_erosion_shape (Image, ImageMin, 11, 11, 'octagon')*进行灰度图像膨胀操作gray_dilation_shape (Image, ImageMax, 11, 11, 'octagon')*进行灰度图像开运算操作gray_opening_shape (Image, ImageOpening, 7, 7, 'octagon')*进行灰度图像闭运算操作gray_closing_shape (Image, ImageClosing, 7, 7, 'octagon')