convol_image(Image : ImageResult : FilterMask, Margin : )
convol_image计算输入图像Image 与任意线性滤波掩码之间的相关性。
使用的过滤器掩码(FilterMask中给出)可以从文件加载,也可以作为元组传递。
图像边框处理的几个选项可以选择(Margin):
灰度值 图像边框外的灰度值像素假设为常数(用常量灰度值表示)。
“continue” 是图像边框上灰度值的延续。
“cyclic” 图像边框的循环延续。
“mirrored” 像素在图像边框上的反射。
在所有的图像位置,计算图像和滤波掩模之间的相关性。
如果发生溢出或下溢,则会剪切生成的灰色值。
因此,如果使用导致负输出值的过滤器(例如导数过滤器),则输入图像应该是int2或实数类型。
掩模的参考像素,即,确定当前图像位置上的像素,计算相关关系,确定如下:
首先,计算权重为0以外的所有掩模像素的区域。
然后,计算这个区域的中心并四舍五入。这是找朋友的参考点。
如果在FilterMask中给定文件名,则从具有以下结构的文本文件中读取过滤器掩码:
<Mask size>
<Inverse weight of the mask>
<Matrix>
第一行包含过滤器的大小,给定为两个用空格分隔的数字(例如,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]
如果过滤器掩码是可分离的(自动检测),那么convol_image使用一个特殊的实现,
它比不可分离掩码的过滤要快得多。
如果将“sse2_enable”设置为“true”(SIMD指令集可用),
则使用SIMD技术执行“byte”和“real”图像的内部计算。
如果将'sse41_enable'设置为'true' (SIMD指令集可用),
则使用SIMD技术执行'int2'和'uint2'图像的内部计算。
如果'avx_enable'设置为'true'(并且SIMD指令集可用),
则使用AVX SIMD技术执行'real'图像的内部计算。
例程:
read_image (Image, 'printer_chip/printer_chip_01')
convol_image (Image, ImageResult, 'sobel', 'mirrored')
|