halcon学习笔记

读取图片:

read_image (Image, 'C: /test.png')

Halcon的一些基本数据结构:

(1)Image:指Halcon的图像类型,由矩阵数据组成,矩阵中的每个值表示一个像素。Image中含有单通道或者多通道的颜色信息。
(2)Region:指图像中的一块区域。该区域数据由点的坐标组成,表达的意义类似于一个范围。可以用Region来创建一个感兴趣区域(Region of Interest,ROI),该区域可以是任意形状,可以包含孔洞,甚至可以是不连续的点。
(3)XLD:指图像中某一块区域的轮廓,由Region边缘的连续的点组成。
(4)Tuple:类似于数组,可以用于存储一幅或多幅图像。如果要对一些图像进行批处理,可以将这些图像存入Tuple进行一次性处理。

阈值处理并计数demo:

read_image(ImageBase,'D:/data/a.png')
*获取图像的大小,以建立合适尺寸的窗口
*get_image_size (ImageBase, Width, Height)
*创建新的显示窗口
*dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
*将图像转换为单通道灰度图像
rgb1_to_gray(ImageBase,GrayImage)
dev_display (GrayImage)
*使用阈值处理提取较暗部分
threshold (GrayImage, DarkArea, 0, 80)
*填充区域
fill_up (DarkArea, RegionFillUp)
*将不相连的区域整体分割成独立的区域
connection (RegionFillUp, ConnectedRegions)
*排除杂点,将面积较大的目标选择出来
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and',0, 1000)

二、仿射变换

平移:

read_image(ImageBase,'D:/data/a.png')
*创建一个空的仿射变换矩阵
hom_mat2d_identity (HomMat2DIdentity)
*向y方向平移30个像素,x方向平移20个像素
hom_mat2d_translate (HomMat2DIdentity, 30,20, HomMat2DTranslate)
affine_trans_image(ImageBase, ImageAffineTrans, HomMat2DTranslate, 'constant', 'false')

旋转:

read_image(ImageBase,'D:/data/a.png')
*创建一个空的仿射变换矩阵
hom_mat2d_identity (HomMat2DIdentity)
*以(300,100)为参考点旋转30度
hom_mat2d_rotate(HomMat2DIdentity,30,300, 100, HomMat2DRotate)
affine_trans_image(ImageBase, ImageAffineTrans, HomMat2DRotate, 'constant', 'false')

缩放:

read_image(ImageBase,'D:/data/a.png')
*创建一个空的仿射变换矩阵
hom_mat2d_identity (HomMat2DIdentity)
*以(250,150)为参考点放大两倍
hom_mat2d_scale(HomMat2DIdentity,2, 2,250,150, HomMat2DScale)
affine_trans_image(ImageBase, ImageAffineTrans, HomMat2DScale, 'constant', 'false')

三、透视变换(待完善):

read_image(ImageBase,'D:/data/b.png')
rgb1_to_gray(ImageBase, GrayImage)
*获取图像的尺寸
get_image_size(GrayImage, Width, Height)
*新建显示窗口,适应图像尺寸
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(GrayImage)
*初始化角点坐标
XCoordCorners:=[]
YCoordCorners:=[]
*阈值处理,提取较暗的区域
threshold(GrayImage,DarkRegion,0, 80)

*分离不相连的区域
connection (DarkRegion, ConnectedRegions)

*选择面积最大的暗色区域,即屏幕区域
select_shape_std (ConnectedRegions, displayRegion, 'max_area', 70)
*裁剪屏幕区域
reduce_domain (GrayImage, displayRegion, displayImage)
*创建边缘轮廓
gen_contour_region_xld (displayRegion, Contours, 'border')

*将轮廓分割为边
segment_contours_xld (Contours, ContoursSplit, 'lines', 5, 4, 2)
*获取边的数量
count_obj (ContoursSplit, Number)
*存储每条边的起点位置
for index:=1 to Number by 1 
    select_obj(ContoursSplit, ObjectCurrent, index)
*拟合每条边
    fit_line_contour_xld(ObjectCurrent, 'tukey', -1, 0, 5, 2, RowBegin, ColBegin, RowEnd, ColEnd, Nr, Nc, Dist)
endfor
*投影变换,为4个特征点与矫正后的坐标建立关联
XOff:=100
YOff:=100*Height/Width
*投影变换,为4个特征点与矫正后的坐标建立关联
hom_vector_to_proj_hom_mat2d(XCoordCorners, YCoordCorners, [1,1,1,1], [YOff,YOff,Height-YOff,Height-YOff], [XOff,Width-XOff,Width-XOff,XOff], [1,1,1,1], 'normalized_dlt', HomMat2D)
*投影变换
projective_trans_image(displayImage, TransImage, HomMat2D, 'bilinear', 'false', 'false')
*显示矫正结果
dev_display(TransImage)

四、ROI

read_image(ImageBase,'D:/data/b.png')
get_image_size(ImageBase, Width, Height)
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_display(ImageBase)
*选择ROI,指定矩形顶点坐标(y1,x1,y2,x2)
gen_rectangle1(Rectangle, 30, 10, 320, 450)
*从原图中分割出ROI
reduce_domain(ImageBase, Rectangle, ImageReduced)

五、图像增强

5.1、直方图均衡化

read_image(ImageBase,'D:/data/c.png')
rgb1_to_gray(ImageBase, GrayImage)
*直方图均衡化
equ_histo_image(GrayImage, ImageEquHisto)
*显示直方图
*原始直方图
gray_histo(GrayImage,GrayImage, AbsoluteHisto1, RelativeHisto1)
*均衡化后的直方图
gray_histo(ImageEquHisto,ImageEquHisto, AbsoluteHisto2, RelativeHisto2)

5.2、对比度增强

增强边缘对比度:

read_image(ImageBase,'D:/data/d.png')
emphasize(ImageBase, ImageEmphasize, 10, 10, 1.5)
dev_display(ImageEmphasize)

增强明暗对比度:

read_image(ImageBase,'D:/data/d.png')
scale_image_max(ImageBase, ImageScaleMax)
dev_display(ImageScaleMax)

5.3、处理失焦图像

read_image(ImageBase,'D:/data/e.png')
*使用canny
shock_filter(ImageBase, SharpenedImage, 0.5, 20, 'canny', 1)
*使用拉普拉斯
*shock_filter(ImageBase, SharpenedImage, 0.5, 20, 'laplace', 1)
dev_display(SharpenedImage)

5.4、图像平滑与去噪

read_image(ImageBase,'D:/data/f.png')
*均值滤波
*mean_image(ImageBase, ImageMean, 9, 9)
*中值滤波,circle表示邻域的形状,也可以选择square,卷积核的尺寸,这里选择3。continued表示边界的处理方式,因为边界处往往无法移动滤波“窗口”,因此需要对像素做一些补充。这里选择continued,表示延伸边界像素。也可以选择cyclic,表示循环延伸边界像素
*median_image(ImageBase, ImageMedian, 'circle', 3, 'continued')
*高斯滤波
gauss_filter(ImageBase, ImageGauss, 5)
dev_display(ImageGauss)

5.5 光照不均匀

采用通道分离的方式对彩色图像进行光线均衡化处理:
read_image(ImageBase,'D:/data/g.png')
*子将图像分离成红绿蓝3个通道,并将每个通道单独存成一幅图像。
decompose3(ImageBase, Image1, Image2, Image3)
mean_image(Image1, ImageMean1, 9, 9)
*对每个颜色通道的图像进行直方图均衡,使其色彩过渡更加平滑。
emphasize(ImageMean1,em1, 5, 5, 1.5)
illuminate(em1,Image1,20,20,0.55)
equ_histo_image(Image2, ImageEquHisto2)

六、图像分割

图像分割的标准可以是像素的灰度、边界、几何形状、颜色,甚至是纹理。

6.1、全局阈值处理

read_image(ImageBase,'D:/data/h.png')
rgb1_to_gray(ImageBase, GrayImage)
*DarkArea为输出的区域,类型为Region
threshold(GrayImage,DarkArea,0, 128)

6.2、基于直方图的自动阈值分割方法

其原理是,以灰度直方图中出现的谷底为分割点,对灰度直方图的波峰进行分割。因此,有多少个波峰,就会分割出多少个区域。
read_image(ImageBase,'D:/data/i.png')
rgb1_to_gray(ImageBase, GrayImage)
auto_threshold(GrayImage, Regions, 8)

二值阈值分割:

read_image(ImageBase,'D:/data/h.png')
rgb1_to_gray(ImageBase, GrayImage)
*max_separability,表示在直方图中对最大的可分性进行分割;也可以选择smooth_histo,表示平滑直方图
*dark,表示提取较暗的部分;也可以选择light,表示提取较亮的部分
binary_threshold(GrayImage, Region, 'max_separability', 'dark', UsedThreshold)

6.3、局部阈值分割方法

dyn_threshold算子利用局部像素灰度差进行分割:

read_image(ImageBase,'D:/data/h.png')
rgb1_to_gray(ImageBase, GrayImage)
*由于图像对比度比较低,因此对图像进行相乘,增强对比度
mult_image (GrayImage, GrayImage, ImageResult, 0.005, 0)
*使用平滑滤波器对原始图像进行适当平滑
mean_image (ImageResult, ImageMean, 50,50)
*动态阈值分割,提取字符区域
dyn_threshold (ImageResult, ImageMean, RegionDynThresh, 4, 'not_equal')
read_image(ImageBase,'D:/data/j.png')
rgb1_to_gray(ImageBase, GrayImage)
mean_image(GrayImage, ImageMean, 30, 30)
dyn_threshold(GrayImage, ImageMean, RegionDynThresh, 30, 'light')

var_threshold算子分割的依据是局部的均值和标准差,选择图像中邻域像素满足阈值条件的区域进行分割,使用var_threshold算子进行阈值分割后的图像,灰度变化符合阈值的区域被提取了出来:
read_image(ImageBase,'D:/data/k.png')
rgb1_to_gray(ImageBase, GrayImage)
*设置矩形,选择感兴趣区域
gen_rectangle1(Rectangle,90,83,492,702)
reduce_domain(GrayImage, Rectangle, ImageReduced)
*主要是调整20这个参数
var_threshold(ImageReduced,Rectangle, 15, 15, 0.2,20, 'dark')

char_threshold适用于在明亮的背景上提取黑暗的字符:
read_image(ImageBase,'D:/data/l.png')
rgb1_to_gray(ImageBase, GrayImage)
char_threshold(GrayImage, GrayImage, Characters, 2, 95, Threshold)
适用于直方图的波峰之间没有明确的谷底的情况,或者是直方图没有明确 的峰值的情况。
双阈值处理dual_threshold。

6.4、区域生长法

read_image(ImageBase,'D:/data/m.png')
mean_image(ImageBase, ImageMean, 5, 5)
regiongrowing(ImageMean, Regions, 3, 3, 6, 100)
regiongrowing_mean算子的输入需要是灰度均值图像
read_image(ImageBase,'D:/data/m.png')
median_image(ImageBase, ImageMedian, 'circle', 1, 'mirrored')
*寻找颜色相似的邻域
regiongrowing(ImageMedian, Regions, 3, 3, 6, 100)
*对图像进行粗略的区域分割,提取满足条件的各个独立区域
shape_trans(Regions, RegionTrans, 'convex')
connection(RegionTrans, ConnectedRegions)
*计算出初步提取的区域的中心点坐标
area_center(ConnectedRegions, Area, Row, Column)

6.5、分水岭算法

watersheds(Image : Basins, Watersheds : : )
(1)参数1:Image为输入的图像,一般为单通道图像。这里要注意,因为盆地一般指的是灰度值低的区域,所以如果前景目标比较亮而背景比较暗,可以在导入图像后使用invert_image算子将图像颜色进行反转。
(2)参数2:Basins为输出的盆地区域。
(3)参数3:Watersheds为输出的分水岭区域。一般一幅输入图像对应一个分水岭区域,而输出的Basins区域则是多个区域的集合。
watersheds_threshold(Image : Basins:Threshold: )
(1)参数1:Image为输入的图像,一般为单通道图像。如果前景目标比较亮而背景比较暗,可以在导入图像后使用invert_image算子将图像颜色进行反转。
(2)参数2:Basins为输出的盆地区域。
(3)参数3:Threshold为设置的灰度阈值。建议该值不要超过原图的最大灰度,否则将无法提取出分水岭,图像整体将作为一个区域被提取出来。
read_image(ImageBase,'D:/data/000.png')
rgb1_to_gray(ImageBase, GrayImage)
gauss_filter(GrayImage, ImageGauss, 11)
watersheds(ImageGauss, Basins, Watersheds)

七、彩色图像处理与纹理分析

Bayer图像,即每个像素只有一个颜色分量的图像。
texture_laws算子提供了各种纹理滤波器的集合。滤波器的类型有7种:level、edge、spot、wave、ripple、undulation、oscillation。
(1)参数1为输入图像Image。
(2)参数2为输出纹理。
(3)参数3为滤波的类型FilterType。这里的类型参数由两个字母组成,两个字母都取自7种滤波器类型的首字母,如l表示level,e表示edge,s表示spot等。第1个字母表示行方向上的滤波类型,第2个字母表示列方向上的滤波类型,如ss表示两个方向都使用spot滤波器。
(4)参数4为偏移量shift。当灰度值大于255时,可降低灰度值。
该参数用于调整结果图像的灰度,默认为2。
(5)参数5为滤波器的卷积核尺寸,默认为5,可选择的有3、5、7。
read_image(ImageBase,'D:/data/n.png')
*将图像分解成R、G、B3个通道
decompose3(ImageBase, Image1, Image2, Image3)
*将R、G、B3个通道的图像转化为HSV颜色空间
trans_from_rgb(Image1, Image1, Image1, ImageResult1, ImageResult2, ImageResult3, 'hsv')
*进行纹理检测,其中选择的滤波器类型是ls,即行方向用level,列方向用spot进行检测*这种滤波器类型适合检测垂直方向上的缺陷
texture_laws(ImageResult2, ImageTexture, 'ls', 2, 7)
*对经过滤波器处理后的图像进行均值化,使图像更平滑,缺陷区域更明显
mean_image(ImageTexture, ImageMean, 11, 11)
*对检测出的缺陷区域进行形态学处理并显示出来
threshold(ImageMean, Region,60, 255)
*将符合条件的区域分割成独立区域
connection(Region, ConnectedRegions)

例:木材截面图像的分割与计数

read_image(ImageBase,'D:/data/o.png')
get_image_size(ImageBase, Width, Height)
rgb1_to_gray(ImageBase, GrayImage)
*进行全局阈值分割,将亮色区域提取出来
threshold(GrayImage,Bright,60, 255)
*进行开运算处理,去除边缘毛刺
opening_rectangle1(Bright,Cut,1,7)
*将非连通区域分割成独立区域
connection(Cut, ConnectedRegions)
*选择截面比较小的木材的区域
select_shape(ConnectedRegions, smallRegions, 'area', 'and',500,20000)
*对粘连区域做腐蚀操作,根据腐蚀的情况和面积选出截面区域
count_obj(smallRegions,Number1)
*选择截面比较大的木材的区域,可能有粘连和区域重叠的情况
select_shape(ConnectedRegions,largeRegions, 'area', 'and', 20000,1000000)
erosion_circle(largeRegions, erisionedLargeRegions, 8.5)
*将非连通区域分割成独立区域
connection(erisionedLargeRegions, ConnectedRegions2)
*再次选择符合面积条件的区域,排除杂点
select_shape(ConnectedRegions2, SelectedRegions, 'area', 'and', 150, 99999)

八、特征提取

area_center返回面积和中心点。(阈值分割提取物体并计数实例)

read_image(ImageBase,'D:/data/k.png')
get_image_size(ImageBase, Width, Height)
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
rgb1_to_gray(ImageBase, GrayImage)
*创建矩形选区,选择感兴趣区域
gen_rectangle1(Rectangle, 90,83,492,702)
reduce_domain(GrayImage, Rectangle, ROI)
*阈值处理,提取其中的圆孔
threshold(ROI, Region,0,90)
*将提取的整个区域中不相连的部分分割成独立的区域
connection(Region, ConnectedRegions)
*获取不相连的区域的数量
count_obj(ConnectedRegions, Number)
*计算所有不相连区域的面积和中心点坐标
area_center(ConnectedRegions, Area, Row, Column)
area_holes算子计算图像中封闭区域(孔洞)的面积,返回所有孔洞区域的面积之和。
area_holes(Region, Area)

select_shape算子能高效地根据特征提取出符合条件的区域

select_shape(Regions :SelectedRegions : Features, Operation, Min, Max : )

参数1和参数2分别表示输入和输出的区域,值得关注的是参数3 Features。这里提供了一个包括多种特征参数的列表,基本包括了区域的常用特征,使用者只需要选择需要的特征,并设置筛选条件,就能得到需要的区域。
(1)area:输入区域的面积。
(2)row:输入区域中心点的行坐标。
(3)column:输入区域中心点的列坐标。
(4)width:输入区域的宽度。
(5)height:输入区域的高度。
(6)circularity:输入区域的圆度。
(7)compactness:输入区域的紧密度。
(8)convexity:输入区域的凸包性。
(9)rectangularity:输入区域的矩形度。
(10)outer_radius:输入区域的最小外接圆的半径。
(11)inner_radius:输入区域的最大内接圆的半径。
(12)inner_width:输入区域的与坐标轴平行的最大内接矩形的宽度。
(13)inner_height:输入区域的与坐标轴平行的最大内接矩形的宽度。
(14)connect_num:输入区域中非连通区域的数量。
(15)holes_num:输入区域包含的孔洞数量。
(16)max_diameter:输入区域的最大直径。
使用select _shape算子进行面积筛选,无须单独计算每个区域的具体面积。
read_image(ImageBase,'D:/data/p.png')
dev_open_window_fit_image(ImageBase, 0, 0, -1, -1, WindowHandle)
*设置绘制的颜色
dev_set_color('white')
rgb1_to_gray(ImageBase, GrayImage)
*创建矩形选区,选择感兴趣区域
gen_rectangle1(Rectangle,80, 100, 300, 400)
reduce_domain(GrayImage, Rectangle,ROI)
gen_image_proto(ROI, ImageCleared, 0)
*进行阈值处理,提取出图中较暗的包含孔洞的区域
threshold(ROI, Region,50, 255)
*将不连通的部分独立分割出来,成为一组区域
connection(Region, ConnectedRegions)
*设置绘制的颜色,为了标记选择的区域
dev_set_color('magenta')
select_shape(ConnectedRegions, SelectedRegions, 'width', 'and',100,200)
使用inner_circle算子求最大内接圆,smallest_rectangle2算子求最小外接矩形的中心和几何参数
read_image(ImageBase,'D:/data/p.png')
get_image_size(ImageBase, Width, Height)
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
rgb1_to_gray(ImageBase, GrayImage)
gen_rectangle1(Rectangle,80, 100, 300, 400)
reduce_domain(GrayImage, Rectangle,ROI)
threshold(ROI, Region,50, 255)
connection(Region, ConnectedRegions)
select_shape_std(ConnectedRegions, SelectedRegions, 'max_area', 70)
*圆
inner_circle(SelectedRegions, Row, Column, Radius)
*矩形
smallest_rectangle1(SelectedRegions, Row1, Column1, Row2, Column2)
*最小外接矩形
smallest_rectangle2(SelectedRegions, Row1, Column1, Phi, Length1, Length2)
inner_rectangle1算子可以用来求一个区域的最大内接矩形,smallest_rectangle1算子可以用来求最小外接矩形。

8.2、基于灰度值的特征

gray_features算子用于计算指定区域的灰度特征值。其输入是一组区域,每个区域的特征都存储在一组value数组中。
基于灰度值的特征如下
(1)area:灰度区域面积。
(2)row:中心点的行坐标。
(3)colum:中心点的列坐标。
(4)ra:椭圆的长轴。
(5)rb:椭圆的短轴。
(6)phi:等效椭圆的角度。
(7)min:灰度的最小值。
(8)max:灰度的最大值。
(9)mean:灰度的均值。
(10)deviation:灰度值的偏差。
(11)plane_deviation:近似平面的偏差。
gray_features ( Regions, Image : : Features : Value )
参数1:Regions(输入参数),表示要检查的一组区域。
参数2:Image(输入参数),表示灰度值图像。
参数3:Features(输入参数),表示输入的特征的名字
参数4:Value(输出参数),表示输出的特征的值。
read_image(Image, 'D:/data/q.png')
threshold(Image, Region, 1, 255)
*提取区域中的最小最大灰度值
gray_features(Region, Image, 'min',MinDisp)
gray_features(Region, Image, 'max',MaxDisp)
min_max_gray算子计算区域的最大与最小灰度值。
min_max_gray ( Regions, Image : : Percent : Min, Max, Range )
其各参数的含义如下。
参数1:Regions(输入参数),表示图像上待检查的一组区域。
参数2:Image(输入参数),表示输入的灰度值图像。
参数3:Percent(输入参数),表示低于最大绝对灰度值的百分比。
参数4:Min(输出参数),表示最小的灰度值。
参数5:Max(输出参数),表示最大的灰度值。
参数6:Range(输出参数),表示最大和最小值之间的区间
设置一个百分比值,设为5,即取直方图波峰与谷底之间的区域,向内收缩5
%:
read_image(Image, 'D:/data/q.png')
threshold(Image, Region, 1, 255)
*提取该区域中的最大和最小灰度值
min_max_gray(Region, Image,5, Min, Max, Range)
intensity算子用于计算单张图像上多个区域的灰度值的平均值和偏差
intensity ( Regions, Image : : : Mean, Deviation )
其各参数的含义如下
参数1:Regions(输入参数),表示图像上待检查的一组区域。
参数2:Image(输入参数),表示输入的灰度值图像。
参数3:Mean(输出参数),表示输出的单个区域的灰度平均值。
参数4:Deviation(输出参数),表示输出的单个区域的灰度偏差
read_image(Image, 'D:/data/q.png')
threshold(Image, Region, 1, 255)
*提取该区域中灰度值的平均值和偏差
intensity(Region, Image, Mean, Deviation)
area_center_gray算子计算一幅灰度值图像的面积和中心
area_center_gray(Region, Image: : : Area, Row, Colum)
其各参数的含义如下
参数1:Regions(输入参数),表示要检查的区域。
参数2:Image(输入参数),表示灰度值图像。
参数3:Area(输出参数),表示区域的总灰度值。
参数4:Row(输出参数),表示灰度值重心的行坐标。
参数5:Column(输出参数),表示灰度值重心的列坐标
read_image(Image, 'D:/data/q.png')
threshold(Image, Region, 1, 255)
area_center_gray(Region, Image, Area, Row, Column)

8.3、根据灰度特征值选择区域

select_gray算子能接受一组区域作为输入,然后根据选定的特征计算其是否满足特定的条件。当所有区域的特征都计算结束后,图像将在原来的灰度图上输出符合设定条件的区域。
select_gray ( Regions, Image : SelectedRegions : Features, Operation, Min, Max : )
参数1:Regions(输入参数),表示图像上待检查的一组区域。
参数2:Image(输入参数),表示输入的单通道图像。
参数3:SelectedRegions(输出参数),表示特征的局部关联性。
参数4:Features(输入参数),表示选择的特征。
参数5:Operation(输入参数),表示低于最大绝对灰度值的百分比。
参数6:Min(输入参数),表示最小的灰度值,默认为128。
参数7:Max(输入参数),表示最大的灰度值,默认为255。
用灰度偏差特征将偏差较小的区域提取出来:
read_image(Image, 'D:/data/m.png')
get_image_size(Image, Width, Height)
dev_open_window(0, 0, Width, Height, 'white', WindowHandle)
rgb1_to_gray(Image, GrayImage)
*使用均值滤波对灰度图像进行平滑处理,以去除细节杂点
median_image(GrayImage, ImageMedian, 'circle', 2, 'mirrored')
*进行阈值处理,提取出较暗部分
threshold(ImageMedian, Region,50,130)
*使用开运算将各区域分离
opening_circle(Region, RegionOpening, 3.5)
*将不连通的区域分隔开来
connection(RegionOpening, ConnectedRegions)
*将面积较大的区域提取出来
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and',10000, 99999)

8.3、根据纹理特征值选择区域

纹理特征是在包含多个像素点的区域进行统计和分析,反映的是物体表面的一些特性,它可以用来反映物体表面灰度像素的排列状况。
图像的纹理特征一般包括图像的能量、相关性、局部均匀性、对比度等。
Halcon中使用灰度共生矩阵来描述这些特征。
灰度共生矩阵就是表现这一对灰度值的取值范围和频率的矩阵。
该矩阵 的行或者列的维度为原图的灰度等级数。二值图像,灰度等级就为2,灰度共生矩阵的维度也为2。该矩阵有如下特性。
(1)能量:表示灰度共生矩阵中的元素的平方和。能量值大,表示灰度变化
比较稳定,反映了纹理变化的均匀程度。
(2)相关性:表示纹理在行或者列方向的相似程度。相关性越大,相似性越
高。
(3)局部均匀性:反映图像局部纹理的变化量。这个值越大,表示图像局部
的变化越小。
(4)反差:表示矩阵的值的差异程度,也间接表现了图像的局部灰度变化幅
度。反差值越大,图像中的纹理深浅越明显,表示图像越清晰;反之,则表示图像
越模糊。
gen_cooc_matrix创建灰度共生矩阵,灰度共生矩阵的方向通常取0°、45°、90°、135°。
根据输入区域的灰度像素来确定在某个方向彼此相邻的频率,将该频率存储在共生矩阵中。
例如, 灰度0和2相邻出现的频率为3次,则灰度共生矩阵的(0,2)坐标处的值为3。
gen_cooc_matrix(Regions,Image:Matrix:LdGray,Direction : )
参数1:Regions(输入参数),表示输入的区域。
参数2:Image(输入参数),表示输入的单通道灰度图像。
参数3:Matrix(输出参数),表示输出的灰度共生矩阵,为real类型。
参数4:LdGray(输入参数),表示图中灰度值的级数,即有多少种灰度颜色。默认为6,也可以取1~256的整数。
参数5:Direction(输入参数),表示相邻像素的方向。默认为0 ,还可以选择45、90、135。
cooc_feature_matrix算子根据灰度共生矩阵(Coo_Matrix)计算能量(Energy)、相关性(Correlation)、局部均匀性(Homogeneity)和对比度(Contrast)。
cooc_feature_matrix(CoocMatrix : : : Energy, Correlation, Homogeneity, Contrast)
参数1:CoocMatrix(输入参数),表示灰度共生矩阵。
参数2:Energy(输出参数),表示灰度值的能量值,即纹理变化的均匀性。这个值越大,灰度变化越稳定。
参数3:Correlation(输出参数),表示灰度值的相关性。
参数4:Homogeneity(输出参数),表示灰度值的局部均匀性。
参数5:Contrast(输出参数),表示灰度值的对比度,或者说是灰度值的反差。这个值越大,反差越明显。
cooc_feature_image类似于连续执行gen_cooc_matrix算子和cooc_feature_matrix算子。
cooc_feature_image(Regions, Image: : LdGray, Direction: Energy, Correlation, Homogeneity, Contrast)
参数1:Regions(输入参数),表示要检查的区域。
参数2:Image(输入参数),表示灰度值图像。
参数3:LdGray(输入参数),表示要区分的灰度值的层级数。默认为
6,还可以选择1、2、3、4、5、7、8。
参数4:Direction(输入参数),表示相邻灰度对的计算方向。默
认为0,还可以选择45、90、135、mean,其中mean表示各方向的均值。
参数5:Energy(输出参数),表示灰度值能量,即纹理变化的均匀性。
参数6:Correlation(输出参数),表示灰度值的相关性。
参数7:Homogeneity(输出参数),表示灰度值的局部同质性。
参数8:Contrast(输出参数),表示灰度值的对比度,或者说是灰
度值的反差。这个值越大,反差越明显。
红色矩形灰度变化明显;能量值比较小 ,表示纹理的均匀性比较低,变化比较大;对比度比较高,说明灰度的变化比较大 ,边界比较明显。而右边黄色矩形内的图像的纹理变化不大,灰度相关性高,表示纹理在行或者列方向都非常相似;对比度低,表现了图像的局部灰度变化不明显。
read_image(Image, 'D:/data/r.png')
rgb1_to_gray(Image, GrayImage)
get_image_size(GrayImage, Width, Height)
dev_open_window(0, 512, 320, 320, 'black', WindowHandle1)
dev_open_window(512, 512, 320, 320, 'black', WindowHandle2)
*分别设置两个矩阵,选择不同的两部分区域
gen_rectangle1(Rectangle1,95,343,197,464)
gen_rectangle1(Rectangle2,353,328,403,388)
*分别对两个矩形求取灰度共生矩阵Matrix1和Matrix2
gen_cooc_matrix(Rectangle1, GrayImage, Matrix1, 6, 0)
gen_cooc_matrix(Rectangle2, GrayImage, Matrix2, 6, 0)
*分别对Matrix1和Matrix2提取灰度特征参数
cooc_feature_matrix(Matrix1, Energy1, Correlation1, Homogeneity1, Contrast1)
cooc_feature_matrix(Matrix2, Energy2, Correlation2, Homogeneity2, Contrast2)
*直接对矩阵2的图像求灰度特征参数
cooc_feature_image(Rectangle2,GrayImage, 6, 0, Energy, Correlation, Homogeneity, Contrast)

九、边缘检测

使用sobel_amp算子检测图像的边缘
sobel_amp(Image : EdgeAmplitude : FilterType, Size : )
参数1:Image为输入的图像,这里是单通道图像。
参数2:EdgeAmplitude为输出参数,是带有边缘梯度的图像。
参数3:FilterType为输入参数,表示卷积核或滤波器的类型。
参数4:Size为输入参数,表示滤波器的尺寸。该参数值越大,得到的边
缘线条会越粗,细节越少。这个值一般为单数,默认为3,也可以根据图像的检测
需要选择合适的奇数。
read_image(Image, 'D:/data/s.png')
rgb1_to_gray(Image, GrayImage)
*获取带有边缘梯度的图像
sobel_amp(GrayImage, EdgeAmplitude, 'sum_abs', 3)
*通过阈值处理去除一些非关键的轮廓点和线
threshold(EdgeAmplitude, Region, 100, 255)
*将边缘框架显示出来
skeleton(Region, Skeleton)
edges_image算子使用递归实现的滤波器(如Deriche、Lanser和Shen)检测边缘,也可以使用高斯导数滤波器检测边缘。
edges_image(Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )
参数1:Image为输入的单通道图像。
参数2:ImaAmp为输出的边缘梯度图像。
参数3:ImaDir为输出的边缘方向图像。
参数4:Filter为输入参数,表示选择的滤波算子。默认为canny ,也可以选择deriche1、deriche1_int4、deriche2、deriche2_int4、lanser1、lanser2、mshen、shen、sobel_fast。
参数5:Alpha为输入参数,表示平滑的程度。值越小,表示平滑的程度越大。默认是0,也可以取0.1到1.1之间的值。
​​​参数6:NMS表示非极大值抑制。默认为nms,表示使用非极大值抑制;也可以设为none,表示不使用非极大值抑制。使用非极大值抑制可以使模糊的 边界变得清晰。
参数7和8:Low和High分别表示滞后阈值的低阈值和高阈值。边缘梯 度比高阈值大的部分是可以被接受的;低于低阈值的部分将被排除;介于两者之间的,要看该像素是否与边缘点相连,相连的可以认为是边缘。
edges_color算子用于提取彩色图像的边缘
edges_color(Image : ImaAmp, ImaDir : Filter, Alpha, NMS, Low, High : )
derivate_gauss算子可以提取图像边缘、平滑图像、边缘检测:提取图像的边缘、角点检测:检测图像上的角点。
derivate_gauss(Image : DerivGauss : Sigma, Component : )
参数1:Image为输入的灰度图像。
参数2:DerivGauss为输出的滤波后的图像。
参数3:Sigma为输入的高斯导数的sigma值。
参数4:Component为输入的要计算的导数或者特征。这里有以下几
种类型可以选择。
(1)none:仅对图像进行平滑处理。
(2)x:沿着轴方向求导。
(3)y:沿着轴方向求导。
(4)gradient:求梯度的绝对值。
(5)gradient_dir:求梯度的方向。
(6)xx:沿着轴方向二阶求导。
(7)yy:沿着轴方向二阶求导。
(8)laplace:使用Laplace算子求导。
laplace算子对孤立像素的响应要比对边缘或线的响应更强烈,因此在检测之前应先进行去噪处理。laplace(Image : ImageLaplace : ResultType, MaskSize, FilterMask : )
参数1:Image为输入的多通道图像。
参数2:ImageLaplace为输出的laplace图像。
参数3:ResultType为输入的图像的类型。
参数4:MaskSize为输入的滤波器的核的尺寸。默认为3,可选范围是3~39的奇数。
参数5:FilterMask为输入参数,表示laplace算子使用的滤波核或掩膜的类型。默认为n_4。
经过laplace滤波后,使用zero_crossing算子进行过零点检测。
通过 检测图像的二阶导数的零交点,可以得到边缘的位置。
read_image(Image, 'D:/data/s.png')
laplace(Image, ImageLaplace, 'signed', 11, 'n_8_isotropic')
zero_crossing(ImageLaplace, RegionCrossing)
laplace算子对噪声比较敏感,高斯-拉普拉斯算法将高斯的低通滤波器和laplace算子进行了结合
laplace_of_gauss(Image : ImageLaplace : Sigma : )
参数1:Image为输入的图像,可以是多通道的。
参数2:ImageLaplace为输出的经过高斯-拉普拉斯滤波后的图像。
参数3:Sigma为高斯平滑参数。这个值越大,平滑力度越大,图像越模糊。
read_image(Image, 'D:/data/s.png')
laplace_of_gauss(Image, ImageLaplace, 2)
zero_crossing(ImageLaplace, RegionCrossing)

9.2、亚像素级边缘提取

实际工程中可能会需要比一个像素宽度更小的精度,因此就有了亚像素级精度的概念。XLD表示亚像素的轮廓和多边形。有些边缘可能是断裂的,所以需要先进行轮廓合并。
edges_sub_pix(Image : Edges, Filter, Alpha, Low, High : )
参数1:Image为输入的单通道图像。
参数2:Edges为输出的XLD轮廓。
参数3:Filter为输入参数,与edges_image算子中的Filter参数类似,表示选择的滤波算子。默认的是canny,可选的有canny、deriche1、deriche1_int4、deriche2、deriche2_int4、lanser1、lanser2、mshen、shen、sobel_fast,还有一些以“_junctions”结尾的滤波器,适用于一些非连接的边缘。
参数4:Alpha为输入参数,表示平滑的程度。其值越小,表示平滑的程 度越大。默认是0,可以取0.1到1.1之间的值。
参数5和6:Low和High分别表示滞后阈值的低阈值和高阈值。低阈值越低,图像的细节会越丰富。
read_image(Image, 'D:/data/s.png')
rgb1_to_gray(Image, GrayImage)
*进行亚像素边缘提取,分别使用不同的滞后阈值以便进行对比
edges_sub_pix(GrayImage, Edges1,'lanser2', 0.5, 5, 50)
edges_sub_pix(GrayImage, Edges2, 'lanser2', 0.5, 25, 50)
edges_color_sub_pix算子提取彩色多通道图像的亚像素边缘
read_image(Image, 'D:/data/s.png')
*使用canny算子进行亚像素边缘提取
edges_color_sub_pix(Image, Edges2, 'canny', 0.5, 5, 50)
edges_color_sub_pix(Image, Edges1,'sobel_fast', 0.5, 40, 70)
lines_gauss算子用于提取边缘线段,它的鲁棒性非常好,提取出的线段类型是亚像素精度的XLD轮廓。
lines_gauss(Image : Lines : Sigma, Low, High, LightDark, ExtractWidth, LineModel, CompleteJunctions : )
参数1:Image为输入的单通道图像。
参数2:Lines为输出的一组亚像素精度的XLD轮廓线条。
参数3:Sigma为输入的高斯平滑的值。较大的平滑值会使图像平滑的力度更大,但过度平滑也可能导致提取的线条位置有偏差。默认为1.5。在需要提取线条宽度时,Sigma的值应根据要提取的线条宽度进行调节,最小值应不小于/(为线条宽度 ,即线条直径的一半)。例如,对于宽度为4的线条,Sigma值应不小于2.3。
参数4和5:Low和High为输入参数,分别表示滞后阈值的低阈值和高阈值。高阈值越低,边缘线条的细节会越丰富.如果Sigma选得比较大,阈值就应选择较低的高阈值和较高的低阈值。因为选择的
Sigma越大,二阶导数就越小。低阈值和高阈值也可以根据要提取的线的相应灰度对比度和Sigma参数值进行计算。
参数6:LightDark为输入参数,表示提取较亮的线条还是较暗的线条。默认为light,即提取较亮线条。
参数7:ExtractWidth为输入参数,表示是否需要提取线条的宽度。默认为true,即提取每条线段的宽度值。
参数8:LineModel为输入参数,表示调整线条位置和宽度的线段模型。可选的有bar-shaped(条型)、gaussian(高斯型)、parabolic(抛物线型)。
LineModel仅在ExtractWidth为true时才有意义。
参数9:CompleteJunctions 为输入参数,表示是否添加连接,用于边缘线段不连续的情况,默认为true。
read_image(Image, 'D:/data/s.png')
rgb1_to_gray(Image, GrayImage)
dev_open_window(0,512, 512, 512, 'black', WindowHandle)
*进行边缘检测
lines_gauss(GrayImage, Lines, 1.5,1, 8, 'light', 'true', 'bar-shaped', 'true')

9.3、轮廓处理

轮廓的生成

edges_ sub_pix、edges_color_sub_pix
使用gen_contour_attrib_xld算子或者gen_contour_global_attrib_xld算子通过属性名称访问轮廓的某个属性,这些属性一般是以Tuple数组形式存放的。典型的属性有关于边缘的属性,如梯度和方向;关于线条的属性,如线宽等。还可以使用query_contour_attrib_xld算子或者query_contour_global_attrib_xld算子对给定的轮廓进行属性查询。

轮廓的处理

轮廓分割
segment_contours_xld算子将轮廓分割成线段、圆弧或者椭圆等预定义的形状,分割出的各个线段可以使用select_obj算子对轮廓进行选择。gen_polygons_xld算子和split_contours_xld算子组合可分割线段。
轮廓的连接
union_collinear_contours_xld算子适用于共线的连接 ,union_straight_contours_xld算子适用于同方向的邻近轮廓。 union_adjacent_contours_xld。
shape_trans_xld算子用于修改形状,把轮廓转换成包围的圆或者矩形等。union2_closed_contours_xld
read_image(Image, 'D:/data/i.png')
rgb1_to_gray(Image, GrayImage)
get_image_size(GrayImage, Width, Height)
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
*提取出的亚像素边缘的图像,得到一个初始轮廓
edges_sub_pix(GrayImage, Edges, 'canny',2.5,15, 40)
*对上一步的轮廓进行分割
segment_contours_xld(Edges, ContoursSplit, 'lines_circles', 5, 4, 2)
*提取出轮廓中较长的部分线段
select_contours_xld(ContoursSplit, SelectedContours, 'contour_length', 0.5, 200, -0.5, 0.5)
选择的特征也可以是其他特征,如direction表示方向,curvature表示曲率等。还可以根据线段两端的距离阈值选择closed或者open。
轮廓的拟合
拟合直线使用fit_line_contour_xld算子。gen_contour_polygon_xld算子可以查看直线的显示结果。
拟合圆形使用fit_circle_contour_xld算子。gen_circle_contour_xld算子查看拟和结果。
拟合矩形选择fit_rectangle2_contour_xld算子,gen_rectangle2_contour_xld算子可以显示拟合结果。
拟合椭圆形可以用fit_ellipse_contour_xld。
read_image(Image, 'D:/data/s.png')
rgb1_to_gray(Image, GrayImage)
get_image_size(GrayImage, Width, Height)
dev_open_window(0, 0, Width, Height, 'black', WindowHandle)
dev_set_color('white')
*对图像进行阈值处理
threshold(GrayImage, Region, 130, 255)
*使用闭运算进行填充
closing_circle(Region, RegionClosing, 20.5)
*获取前景目标的初始轮廓
gen_contour_region_xld(RegionClosing, Contours, 'border')
*拟合圆形轮廓,得出圆形的特征参数
fit_circle_contour_xld(Contours, 'algebraic', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
gen_circle_contour_xld(ContCircle, Row, Column, Radius, 0, 6.28318, 'positive',1)

十、模板匹配

10.1、基于相关性的模板匹配

使用一种归一化的互相关匹配来衡量模板图像和检测图像之间的关系,与基于形状模板的匹配算法相比,它的优势是对一些形状有细微变化的、纹理复杂的或者是聚焦模糊的检测图像都能检索得到。但是,该方法也有其局限性,如果与参考图像相比,检测图像的位移、旋转或者缩放比较大,可能会导致匹配失败。
(1)从参考图像上选择检测的目标。使用矩形选区等方式,从参考图像上选
择一块ROI,然后使用reduce_domain算子将该区域裁剪成一个独立的图像区域。
(2)创建模板。用上一步裁剪后的图像创建一个归一化的互相关模型,使用的是create_ncc_model算子。该算子的原型如下:
create_ncc_model(Template : : NumLevels, AngleStart, AngleExtent, AngleStep, Metric : ModelID)
参数Template是输入的包括了ROI的图像。参数NumLevel s是金字塔的层数,默认可以设为auto,程序将自动确定合适的金字塔层级数,该层级数可以通过get_ncc_model_params算子进行查看。
AngleStart和AngleExtent两个参数确定了模板图像可能出现在检测图像上的旋转角度范围,在这个范围内的旋转才有可能被搜索到。参数AngleStep为角度旋转变化的步长。模型的角度变化是在检测前进行预处理,并将旋转信息保存在内存中的。因此,旋转的角度大小和模型的点的数量决定了
所需内存的大小。也可以设置AngleStep为auto或0,则程序会自动确定合适的旋转角度。
参数ModelID是模板的句柄,供匹配算子find_ncc_model调用。在该算子中,有一个参数MinSore用于指定匹配分数的最小值,即低于这个匹配分数的匹配结果就不需要返回了。由于匹配分数是从归一化的互相关系数中来的,为了提升匹配速度,这个分数的阈值应该尽可能设置得高一点,但是
也要防止设得过高导致匹配失败。
read_image(Image, 'D:/data/a.png')
rgb1_to_gray(Image, GrayImage)
get_image_size(GrayImage, Width, Height)
dev_close_window()
dev_open_window(0, 0,Width, Height, 'black', WindowHandle)
*设置窗口绘制参数,线宽设为3
dev_set_line_width(3)
dev_set_draw('margin')
*创建圆形,因为目标区域是圆形,所以用圆形将ROI选择出来
gen_circle(Circle,161, 208, 80)
*获取圆形的中心点,为匹配后的可视化显示结果做准备
area_center(Circle, Area, Row, Column)
*对ROI进行裁剪,将其变成模板图像
reduce_domain(GrayImage, Circle, ImageReduced)
*创建模板
create_ncc_model(ImageReduced, 'auto', 0, 0, 'auto', 'use_polarity', ModelID)
*显示
dev_display(Image)
dev_display(Circle)
stop()

10.2、基于形状的模板匹配

该算法以物体边缘的梯度相关性作为匹配标准,原理是提取ROI中的边缘特征,结合灰度信息创建模板,并根据模板的大小和清晰度的要求生成多层级的图像金字塔模型。该方法使用边缘特征定位物体,对于很多干扰因素不敏感,如光照和图像的灰度变化,甚至可以支持局部边缘缺失、杂乱场景、噪声、失焦和轻微形变的模型。更进一步说,它甚至可以支持多个模板同步进行搜索。但是,在搜索过程中,如果目标图像发生大的旋转或缩放,则会影响搜索的结果,因此不适用于旋转和缩放比较大的情况。
read_image (Image, 'D:/data/a.png')
median_image(Image, ImageMedian, 'circle', 6, 'mirrored')
get_image_size(ImageMedian, Width, Height)
dev_open_window(0, 0, Width/2, Height/2, 'white', WindowHandle)
*显示模板图像
dev_display(ImageMedian)
*设置画笔颜色和线条
dev_set_color('yellow')
dev_set_line_width(3)
*------- 形状模板匹配程序 ----------------*
*选择模板中的目标
Row1:=200
Column1:=204
Row2:=345
Column2:=331
gen_rectangle1(ROI, Row1, Column1, Row2, Column2)
*显示ROI
dev_display(ROI)
*剪裁出这个区域
reduce_domain(ImageMedian, ROI,ImageROI)
*第2步,创建模板
*检查模板参数
inspect_shape_model(ImageROI, ShapeModelImages, ShapeModelRegions, 4, 50)
*显示金字塔各层级的图像,以检查层数的合理性
dev_display(ShapeModelRegions)
area_center(ShapeModelRegions, AreaModelRegions, RowModelRegions,ColumnModelRegions)
count_obj(ShapeModelRegions, HeightPyramid)
*确定金字塔的层级
for i:=1 to HeightPyramid by 1
    if(AreaModelRegions[i - 1] >= 15)
        NumLevels := i
    endif
endfor
*使用ROI图像创建模板
create_shape_model(ImageROI, NumLevels, 0, rad(360), 'auto', 'none','ignore_global_polarity', 50, 10, ModelID)
*获取轮廓信息,用于结果显示
get_shape_model_contours(ModelContours, ModelID, 1)

10.3、基于组件的模板匹配

允许模板中包含多个目标,并且允许目标之间存在相对运动(位移和旋转)。这决定了这种方式不适用于尺寸缩放的情况。由于有多个ROI,且需要检测多个ROI之间的相对运动关系,因此这种方法与基于形状的模板匹配相比要稍微复杂一点,且不适用于失焦图像和轻微形变的目标。基于组件的模板匹配适用于组成部件之间有相对运动的物体,使用边缘特征定 位物体,对于很多干扰因素不敏感,如光照变化、混乱无序等。其适用于多通道图像,不适用于纹理图像、聚焦不清的图像和形状变形的图像。

10.4、基于形变的模板匹配

基于形变的模板匹配也是一种基于形状的匹配方法,但不同的是,其返回结果中不仅包括轻微形变的形状、形变的位置和参数,还有描述形变的参数,如旋转角度、缩放倍数等。
基于形变的模板匹配对于很多干扰因素不敏感,如光照变化、混乱无序、缩放变化等。其适用于多通道图像,对于纹理复杂的图像匹配则不太适用。

10.5、基于描述符的模板匹配

模板不是根据边缘轮廓创建的,而是根据特征点创建的。例如,点的位置或相邻像素的灰度信息等都可以作为描述符。
基于灰度的模板匹配:
create_template(Template : : FirstError, NumLevel, Optimize, GrayValues : TemplateID)
Template是输入参数,表示准备好的模板图像。FirstError是一个无用的参数,默认为255。NumLevel表示匹配金字塔的层级数,默认为4。Optimize表示优化的方法类型,可以选择sort,表示进行优化。参数GrayValues决定了使用原始图像的灰度还是使用边缘梯度进行匹配。可选的有gradient、normalized、original、sobel。 返回一个模板的句柄TemplateID。
best_match算子和fast_match算子,以及它们的多种衍生版本,即带变量的算子,如best_match_mg算子、best_match_pre_mg算子、best_match_rot算子、fast_match_mg算子等。best_match算子返回的是匹配结果最好的。
后缀为mg变量的算子,如best_match_mg算子和fast_match_mg算子,表示其是在图像金字塔上进行匹配的;best_match_pre_mg算子则表示使用了预训练的金字塔,在算子的参数列表中可以设
置金字塔的层级等参数。带rot的算子,如best_match_rot算子,表示检测图像可以旋转一定的角度
clear_template算子释放模板资源。
dev_open_window(0, 0,599, 464, 'black', WindowHandle)
read_image(Image, 'D:/data/a.png')
rgb1_to_gray(Image, GrayImage)
dev_set_draw('margin')
dev_set_line_width(3)
Row1:=200
Column1:=204
Row2:=345
Column2:=331
*选择一块矩形的ROI
gen_rectangle1(Rectangle,Row1, Column1, Row2, Column2)
dev_display(Rectangle)
*对ROI进行裁剪,将其变成模板图像
reduce_domain(GrayImage, Rectangle, ImageReduced)
*创建模板
originalcreate_template(ImageReduced, 5, 4, 'sort', 'original', TemplateID)
使用inspect_shape_model算子查看金字塔的层级图像和特征轮廓在确定了金字塔层级和最小对比度之后,使用create_shape_model算子创建形状模板。
use_polarity:表示匹配得到的图像必须和模板图像的对比度“方向”相同。例如,模板中是一个暗背景上有一个亮的目标,那么在检索时,只有符合匹配条件并且亮度比背景亮的目标才能匹配成功。
ignore_global_polarity:适用于全局对比度发生变化的情况,表示忽略全局对比度的变化,即匹配过程中的图像对比度可以与模板中的完全相反。例如,模板中是一个暗背景上有一个亮的目标,那么在检索时,即使目标对象很亮而背景很暗,也能匹配成功。
ignore_local_polarity:表示忽略局部对比度的变化,如果图像因为光照改变等原因发生局部对比度变化,可以选择这一项。ignore_color_polarity:表示匹配过程忽略颜色对比度的变化,一般适用于多通道图像。如果不确定检测时会显示哪个通道的图像,可以选择此项。
Metric参数可以用于因光照导致图像对比度发生变化的情况。搜索目标。创建好模板之后,接下来读取待检测的图像。使用find _shape_model算子搜索最佳匹配区域,将检测图像和模板句柄Mod
elID输入该算子中,搜索到的目标对象的匹配分值会存入参数Score中。
read_image(Image, 'D:/data/a.png')
*围绕要匹配的目标创建一个矩形,获取ROI
gen_rectangle1(Rectangle, 30, 20, 100, 200)
*对ROI进行裁剪,得到模板图像
reduce_domain(Image, Rectangle, ImageReduced)
*测试金字塔的层级参数
inspect_shape_model(ImageReduced, ModelImages, ModelRegions, 4, 30)
*设置显示图像、绘制线条的线宽等窗口参数
dev_set_draw('margin')
dev_set_line_width(3)
dev_display(Image)
dev_display(Rectangle)
*根据裁剪的模板图像创建基于形状的模板,返回模板句柄ShapeModelID
create_shape_model(ModelImages, 5, -0.39, 0.79, 'auto', 'auto', 'use_polarity', 'auto', 'auto', ModelID)
stop()

代码:

1、基于阈值对目标进行筛选

read_image (Image1, 'Clip')
threshold (Image1, Region, 0, 56)
*把分割出来的目标切分成独立的连通域,ConnectedRegions为区域元组
connection (Region, ConnectedRegions)
*根据面积特征选出真正的别针
select_shape (ConnectedRegions, SelectedRegion, 'area', 'and', 4100, 5964)
*获取回形针的方向和重心
orientation_region(SelectedRegion, Phi)
area_center(SelectedRegion, Area, Row, Column)
for Index := 0 to 12 by 1
    *设置标签显示位置
    set_tposition(200000, Row[Index], Column[Index])
    *画标签
    write_string(200000, deg(Phi[Index])+'degrees')
endfor

  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值