新手在刚接触Halocon时往往不明所以,而官方文档上的解释又让初学者云里雾里,本文整理了halocon常用算子(库函数),供开发者快速查阅。
tuple_length(Area0,len)
数组里元素的个数
tuple_find_first(Area0,sMax,i)
找到第一个是sMax的,返回索引
创建数组 tuple_gen_const( : : Length, Const : Newtuple)
dev_open_window( : : Row, Column, Width, Height, Background : WindowHandle)
dev_open_window打开一个新的图形窗口,可以用来显示images,regions和lines等图形对象以及显示输出文本。
set_display_font(:: WindowsHandle, Size, Font, Bold, Slant: )
用来设置当前窗口字体属性
WindowsHandle:将要设置字体窗口的窗口句柄
Size:字体大小
Font:字体名称
Bold:粗体
Slant:斜体
dev_set_draw( : : DrawMode : )
dev_set_draw定义region的填充模式。
如果DrawMode设置为’fill’,region显示为填充,如果设置为’margin’,则只显示轮廓。 在’margin’模式下,轮廓的外观会受到dev_set_line_width,set_line_approx和set_line_style的影响。
读取图片
获取图片尺寸
Regions (input_object) region(-array) → object
Regions in which the features are calculated.
计算特征的区域。
Region:输入的被计算的区域
Image:输入灰度图
Mean:输出区域的平均灰度值
Deviation:输出区域内灰度值的偏差(方差)。
zoom_image_factor(Image, ImageZoomed, 0.15, 0.125, ‘constant’)
高斯降采样。
median_image (Image, ImageMedian, ‘circle’, 2, ‘mirrored’)
Image:输入图像
ImageMedian:输出图像
参数3:掩码的形状 ‘circle’ 圆; ‘square’ 正方形
参数4: 掩码半径
参数5:边界处理。建议值: ‘mirrored’, ‘cyclic’, ‘continued’, 0, 30, 60, 90, 120, 150, 180, 210, 240, 255
gauss_filter (Image, ImageGauss, 9)
Image:输入图像
ImageGauss:输出图像
参数3:过滤器大小;建议值: 3, 5, 7, 9, 11
空间域和频域之间的转换,主要有如下两个关键算子rft_generic()、fft_generic()。
这两个算子的共同点:
1.这两个算子都是进行快速傅里叶变换的算子
2.这两个算子都可以进行空间域-》频域和频域-》空间域的变换,只需要针对参数Direction分别进行选择,‘to_freq’是进行的是空间域-》频域的变换,‘from_freq’是频域-》空间域的变换。
3.rft_generic算子的输入图像是实值函数,fft_generic的输入图像是复数函数;从输出的结果来看,rft_generic只需要计算和存储了左半边的复数图像信息就可以了,因为右半边是共轭对称的。因此从最终的输出我们可以看到,只有左上和左下有DC成分。而fft_generic如果设定的是原点在左上角,那么就会在四个角上有DC成分。
4.fft_generic算子可以通过参数Mode设置原点的位置:如果设置的是’dc_edge’,那么原点在左上角;如果设置的是’dc_center’,那么就会将原点平移到中心位置。fft_generic算子一般会设置为’dc_center’。对于rft_generic算子,因为没有设置项,所以默认原点位置为左上角。
5.针对同一个图像,进行空间域-》频域、频域-》空间域的转换的时候,如果使用的是rft_generic算子,那么两个转换就都使用该算子;如果使用的是fft_generic算子,那么两个转换也都使用该算子,在对同一个图像进行空间域和频域的相互转换时,不要交叉使用这两个算子。
当然,从空间域到频域的转换,也可以使用算子fft_image,这个算子也是快速傅里叶变换,其实际效果相当于:
fft_generic(Image,ImageFFT,‘to_freq’,-1,‘sqrt’,‘dc_center’,‘complex’)
Image:输入图像
ImageFFT(out) :傅里叶变换输入图像
Direction:计算正向或反向变换。‘to_freq’是空间域—>频域的变换,ResultType一般选择’complex’;‘from_freq’是频域—>空间域的变换,ResultType一般选择’byte’(灰度图像)。
Norm:变换的归一化因子
ResultType:输出图像的图像类型,配合Direction参数设置
原理:其实gen_gauss_filter得到的滤波器,就是一个图像,虽然是频域滤波器,但是单纯看物理意义,他就是一个图像。与时域空间卷积核的物理意义是相同的。对这幅频域图进行卷积(卷积过程与时域无差别),卷积之后图像就产生了变化,比如外环得到减弱,内环得到保留(高低通滤波器的效果),或者在某个方向上得到保留(gabor滤波器的效果),再还原到时域,发现跟原图变化很大。
频域的乘法相当于空间域的卷积:
convol_fft (ImageFFT, ImageGauss, ImageConvol)
一个重要的经验结论:低频代表图像整体轮廓,高频代表了图像噪声,中频代表图像边缘、纹理等细节。
1.具有一定纹理特征的图像,纹理可以理解为条纹,如布匹、木板、纸张等材质容易出现。
2.需要提取对比度低或者信噪比低的特征。
3.图像尺寸较大或者需要与大尺寸滤波器进行计算,此时转换至频域计算,具有速度优势。因为空间域滤波为卷积过程(加权求和),频域计算直接相乘。
使用频域进行检测,有两个步骤是比较关键的:
1.一个是生成合适的滤波器;
2.一个是空间域和频域之间的转换。
sub_image(ImageMinuend , ImageSubtrahend : ImageSub : Mult , Add
ImageMinuend :输入的被减图像
ImageSubtrahend:减数图像
ImageSub:结果图像
Mult:乘数因子
Add:灰度补充值
自动全局阈值分割。
binary_threshold(Image : Region : Method, LightDark : UsedThreshold)
Image :要分割的图像
Region :分割后的区域
Method:分割方法,提供了两种方法:‘max_separability’和’smooth_histo’。这两种方法只能用于具有双峰直方图的图像
LightDark :提取暗背景还是亮背景
UsedThreshold:使用阈值
示例:
binary_threshold(Sub0, region, 'max_separability', 'dark', UsedThreshold)
从图像中分割出
area_center (region, A, Row, Column)
计算每个区域的面积 中心坐标
select_shape(Regions: SelectedRegions: Features, Operation, Min, Max: )
借助形状特征选择区域。
Regions: 输入区域元组
SelectedRegions:输出满足条件的区域元组
Features:输入参数形状特征(‘anisometry’, ‘area’, ‘area_holes’, 'bulkiness’等)
Operation:输入参数关系符(‘and’, ‘or’)如果features只是用一种特性那么此参数没有意义
Min、Max:输入参数下限上限值
示例:
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 99999)
选择区域面积范围
connection(Region, ConnectedRegions)
Region表示需要计算的输入图像区域
ConnectedRegions表示输出图像区域
示例:
connection (regions, ConnectedRegions)
closing_circle(Region: RegionClosing : Radius)
Region:输入区域
RegionClosing:输出结果区域
Radius:输入使用的圆形结构的圆半径 0.5 ≤ Radius ≤ 511.5 (lin)
使用圆形结构元素来闭合一个区域。
示例:
closing_circle (RegionUnion, RegionClosing, 5)
使用圆形结构元素来闭合一个区域,只要是在区域内并且小于输入圆形半径的孔都会被闭合
color := [255,255,0]
*RGB红色+绿色
*黄色
*用指定颜色填充指定区域
*Image:待绘制的图像
*Region:待绘制的区域
*color:颜色
*margin:填充类型
'fill' 填充全部区域
'margin' 只填充边界
示例:
overpaint_region (Image, Region, color, 'margin')
union1 (Region, RegionUnion)
将所有区域合并成一个区域。
参数1:要计算并集的区域
参数2:输出区域
示例:
union1 (SelectedRegions, RegionUnion)
threshold(Image : Region : MinGray, MaxGray : )
使用全局阈值分割图像。
Image (input_object) :输入图像
Region (output_object) :阈值分割后Region
MinGray (input_control):设置的最小阈值(灰度值)
MaxGray (input_control) :设置的最大阈值(灰度值)
其中要满足MaxGray >= MinGray
示例:
#全局阈值分割出两个区域
threshold (Image, Region, [0, 107], [106, 255])
crop_part(Image : ImagePart : Row, Column, Width, Height : )
用来截取感兴趣区域。
Image:原图像
ImagePart:截取的图像
Row、Column:图像截取的起始点坐标
Width、Height:截取图像的宽、高
示例:
crop_part(Image,imgCut,100,100,1200,1200)
双重阈值分割(适用于有符号图像的阈值算子)。
dual_threshold(Image : RegionCrossings : MinSize, MinGray, Threshold : )
MinSize :分割出来的区域的最小面积(即分割出来的面积要大于MinSize);
MinGray :分割出来的区域对应的原图中图像像素的最高灰度大于MinGray设定值。
threshold :灰度值小于阈值(或大于阈值)的区域被抑制;
dual_threshold算子的缺陷:它只能分割出灰度值高的亮区域,不能分割出灰度值低的暗区域
gen_circle_contour_xld(ContCircle : Row, Column, Radius, StartPhi, EndPhi, PointOrder, Resolution
ContCircle:输出轮廓
Row:输入圆心的行坐标
Column:输入圆心的列坐标
Radius:输入圆的半径
StartPhi:输入起始点角度
EndPhi:输入结束点的角度
PointOrder:输入沿边界的点序('negtive’负序, 'positive’正序)
Resolution:输入相邻轮廓点之间的距离(Resolution>=0.00001)
gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )
ImageGauss(out) :生成的滤波器图像
Sigma1:空域(像素域)中,高斯分布在滤波器主方向的标准差
Sigma2:空域(像素域)中,高斯分布在垂直于滤波器主方向的标准差。注:Sigma1和Sigma2确定空间域内高斯函数的平滑量
Phi:滤波器在空间域的主要方向
Norm:滤波器的归一化因子。注:如果使用fft_image和fft_image_inv进行过滤,必须设置参数Norm = 'none’和Mode = ‘dc_center’(本文未使用)
Mode:频率图中心位置。注: 如果使用实值快速傅里叶变换算子rft_generic, 则Mode = ‘rft’ ;如果使用快速傅里叶变换算子fft_generic,则可以使用Mode = 'dc_edge’来提高效率
Width, Heigh:生成滤波图像的宽、高
min_max_gray(Regions, Image :: Percent : Min, Max, Range)
Regions:输入需要计算的区域
Image:输入灰度图像
Percent:输入 低于(以上)绝对最高(最低)百分比 取值范围:0 <= Percent && Percent <= 50、
Min:输出最小灰度值、
Max:输出最大灰度值、
Range:输出灰度值范围;
percent含义:区域面积乘以percent得到一个数a,然后用这个数a分别从最小灰度值和最大灰度值处向里截取a个像素点,然后在剩下的像素点中取最小最大灰度值。
通过阈值实现图像的分水岭算法分割,是一种边缘分割算法,比watersheds多了一步操作,即在得到初步的分水岭分割结果之后,将灰度小于阈值的分水岭合并。watersheds_threshold(Image : Basins:Threshold:)
Image :Image为输入的图像,一般为单通道图像。如果前景目标比较亮而背景比较暗,可以在导入图像后使用invert_image 算子将图像颜色进行反转。
Basins:Basins为输出的盆地区域。
Threshold:Threshold为设置的灰度阈值。建议该值不要超过原图的最大灰度,否则将无法提取出分水岭,图像整体将作为一个区域被提取出来。
watersheds( Image : Basins, Watersheds : : )
Image :Image为输入的图像,一般为单通道图像。这里要注意,因为盆地一般指的是灰度值低的区域,所以如果前景目标比较亮而背景比较暗,可以在导入图像后使用 invert_image 算子将图像颜色进行反转。
Basins:Basins为输出的盆地区域。
Watersheds :Watersheds为输出的分水岭区域。一般一幅输入图像对应一个分水岭区域,而输出的Basins区域则是多个区域的集合。
注意:如果图像上包含过多的精细区域或者噪点,输出的区域数量将非常庞大,并影响算法的速度。
计算共生矩阵并导出其灰度值特征。
cooc_feature_image(Regions, Image : : LdGray, Direction : Energy, Correlation, Homogeneity, Contrast)
Direction:传递邻域的方向,可选’mean’或者’angle’两个方向
Energy:灰度共生矩阵各元素值的平方和
Correlation:输出的相关性
Homogeneity:输出的熵
Contrast:输出的对比度
灰度共生矩阵
灰度共生矩阵定义为像素对的联合分布概率,是一个对称矩阵,它不仅反映图像灰度在相邻的方向、相邻间隔、变化幅度的综合信息,但也反映了相同的灰度级像素之间的位置分布特征,是计算纹理特征的基础。
在计算得到共生矩阵之后,往往不是直接应用计算的灰度共生矩阵,而是在此基础上计算纹理特征量,我们经常用反差、能量、熵、相关性等特征量来表示纹理特征。
(1) 反差:又称为对比度,度量矩阵的值是如何分布和图像中局部变化的多少,反应了图像的清晰度和纹理的沟纹深浅。纹理的沟纹越深,反差越大,效果清晰;反之,对比值小,则沟纹浅,效果模糊。
(2)能量:是灰度共生矩阵各元素值的平方和,是对图像纹理的灰度变化稳定程度的度量,反应了图像灰度分布均匀程度和纹理粗细度。能量值大表明当前纹理是一种规则变化较为稳定的纹理。
(3)熵:是图像包含信息量的随机性度量。当共生矩阵中所有值均相等或者像素值表现出最大的随机性时,熵最大;因此熵值表明了图像灰度分布的复杂程度,熵值越大,图像越复杂。
(4)相关性:也称为同质性,用来度量图像的灰度级在行或列方向上的相似程度,因此值的大小反应了局部灰度相关性,值越大,相关性也越大。
重置某个方形区域内的灰度值,计算方形区域内的最大最小灰度的差(最大-最小),并体现到每个图像点上。如果MaskHeight和MaskWidth是偶数,它们被变为靠近的小的奇数值,图像边缘的灰度值是呈镜像出现的。
gray_range_rect( Image : ImageResult : MaskHeight, MaskWidth: )
Image(in):被计算灰度值的图像
ImageResult(out):包含灰度值的图像
MaskHeight(in):滤波器掩模的高度
MaskWidth(in):滤波器掩模的宽度
gen_gabor(ImageFilter : Angle,Frequency, Bandwidth, Orientation, Norm, Mode, Width, Height
ImageFilter
Angle
Frequency
Bandwidth
Orientation
Norm
Mode
Width
Height
mean_curvature_flow(Image : ImageMCF : Sigma, Theta, Iterations : )
Image (input_object) (multichannel-)image(-array) → object (byte / uint2 / real)
Input image.
ImageMCF (output_object) Output image.
Sigma (input_control)
Smoothing parameter for derivative operator.
Default value: 0.5
Restriction: Sigma >= 0
Theta
Time step.
Default value: 0.5
Iterations (input_control)
Number of iterations.
Default value: 10
Suggested values: 1, 5, 10, 20, 50, 100, 500
Restriction: Iterations >= 1
texture_laws(Image : ImageTexture : FilterTypes, Shift, FilterSize : )
Image:原始图像;
ImageTexture:经过纹理滤波器滤波后的图像;
FilterTypes:滤波器的类型;
Shaft:滤波后图像的灰度缩放系数,具体实现公式未知,实际使用过程中降低了滤波后图像的灰度,使得使用不同滤波器类型的滤波后图像具有可比性;
FilterSize:滤波器尺寸,可选3,5,7。
示例:
texture_laws (MreutHill, SS, 'ss', 0, 5)
texture_laws (MreutHill, EE, 'ee', 2, 5)
滤波向量l增强滤波方向的图像的亮度。滤波向量e检测了滤波方向上的突变(即边缘,高频区域)。滤波向量s同样检测了滤波方向上的突变(与滤波向量e检测方法不一样)。
一般来说,可以选择滤波向量中的 “l”, “e”, “s”, “r”, “w”, "o"与滤波向量"l"组合来增强图像的低频部分,或者与滤波向量"o"组合来增强图像的高频部分。
滤波器类型的第二个字母"l", “e”, “s”, “r”, “w”, "o"依次检测图像低频部分到高频部分。例如,滤波器"le"检测图像 中相对低频的部分,而滤波器"ls"检测图像中相对高频的部分。
bilateral_filter(Image, ImageJoint : ImageBilateral : SigmaSpatial, SigmaRange, GenParamName, GenParamValue : )
功能:进行均值滤波,对输入图像的灰度值执行线性平滑。
mean_image(Image: ImageMean : MaskWidth, MashHeight
Image: 输入图像
ImageMean:输出图像
MaskWidth:输入平滑蒙版宽度,默认9,参考3,5,7,9,11…
MaskHeight:输入平滑蒙版高度,默认9,参考3,5,7,9,11…
dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )
dyn_threshold的特点:
它是一种局部阈值算子
它通过平均图像灰度来确定局部领域
它使用前需要指定一个图像滤波器,例如mean_image
滤波尺寸>被提取物体的直径较好。
如果滤镜掩码的尺寸太大,那么相邻非常近的物体将会连在一起。
使用滤波掩码宽度推荐2*D+1,其中D为物体直径。
它选出的所有像素要比局部领域要黑,也就是比均值滤波后的图像要黑。
使用图像创建NCC匹配模板:
create_ncc_model(template模板图像::numlevels最高金字塔层数,anglestart开始角度,angleextent角度范围,anglestep旋转角度步长,metric物体极性选择:modelID生成模板ID)
搜索NCC最佳匹配:
find_ncc_model(image要搜索的图像::modelID模板ID,anglestart与创建模板时相同或相近,angleend与创建模板时相同或相近,minscore最小分值,nummatches匹配目标个数,maxoverlap最大重叠比值,subpixel是否亚像素级别,numlevel金字塔层数:row,column,angle匹配得到的坐标角度,score匹配得到的分值)
使用图像创建形状匹配模型:
create_shape_model(template模板图像::numlevels最高金字塔层数,anglestart开始角度,angleextent角度范围,anglestep旋转角度步长,optimization优化选项,是否减少模板点数,metric匹配度量极性选择,contrast阈值或滞后阈值来表示对比度,mincontrast最小对比度:modelID生成模板ID)
获取形状模板的轮廓:
get_shape_contours(:modelcontours得到的轮廓XLD:modelID输入模板ID,level对应金字塔层数;)
寻找单个形状模板最佳匹配:
find_shape_model(image要搜索的图像::modelID模板ID,anglestart开始角度,angleextent角度范围,minscore最低分值,nummatches匹配实例个数,maxpverlap最大重叠,subpixel是否亚像素精度,numlevels金字塔层数,greediness搜索贪婪度,为0时安全但是速度慢;当为1时速度快但不稳定:row,column,angle,score获得的坐标角度缩放和匹配分值)
根据金字塔层数和对比度检查要生成的模板是否合适:
inspect_shape_model(image输入的图像:modelimages获得金字塔图像,modelregions模板区域:numlevels金字塔层数,contrast对比度)
使用图像创建形状匹配模型:
create_shape_model(template模板图像::numlevels最高金字塔层数,anglestart开始角度,angleextent角度范围,anglestep旋转角度步长,optimization优化选项,是否减少模板点数,metric匹配度量极性选择,contrast阈值或滞后阈值来表示对比度,mincontrast最小对比度:modelID生成模板ID)
获取形状模板的轮廓:
get_shape_contours(:modelcontours得到的轮廓XLD:modelID输入模板ID,level对应金字塔层数)
Template : : //reduce_domain后的模板图像
NumLevels ,//金字塔的层数,可设为“auto”或0—10的整数
AngleStart ,//模板旋转的起始角度
AngleExtent ,//模板旋转角度范围, >=0
AngleStep ,//旋转角度的步长, >=0 and <=pi/16
Optimization ,//设置模板优化和模板创建方法
Metric , //匹配方法设置
Contrast ,//设置对比度
MinContrast /设置最小对比度
ModelID ) //输出模板句柄
invert_image (Image, ImageInvert)
*图像取反:g’=255-g
Image:输入图像
ImageInvert:保存取反后的图像
add_image(ImageMinuend , ImageSubtrahend , ImageSub, Mult , Add)
ImageMinuend:被加图像,
ImageSubtrahend :加数图像,
ImageSub:结果图像,
Mult :乘数因子,
Add:补充值
draw_circle (WindowHandle, Row, Column, Radius)
WindowHandle:窗口句柄
Row:保存圆心Row–>y坐标
Column:保存圆心Col–>x坐标
Radius:保存半径
*鼠标左键画圆,右键结束
*注意:右键结束后,窗口中不会画出圆
reduce_domain ( Image, Region : ImageReduced :
Image是输入的图像;
Region是输入的区域;
ImageReduced是输出的图像,是Image中Region的那部分图像。
create_template(Template : : FirstError, NumLevel, Optimize, GrayValues : TemplateID)
Template (input_object) 单通道图像-对象(字节)
输入图像,其域将被处理用于模式匹配。
FirstError (input_control) integer → (integer)
Not yet in use.
Default value: 255
List of values: 255
NumLevel (input_control) 整数-(整数)
金字塔级别的最大数目。
默认值:4
价值表:1, 2, 3、4, 5, 6、7, 8, 9、10
Optimize (input_control) 字符串(字符串)
一种优化。
默认值:‘sort’
价值列表: ‘none’, ‘sort’
GrayValues(输入控制)字符串(字符串)
一种灰度值。
默认值:‘original’
价值列表: ‘gradient’, ‘normalized’, ‘original’, ‘sobel’
“梯度”、 “标准化”、 “原始”、“索贝尔”
TemplateID (output_control) 模板:(整数)模板编号。
best_match(Image : : TemplateID, MaxError, SubPixel : Row, Column, Error)
singlechannelimage(-array) → 输入图像。
TemplateID (input_control) template → 模板编号
MaxError (input_control) real → (real) 灰度值的最大平均差。
SubPixel (input_control) string → (string) 'true’情况下的亚像素精度。
Row (output_control) point.y(-array) → (real) 最佳匹配的行位置。
Column (output_control) point.x(-array) → (real) 最佳匹配的列位置。
Error (output_control) real(-array) → (real) 最佳匹配灰度值的平均散度。
add_channels(Regions, Image : GrayRegions : : )
Regions (input_object) region(-array) → object
输入区域(没有像素值)。
Image (input_object) (multichannel-)image → object (byte / direction / cyclic / int1 / int2 / uint2 / int4 / int8 / real / complex / vector_field)
输入具有区域像素值的图像。
GrayRegions (output_object) image(-array) → object (byte / direction / cyclic / int1 / int2 / uint2 / int4 / int8 / real / complex / vector_field)
输出具有区域和像素值的图像(每个输入区域一个图像)。
元素数量: Regions == GrayRegions
pow_image(Image : PowImage : Exponent : )
对图像做伽马为Exponent的指数变换
指数变换映射关系与对数变换的不同之处在于,指数变换可以根据伽马Exponent 的不同取值有选择性地增强低灰度区域的对比度或是高灰度区域的对比度