文章目录
*此示例显示了如何使用傅立叶变换来确定网格的旋转角度。
*首先,参考图像(旋转角度0°)用于创建边缘方向的参考光谱。
*通过将任意旋转栅格的边缘方向的频谱与参考频谱相关联,可以确定栅格的旋转角度。
*此示例显示了如何使用傅立叶变换来确定网格的旋转角度。
*首先,参考图像(旋转角度0°)用于创建边缘方向的参考光谱。
*通过将任意旋转栅格的边缘方向的频谱与参考频谱相关联,可以确定栅格的旋转角度。
dev_close_window ()
dev_update_off ()
read_image (ImagePattern, 'grid/grid_01')
get_image_size (ImagePattern, Width, Height)
Scale := .7
HistoBorder := .15
dev_open_window (0, 0, Width * Scale, Height * Scale, 'black', WindowHandle)
dev_set_part (0, 0, Height - 1, Width - 1)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
dev_open_window (0, (Width * Scale) + 12, Width * Scale, Height * Scale, 'white', WindowHisto)
set_display_font (WindowHisto, 14, 'mono', 'true', 'false')
dev_set_draw ('margin')
dev_set_line_width (2)
Row := gen_tuple_const(180,0)
Column := [0:179]
*(* )
*计算参考方向的直方图
optimize_fft_speed (180, 1, 'standard')
compute_edge_direction_histogram (ImagePattern, ImageDirRef, HistogramDirRef)
rft_generic (ImageDirRef, ImageFFTRef, 'to_freq', 'none', 'complex', 180)
dev_set_window (WindowHandle)
dev_display (ImagePattern)
disp_message (WindowHandle, 'Reference image', 'window', 10, 10, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
dev_set_window (WindowHisto)
dev_clear_window ()
ValueYMax := max(HistogramDirRef)
dev_set_part (0, 0, Height - 1, Width - 1)
plot_histo_scale (HistogramDirRef, WindowHisto, 'Angle [°]', 0, 359, 0, ValueYMax, 'black', 'blue', HistoBorder)
disp_message (WindowHisto, 'Distribution of edge orientation', 'window', 12, 70, 'black', 'false')
disp_message (WindowHisto, 'Reference image', 'window', 50, 280, 'black', 'false')
dev_set_color ('blue')
disp_line (WindowHisto, 85, 355, 85, 390)
stop ()
*(* )
*确定要处理的图像的方向
NumImages := 7
for Index := 1 to 7 by 1
read_image (Image, 'grid/grid_' + Index$'.2d')
*( * )
*旋转物体的FFT图像
compute_edge_direction_histogram (Image, ImageTest, HistogramDirTest)
rft_generic (ImageTest, ImageFFTTest, 'to_freq', 'none', 'complex', 180)
*( * )
*旋转物体的FFT图像与参考FFT的比较
correlation_fft (ImageFFTRef, ImageFFTTest, ImageCorrelation)
rft_generic (ImageCorrelation, ImageFFT, 'from_freq', 'none', 'real', 180)
get_grayval (ImageFFT, Row, Column, Grayval)
create_funct_1d_array ([Grayval[179],Grayval,Grayval[0]], Function)
*( * )
*找到目标和参考FFT之间的最佳相关性
determine_max_correlation (Function, Angle)
*( * )
*显示结果
dev_set_window (WindowHandle)
dev_display (Image)
disp_message (WindowHandle, 'Grid is rotated by ' + Angle$'.2f' + '°', 'window', 10, 10, 'black', 'true')
dev_set_window (WindowHisto)
dev_clear_window ()
ValueYMax := max([HistogramDirRef,HistogramDirTest])
dev_set_part (0, 0, Height - 1, Width - 1)
plot_histo_scale (HistogramDirRef, WindowHisto, '', 0, 359, 0, ValueYMax, 'black', 'blue', HistoBorder)
plot_histo_scale (HistogramDirTest, WindowHisto, 'Angle [°]', 0, 359, 0, ValueYMax, 'black', 'red', HistoBorder)
disp_message (WindowHisto, 'Distribution of edge orientation', 'window', 12, 70, 'black', 'false')
disp_message (WindowHisto, 'Reference image', 'window', 50, 280, 'black', 'false')
disp_message (WindowHisto, 'Current image', 'window', 65, 280, 'black', 'false')
dev_set_color ('blue')
disp_line (WindowHisto, 85, 355, 85, 390)
dev_set_color ('red')
disp_line (WindowHisto, 105, 355, 105, 390)
if (Index != NumImages)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endif
endfor