convol_image — 计算图像与任意滤波掩模之间的相关。
convol_image(Image : ImageResult : FilterMask, Margin : )
convol_image 计算输入图像 Image 与任意线性滤波掩模之间的相关性。通过 FilterMask 指定的滤波掩模可从文件加载,或作为元组传递。图像边界处理可选择多种选项(Margin):
gray value 假设图像边界外的像素保持恒定(采用指定灰度值)。
'continued' 图像边界处的灰度值延续。
'cyclic' 图像边界处的循环延续。
'mirrored' 图像边界处像素的镜像反射。
在所有图像位置,均计算图像与滤波掩模之间的相关性。若发生溢出或下溢,则对所得灰度值进行截断。因此,若使用会产生负输出值的滤波器(如导数滤波器),则输入图像应为 int2 或 real 类型。
掩模的参考像素(即位于当前图像位置且用于计算相关性的像素)确定方法如下:首先计算所有权重不为 0 的掩模像素区域,随后计算该区域的中心点并进行四舍五入处理。此点即为掩模的参考点。
如果在 FilterMask 中指定了文件名,则滤波掩模将从具有以下结构的文本文件中读取:
<掩模尺寸>
<掩模的逆权重>
<矩阵>
第一行包含滤波掩模的尺寸,由两个以空格分隔的数字表示(例如 3 3 表示 3×3)。其中第一个数字定义滤波掩模的高度(行数),第二个数字定义其宽度(列数)。下一行包含掩模的逆权重,即特定图像位置相关系数需除以的系数。后续行以整数或浮点数形式(空格分隔)呈现滤波掩模,文件中每行对应掩模的一行数据。滤波掩模的默认HALCON文件扩展名为'fil'。调用算子时无需指定该扩展名。若需从元组计算滤波掩模,FilterMask 中的元组结构须符合上述描述,但此时省略换行符。
例如,假设我们想要使用以下滤波掩模:
如果滤波掩模需要从文件生成,则该文件应如下所示:
3 3 16 1 2 1 2 4 2 1 2 1
相反地,若需从元组生成滤波掩模,则必须向 FilterMask 传递以下元组:
[3,3,16,1,2,1,2,4,2,1,2,1]
为方便起见,在 FilterMask 中可以传递两个向量代替矩阵:
[MaskHeight,MaskWidth,Weight,V1,V2]
这两个向量的外积构成滤波矩阵:
例如,上述矩阵也可传递为:
[3,3,16,1,2,1,1,2,1]
如果 FilterMask 是可分离的(系统会自动检测),convol_image 将采用一种特殊实现方式,其运行速度远快于使用不可分离掩模进行滤波的情况。
若 'sse2_enable' 设置为 'true'(且SIMD指令集可用),则 byte 和
real 图像的内部计算将采用 SIMD 技术执行。若 'sse41_enable' 设置为 'true'(且 SIMD 指令集可用),则 int2 和
uint2 图像的内部计算将采用 SIMD 技术执行。若 'avx_enable' 设置为 'true'(且 SIMD 指令集可用),则 real 图像的内部计算将采用 AVX SIMD 技术执行。
请注意,convol_image 并非计算图像与给定滤波掩模的卷积,而是计算相关性,即它直接使用给定的滤波掩模,而非该滤波掩模的镜像版本。
当使用 3x3 或 5x5 矩形滤波掩模并采用
'mirrored' 边界处理时,convol_image 可在 OpenCL 设备上执行。
请注意,若使用域缩减后的图像作为输入,滤波器算子可能会返回意外结果。请参阅 滤波器 一章
Image (输入对象) (multichannel-)image(-array) → object (byte / int2 / uint2 / real)
将计算相关性的图像。
ImageResult (输出对象) multichannel-image(-array) → object (byte / int2 / uint2 / real)
相关性结果。
FilterMask (输入控制) filename.read(-array) → (string / integer / real)
滤波掩模作为文件名或元组。
默认值: 'sobel'
建议值: 'sobel', 'laplace4', 'lowpas_3_3'
文件扩展名:
.fil
Margin (输入控制) string → (string / integer / real)
边界处理。
默认值: 'mirrored'
值列表(用于计算设备):'mirrored'
建议值: 'mirrored', 'cyclic', 'continued', 0, 30, 60, 90, 120, 150, 180, 210, 240, 255
基础