工控编程吧

标题: 工业视觉halcon optimize_rft_speed函数介绍 [打印本页]

作者: qq263946146    时间: 2019-6-11 19:48
标题: 工业视觉halcon optimize_rft_speed函数介绍
0.optimize_rft_speed( : : Width, Height, Mode : )
optimize_rft_speed确定了一种方法,该方法可为尺寸为 Width*Height的图像实现实数值FFT的最佳运行时间。
为一个图像大小确定的数据不会影响用于其他图像大小的方法。
因此,可以使用不同的宽度和高度值多次调用optimize-rft-fu速度,以实现应用程序中使用的所有不同大小图像的最佳运行时间。
参数Mode 决定了搜索最快方法的彻底性。
对于Mode ='Standard',使用快速搜索,通常需要几秒钟。因此,该方法确定的运行时间非常好,并不总是最佳的。
对于Mode ='patient',将执行更彻底的搜索,这通常需要几秒钟,在大多数情况下会导致最佳运行时间。
对于Mode ='exhaustive',将执行详尽搜索,通常需要几分钟时间,并且始终会得到最佳运行时间。
在大多数应用程序中,mode='standard'会在实数值FFT的运行时间和搜索最佳运行时间之间产生最佳折衷。
可以使用h write_fft_optimization_data, read_fft_optimization_data对优化速度数据进行加载存储操作。

请注意,此优化是针对调用运算符的特定计算机执行的。
结果不适合在其他计算机上传输和使用,除非它们具有相同的硬件和软件配置,包括驱动程序版本。

优化速度影响RFT-Generic的运行时间。


1.gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )
gen_gauss_filter在频域内产生一个(可能是各向异性的)高斯滤波器。
高斯在空间域的标准偏差(即平滑量)由sigma1和sigma2确定。
sigma1是由角度phi确定的空间域中滤波器主方向的标准偏差。
为了最大限度地提高滤波操作的整体效率,可以使用参数Norm来指定滤波器的归一化因子。
如果使用fft_generic时norm='n',则可以避免fft中的规范化。
Mode可用于确定滤波器的DC项在何处,或在实数值FFT中是否应使用滤波器。
如果使用fft_generic,可以使用“dc_edge”来提高效率。
如果使用fft_image和fft_image_inv进行过滤,则必须使用norm='none'和mode='dc_center'。
如果使用rft_generic,则必须使用mode='rft'。

2.rft_generic(Image : ImageFFT : Direction, Norm, ResultType, Width : )
RFT-Generic计算输入图像Image 的快速傅立叶变换。
与 fft_generic, fft_image,fft_image_inv不同,正向变换中的输入图像是实数值图像(即,不是complex图像)。
在这种情况下,复杂的输出图像具有冗余。
图像右半部分中的值是图像左半部分中对应值的复杂共轭。
因此,运行时和内存只能通过计算和存储复杂图像的左半部分来保存。

参数resultType可用于指定反向转换的结果图像类型(direction='from_freq')。
在正向转换(direction='to_freq')中,resultType必须设置为“complex”。


参数Direction决定转换应该执行到频域还是返回到空间域。
对于direction='to'u freq'输入图像必须具有实值类型,即复杂图像不能用作输入。
支持所有可以转换为real类型的图像的图像类型。
在这种情况下,输出是尺寸(w/2+1)*h的复杂图像,其中w和h是输入图像的宽度和高度。
在此模式中,指数-1用于转换(请参见fft_generic)。
对于direction='from_freq',输入图像必须是complex。在这种情况下,输入图像的大小不足以确定输出图像的大小。
这必须通过将宽度设置为有效值来完成,即设置为2*w-2或2*w-1,其中w是复杂图像的宽度。
在此模式中,指数1用于转换。

规范化因子可以用norm设置,并且可以采用值“none”、“sqrt”和“n”。
用户必须确保参数的一致使用。这意味着用于前向和后向变换的归一化因子在相乘时必须产生w*h。


3.gen_derivative_filter( : ImageDerivative : Derivative, Exponent, Norm, Mode, Width, Height : )
gen_derivative_filter在频域内生成导数滤波器。
要计算的导数由Derivative决定。
Exponent指定反向转换中使用的指数。必须将其设置为与fft_generic中使用的值相同。
如果在反向转换中使用fft_image_inv,则必须使用指数=1。
然而,由于导数图像通常包含负值,因此应始终使用fft_generic进行反向转换。
为了最大限度地提高滤波操作的整体效率,可以使用参数Norm来指定滤波器的归一化因子。
如果使用fft_generic和norm='n',则可以避免fft中的规范化。
Mode可用于确定滤波器的直流项在何处,或在实值FFT中是否应使用滤波器。
如果使用fft_generic,可以使用“dc_edge”来提高效率。
如果使用fft_image和fft_image_inv进行过滤,则必须使用norm='none'和mode='dc_center'。
如果使用rft_generic,则必须使用mode='rft'。

4.convol_fft(ImageFFT, ImageFilter : ImageConvol : : )
convol_fft在频域中对两个(傅里叶变换后的)图像进行卷积,即,将复杂图像ImageFFT的像素乘以滤波器ImageFilter的相应像素。


上面函数例程为:
read_image (Image, 'mreut')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
optimize_rft_speed (Width, Height, 'standard')
stop ()
*
* 通过生成sigma=3的高斯滤波器并将图像卷积到频域中,在频域中执行高斯平滑。
gen_gauss_filter (GaussFilter, 3, 3, 0, 'n', 'rft', Width, Height)
*计算输入图像的实值FFT。
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
* 执行卷积。
convol_fft (ImageFFT, GaussFilter, ImageConvol)
* 用反实值FFT计算滤波器的滤波结果。
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'none', 'real', Width)
dev_display (ImageFiltered)
stop ()
*注意,用derivate_gauss(几乎)可以得到相同的结果。
*主要区别在于边界处理:定义上的FFT假设信号是周期性的,因此边界处理是循环延续。
*相反,derivate_gauss使用镜像图像边界处的灰度值。
*还要注意,通过FFT过滤已经比使用sigma=3的derivate_gauss快,SIMAG越大,这一优势变得更加明显
derivate_gauss (Image, ImageGauss, 3, 'none')
dev_display (ImageGauss)
Message := 'Result of Gaussian filtering'
Message[1] := 'in the spatial domain'
disp_message (WindowHandle, Message, 'window', 450, 12, 'black', 'true')
stop ()
* 我们还可以检查一个区域的差异,远离图像边界。
gen_rectangle1 (Rectangle, 20, 20, Height - 21, Width - 21)
sub_image (ImageFiltered, ImageGauss, ImageSub, 1, 0)
min_max_gray (Rectangle, ImageSub, 0, Min, Max, Range)
intensity (Rectangle, ImageSub, Mean, Deviation)
dev_display (ImageSub)
Message := 'Gray value differences:'
Message[1] := 'Min: ' + Min$'4.2f' + ', Max: ' + Max$'4.2f'
disp_message (WindowHandle, Message, 'window', 450, 12, 'black', 'true')
stop ()
*现在创建一个导数过滤器并在图像上使用它。注意,导数滤波器不使用任何平滑。
*过滤器基于事实上,FFT可以解释为三角基函数。请注意,此行为不能很方便的
*使用标准过滤器实现。还要注意,计算一个没有平滑的导数通常不会返回有用的结果
*因为噪音被大大放大了。
gen_derivative_filter (DerivativeFilter, 'x', 1, 'n', 'rft', Width, Height)
convol_fft (ImageFFT, DerivativeFilter, ImageConvol)
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'none', 'real', Width)
dev_display (ImageFiltered)
Message := 'Result of pure derivative'
Message[1] := 'in the frequency domain'
disp_message (WindowHandle, Message, 'window', 450, 12, 'black', 'true')
stop ()
*现在将导数滤波器和平滑滤波器结合起来,得到一个平滑导数滤波器。这可以简单地通过
*将这两个过滤器相乘实现。由于效率的原因平滑过滤器是作为real图像创建的
*但是导数滤波器是一个complex图像,我们需要先将平滑滤波器转换为complex图像。
*此外,由于我们创建了两个标准化为“n”的过滤器,因此我们需要在多个图像中按Width*Height缩放过滤器。
convert_image_type (GaussFilter, GaussFilterComplex, 'complex')
mult_image (GaussFilterComplex, DerivativeFilter, GaussDerivativeFilter, Width * Height, 0)
convol_fft (ImageFFT, GaussDerivativeFilter, ImageConvol)
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'none', 'real', Width)
dev_display (ImageFiltered)
Message := 'Result of smoothed derivative'
Message[1] := 'in the frequency domain'
disp_message (WindowHandle, Message, 'window', 450, 12, 'black', 'true')
stop ()
*同样,我们可以检查结果是否与derivate_gauss返回的结果一致。
derivate_gauss (Image, ImageGauss, 3, 'x')
dev_display (ImageGauss)
Message := 'Result of smoothed derivative'
Message[1] := 'in the spatial domain'
disp_message (WindowHandle, Message, 'window', 450, 12, 'black', 'true')
stop ()
sub_image (ImageFiltered, ImageGauss, ImageSub, 1, 0)
min_max_gray (Rectangle, ImageSub, 0, Min, Max, Range)
intensity (Rectangle, ImageSub, Mean, Deviation)
dev_display (ImageSub)
Message := 'Gray value differences:'
Message[1] := 'Min: ' + Min$'4.2f' + ', Max: ' + Max$'4.2f'
disp_message (WindowHandle, Message, 'window', 450, 12, 'black', 'true')
stop ()
* 最后,创建一个各向异性定向高斯滤波器,并在图像上使用。注意,这是目前只能通过使用FFT来实现的。
gen_gauss_filter (GaussFilter, 2, 10, rad(10), 'n', 'rft', Width, Height)
convol_fft (ImageFFT, GaussFilter, ImageConvol)
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'none', 'real', Width)
dev_display (ImageFiltered)
Message := 'Anisotropic oriented smoothing'
Message[1] := 'in the frequency domain'
disp_message (WindowHandle, Message, 'window', 450, 12, 'black', 'true')


[halcon]1[/halcon]





欢迎光临 工控编程吧 (https://www.gkbc8.com/) Powered by Discuz! X3.4