一、提要:
Halcon的基本概念是【图像,区域,轮廓线】,初学者务必要搞清三者区别和联系。以下介绍如何将一个图像的区域截取出来,保存成另外的图像。本文用来加强概念,并用以下案例去理解概念的用途。
二、【图像,区域,轮廓线】概念是
何为图像?就是以一个矩阵模式,存储的矩形块,块内每一点都有一个灰度值。
何为区域?区域类似于mask,是个二值化的结构,也就是说,区域没有灰度的概念,只有1和0,表示“有用”像素点和“没用”像素点,实际当中,区域只包含“有用”像素的坐标,用get_region_points函数获取这些坐标,用get_gray_value获取这些点对应的灰度。区域是个坐标集合,它对应了任意对象的形状范围,并以(row,column)的表格形式存在。根据区域提供的坐标线索,可以提取出图像中的像素。
何为轮廓线?轮廓线也是一个集合,是区域对应的最外边界的点的集合,也以(row,column)的表格形式存在。
以上所述,大家要注意“图像、区域、轮廓”的数据结构不同,所起的作用也不同,通常,可以相互转化,就是说,通过区域,得到对应的图像,或反之。
三、示范代码
好了,阅读下列示范代码:
read_image(Image,'monkey')
draw_ellipse(3600,Row,Column,Phi,Radius1,Radius2)
gen_ellipse(Ellipse,Row,Column,Phi,Radius1,Radius2)
reduce_domain(Image,Ellipse,GrayEllipse)
crop_domain(GrayEllipse, Image2)
write_image(Image2, 'bmp', 0, 'e:/monk01.bmp')
以上代码中:1)Image是个图像 2)draw_ellipse是手工在窗口(3600)上画一个椭圆,并自动得到椭圆的中心,扇角度,长短轴。 3)gen_ellipse是正式将所画椭圆转化成一个区域 4)reduce_domain是通过椭圆区域的mask获取图像对应位置的子图像,输出一个GrayEllipse是从Image抠出来的椭圆图像区域。4)crop_domain(GrayEllipse, Image2)将该区域的图像转化成矩形图像,可以存盘。
draw_ellipse(3600,Row,Column,Phi,Radius1,Radius2)
gen_ellipse(Ellipse,Row,Column,Phi,Radius1,Radius2)
以上是一对配合函数,表明先画一个椭圆,然后再生成此椭圆对应的区域。类似的语句是:
draw_ellipse(3600,Row,Column,Phi,Radius1,Radius2)
gen_ellipse_contour_xld(ContEllipse, Row, Column, Phi, Radius1, Radius2, rad(0), rad(260), 'positive', 1.5)
以上也是一对函数,即先画一个椭圆,然后再生成此椭圆所引生出的轮廓线。
reduce_domain(Image,Ellipse,GrayEllipse)
既然Ellipse是个区域Mask,就能同图像做交集用算,用reduce_domain这样的语句,操作后,结果是个图像和区域的混合体。
crop_domain(GrayEllipse, ImagePart1)
write_image(ImagePart1, 'bmp', 0, 'e:/monk01.bmp')
将图像和区域的混合体中区域部分截取出来存盘。
实验结果:分别是 原图,区域定义(红),抠出的可存盘的结果图(最右)。
四、练习题
假如我们要将猴子的两个眼睛挖出来,存到一个文件;对于两个不连通的区域,如何进行处理?答案如下:
以上习题告诉大家,区域可能不联通。如眼睛,虽然两只,但按照一个区域处理(union2(Ellipse1, Ellipse2, RegionUnion)语句)
read_image(Image,'monkey')
draw_ellipse(3600,Row,Column,Phi,Radius1,Radius2)
gen_ellipse(Ellipse1,Row,Column,Phi,Radius1,Radius2)
draw_ellipse(3600,Row1,Column1,Phi,Radius3,Radius4)
gen_ellipse(Ellipse2,Row1,Column1,Phi,Radius3,Radius4)
union2(Ellipse1, Ellipse2, RegionUnion)
reduce_domain(Image,RegionUnion,GrayEllipse)
crop_domain(GrayEllipse, ImagePart1)
write_image(ImagePart1, 'bmp', 0, 'e:/monk02.bmp')
五、结果图