4、Halcom区域分割和区域边缘膨胀、腐蚀
目录
1、全局阈值分割
2、动态阈值分割
3、其它阈值分割
4、形态学膨胀
5、形态学腐蚀
6、形态学开运算和闭运算
1、全局阈值分割
阈值,字面意思是界限,又叫临界值。是指能够产生的最低值或最高值。在图像处理中它的意思是颜色转换的临界点,该方法只用于二值化的图像中。
阈值分割,指的是按照给定的阈值范围,从图像中将像素点灰度值介于阈值范围内的那些点分割开来。
(图像处理,又称为二值化)
全局阈值分割,是指针对于整张图像给定数值,将像素点从图像中分割开来。
全局阈值的分割关键点,在于阈值的选取。一般是根据图像的特征或者图像的灰度直方图进行的阈值设置。
程序演示:
打开图像,并灰度化
*打开文件、读取图片
dev_open_file_dialog ('read_image', 'default', 'default', Selection)
read_image (Image, Selection)
*灰度转换
rgb1_to_gray (Image, GrayImage)
把图片上,白色的字提取出来。按住Ctrl键,鼠标在文字上,就可以看出当前的灰度值了。(黑白像素0-255。0是全黑、255全白。)
可以看出白色的字灰度值在245左右,阈值分割里面范围可以设置为230-255。
全局阈值分割
*全局阈值分割算子:两个数值:选择分割的图像灰度范围
threshold (GrayImage, Regions, 230, 255)
或者
*全局阈值分割算子:前两个数值:选择分割的图像灰度范围,
*最后一个是要选择的分割的面积(可以将一些点去掉)
fast_threshold (GrayImage, Region, 230, 255, 20)
使用连通域,将每个字符区域分开
*连通域操作
connection (Region, ConnectedRegions)
2、动态阈值分割
动态阈值分割指的是:在图像的分割过程中不用人为的去设定阈值,而是根据图像中存在的特征进行分割。
原理:将原图像与处理后的图像作差,然后去计算图像中的亮色区域或者暗色区域。本质相当于对图像灰度直方图的平滑,进而求出图像中的波谷或者波峰。
特点:动态阈值分割具有抗干扰性强、稳定性强的特点,对光照不明显。
两种实现方式的算子:
dyn_threshold(需要和滤波算子结合用)
local_threshold(一步到位)
程序演示:
打开图像,并灰度化
*读取一幅图片
dev_open_file_dialog ('read_image', 'default', 'default', Selection)
read_image (Image, Selection)
*图像灰度转换
rgb1_to_gray (Image, GrayImage)
灰度化处理
方法1,使用dyn_threshold
*中值滤波
median_image (GrayImage, ImageMedian, 'circle', 60, 'mirrored')
*动态阈值分割
dyn_threshold (GrayImage, ImageMedian, RegionDynThresh, 100, 'light')
中值滤波
阈值分割
只显示提取出来的字符区域
方法2,local_threshold
*动态阈值分割------方法2
local_threshold (GrayImage, Region, 'adapted_std_deviation', 'light', [], [])
3、其它阈值分割
除了全局阈值分割、动态阈值分割,Halcon中还提供了很多其他阈值分割,比如自动阈值分割、二值化阈值分割、分水岭阈值分割,不过用的都比较少。就不去讲解了。用的时候网再上查询一下。
4、形态学膨胀
数学形态学,是用集合论方法描述目标集合结构的学科,在集合的基础上,通过物体和结构元素的相互作用运算来得到物体本质的形态。
形态学膨胀,为什么叫形态学膨胀呢?是因为图像处理中膨胀是借鉴了形态学的方法。
膨胀特点和作用:图像分割后,对于填补图像物体的空洞和边缘凹凸具有很好的填充效果。
膨胀类型:根据膨胀结构元的形状,分为圆形膨胀和矩形膨胀。
圆形膨胀:dilation_circle
矩形膨胀:dilation_rectangle1
问1:图像为什么要膨胀操作?
答:图像中的某一个区域经过分割操作,在某些边缘断开形成多个区域,需要膨胀连起来成为一个区域,或者边缘凹凸需要填充。
程序演示:
打开图像,并灰度化
*读取一幅图片
dev_open_file_dialog ('read_image', 'default', 'default', Selection)
read_image (Image, Selection)
*图像灰度转换
rgb1_to_gray (Image, GrayImage)
区域分割,全局阈值分割
*全局阈值分割
threshold (GrayImage, Regions, 128, 255)
为什么要进行形态学膨胀:我们看上图,比如“请”字,偏旁上的点是没有连接起来的,还有“进”,“遇”、“照”、“偿”,都没有连接起来,这样区域分割后,一个字就会分割成多个区域,我们要将它变成一个区域,后面才好对他进行特征识别。
方法1:圆形膨胀
*圆形膨胀(效果好,用的多),填充,参数3:膨胀的圆半径
dilation_circle (Regions, RegionDilation, 3)
矩形膨胀,横向、竖向都可以选择膨胀。本图像,竖向膨胀多一点
*矩形膨胀,填充。矩形可以在横向、纵向都可以膨胀
dilation_rectangle1 (Regions, RegionDilation1, 2, 10)
膨胀后的图像还不能用来做特征分析。
5、形态学腐蚀
腐蚀特点:对于去除图像分割后物体的凸出区域以及区域边界的凸区域具有很好的效果。
腐蚀分类:根据腐蚀结构元的,在halcon中分为圆形腐蚀和矩形腐蚀。
问2:图像为什么要腐蚀操作?
答:图像中的某一个区域经过分割操作,本来实际中是多个区域,提取出来的是一个区域,通过腐蚀将边缘连接起来的断开。或者提取出来的区域,边缘凹凸不圆滑,对其腐蚀操作。
erosion_circle:圆形腐蚀
erosion_rectangle1:矩形腐蚀
gray_erosion_rect:灰度图像的腐蚀,扩大暗色背景,腐蚀亮色区域
gray_dilation_rect:灰度图像的膨胀,扩大亮色背景,腐蚀暗色区域
程序演示:
打开图像,并灰度化
*读取一幅图片
dev_open_file_dialog ('read_image', 'default', 'default', Selection)
read_image (Image, Selection)
*图像灰度转换
rgb1_to_gray (Image, GrayImage)
*全局阈值分割
threshold (GrayImage, Regions, 128, 255)
方法1,圆形腐蚀
*圆形腐蚀
erosion_circle (Regions, RegionErosion, 2.5)
方法2,矩形腐蚀。可以在横向、竖向选择性的腐蚀。本例在竖向多腐蚀一些。
*矩形腐蚀
erosion_rectangle1 (Regions, RegionErosion1, 1, 10)
灰度图像的腐蚀
*灰度图像的腐蚀
gray_erosion_rect (GrayImage, ImageMin, 6, 6)
*或者
*gray_erosion_shape (GrayImage, ImageMin1, 3, 3, 'octagon')
原灰度图
腐蚀后的灰度图
灰度图像的膨胀
*灰度图像的膨胀,填充
gray_dilation_rect (GrayImage, ImageMax, 11, 11)
*或者
*gray_dilation_shape (ImageMax, ImageMax1, 11, 11, 'octagon')
膨胀和腐蚀的用处,求图像边缘。
方法:先对原图像进行膨胀,再对原图像进行腐蚀。膨胀后的图像区域跟腐蚀后图像的图像作差,算出来的就是图像边缘。
*腐蚀
erosion_circle (Regions, RegionErosion2, 1.5)
*膨胀
dilation_circle (Regions, RegionDilation, 1.5)
*区域作差
difference (RegionDilation, RegionErosion2, RegionDifference)
腐蚀的图像
膨胀的图像
作差,算出来的边缘
6、形态学开运算和闭运算
①
开运算:对区域先进行腐蚀操作,然后再对腐蚀的结果进行膨胀操作。
开运算特点:具有与腐蚀相似的结果,但是能够防止区域腐蚀过度,能够很好的保持区域的形状。
算子:
opening_circle:
opening_rectangle1:
②
闭运算:对区域先进行膨胀操作,再对膨胀的结果进行腐蚀操作,
闭运算特点:具有膨胀相似的结果,但是能够防止区域膨胀过度,能够很好的保持区域的形状。
算子:
closing_circle
closing_rectangle1
③
灰度图像的开闭运算:
gray_opening_rect:灰度图像的开运算
gray_closing_rect:灰度图像的闭运算
④
程序演示:
打开图像,并灰度化
*关闭窗口
dev_close_window ()
*打开窗口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*读取一幅图片
dev_open_file_dialog ('read_image', 'default', 'default', Selection)
read_image (Image, Selection)
*图像灰度转换
rgb1_to_gray (Image, GrayImage)
全局阈值分割
*全局阈值分割
threshold (GrayImage, Regions, 128, 255)
开运算-圆(类似腐蚀)
*开运算
opening_circle (Regions, RegionOpening, 3.5)
开运算-矩形(类似腐蚀)。横向、竖向腐蚀的量可调。本例,横向上腐蚀多一些
opening_rectangle1 (Regions, RegionOpening1, 8, 1)
闭运算-圆(类似膨胀)
closing_circle (Regions, RegionClosing, 2.5)
闭运算-矩形(类似膨胀)横向、竖向腐蚀的量可调。本例,竖向上膨胀多一些
closing_rectangle1 (Regions, RegionClosing1, 1, 5)
灰度图像的开运算(类似灰度图像腐蚀)
gray_opening_rect (GrayImage, ImageOpening, 11, 11)
灰度图像的闭运算(类似灰度图像膨胀)
gray_closing_rect (GrayImage, ImageClosing, 11, 11)
*==========应用举例说明:提取汉字“进”==========*
对灰度图分割出来的字符区域进行连通域操作。
观察发现“进”被分割成了3个区域。别的汉字也不是一个字对应一个区域,此时是没法提取出来的。
connection (Regions, ConnectedRegions)
进行闭运算,再连通域操作
closing_circle (Regions, RegionClosing2, 2.5)
connection (RegionClosing2, ConnectedRegions1)
经过闭运算后,所有的字都连起来成一个区域了。
然后,在“进”字上,画矩形,再鼠标画的矩形生成出来,将“进”字所在的区域提取出来了
*画“进”的矩形区域:鼠标左键在图上画矩形,画好了矩形点鼠标右键即完成操作
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
*生成矩形区域
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
“进”字的矩形区域和闭运算的图像,通过求交集运算(相当于与的关系),提出闭运算后的“进”字
*求交集
intersection (Rectangle, RegionClosing2, RegionIntersection)
将上图求交集出来的区域,再和分割灰度图分割出来的字符区域图像进行求交集
最终提取出原图中的“进”字
*再求一次交集
intersection (RegionIntersection, Regions, RegionIntersection1)