一种几何匹配的改进处理方式
来源:互联网 发布:网络rtt 编辑:程序博客网 时间:2024/04/28 12:34
1、背景
普通的几何匹配常常无法到达理想的匹配结果,比如,目标物体出现细微的形状或者大小偏差,就容易匹配不到。
本文讨论一种方法,通过均值化多个已知模板,从而提高算法的鲁棒性。
2、设计思路
1)人工模板绘制
通过对目标物体的已知的几何特征,绘制出相应的人工模板,便于后续的对模板的提取。
具体实现及注解:
*图片加载
dev_update_off ()
dev_close_window ()
read_image (Image, 'smd/smd_samples')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
dev_set_line_width (2)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*绘制人工模板
MinScore1 := 0.65
MinScore2 := 0.8
create_reference_image (ReducedReferenceImage)
area_center (ReducedReferenceImage, Area, RowRef, ColumnRef)
get_image_size (ReducedReferenceImage, RefImgWidth, RefImgHeight)
dev_open_window (0, Width+12, 3*RefImgWidth, 3*RefImgHeight, 'black', WindowHandleAvg)
set_display_font (WindowHandleAvg, 14, 'mono', 'true', 'false')
dev_display (ReducedReferenceImage)
disp_message (WindowHandleAvg, '1. Search artificial model', 'window', -1, -1, 'black', 'true')
disp_continue_message (WindowHandleAvg, 'black', 'true')
stop ()
其中,人工模板的绘制工作主要由函数create_reference_image (ReducedReferenceImage)完成,该函数的具体实现:
Row1 := 20
Row2 := 64
Column1 := 20
Column2 := 106
Column11 := 38
Column12 := 88
*分别生成人工模板的主要轮廓
gen_contour_polygon_rounded_xld (TemplateShape, [Row1,Row1,Row2,Row2,Row1], [Column1,Column2,Column2,Column1,Column1], [9,9,9,9,9], 1)
gen_contour_polygon_rounded_xld (TemplateLeft, [Row1,Row1,Row2,Row2,Row1], [Column1,Column11,Column11,Column1,Column1], [9,7,7,9,9], 1)
gen_contour_polygon_rounded_xld (TemplateRight, [Row1,Row1,Row2,Row2,Row1], [Column12,Column2,Column2,Column12,Column12], [7,9,9,7,7], 1)
*根据轮廓生成模板图像,给定灰度值
gen_image_const (BlacKBacKground, 'byte', Column2+20, Row2+20)
paint_xld (TemplateShape, BlacKBacKground, ReferenceImage1, 90)
paint_xld (TemplateLeft, ReferenceImage1, ReferenceImageTmp, 150)
paint_xld (TemplateRight, ReferenceImageTmp, ReferenceImage, 150)
concat_obj (TemplateShape, TemplateLeft, Tmp)
concat_obj (Tmp, TemplateRight, DispTemplate)
gen_rectangle1 (TemplateROI, Row1-10, Column1-10, Row2+10, Column2+10)
reduce_domain (ReferenceImage, TemplateROI, ReducedReferenceImage)
* write_image (ReducedReferenceImage, 'png best', 0, 'template')
return ()
2)根据人工模板搜索目标样本
具体实现:
create_scaled_shape_model (ReducedReferenceImage, 0, rad(-1), rad(2), 0, 0.77, 0.78, 0, 'point_reduction_low', 'use_polarity', 30, 3, ModelID)
get_shape_model_params (ModelID, NumLevels, AngleStart, AngleExtent, AngleStep, ScaleMin, ScaleMax, ScaleStep, Metric, MinContrast)
find_scaled_shape_model (Image, ModelID, rad(0), rad(180), 0.77, 0.78, MinScore1, 0, 0, 'interpolation', 2, 0.7, Row, Column, Angle, Scale, Score)
*
dev_set_window (WindowHandle)
dev_display (Image)
dev_set_color ('green')
dev_display_shape_matching_results (ModelID, 'green', Row, Column, Angle, Scale, Scale, 0)
disp_message (WindowHandle, 'MinScore: '+MinScore1, 'window', -1, -1, 'black', 'true')
stop ()
*
3)获取所有匹配到的结果,计算图像均值
具体实现及注解:
dev_set_window (WindowHandleAvg)
dev_set_line_width (2)
get_shape_model_contours (ModelContours, ModelID, 1)
*生成一个空的目标图像,用来存放匹配结果
gen_empty_obj (Templates)
for K := 0 to |Row|-1 by 1
vector_angle_to_rigid (RowRef, ColumnRef, 0, Row[K], Column[K], Angle[K], HomMat2DTranslate)
hom_mat2d_scale (HomMat2DTranslate, Scale[K], Scale[K], Row[K], Column[K], HomMat2DScale)
hom_mat2d_invert (HomMat2DScale, HomMat2DInvert)
affine_trans_image (Image, ImageAffinTrans, HomMat2DInvert, 'constant', 'false')
*切割一段矩形区域,存放在Templates中
crop_rectangle1 (ImageAffinTrans, ImagePart, 0, 0, 80, 130)
concat_obj (Templates, ImagePart, Templates)
*
dev_set_window (WindowHandle)
if (K > 0)
dev_display_shape_matching_results (ModelID, 'green', Row[K-1], Column[K-1], Angle[K-1], Scale[K-1], Scale[K-1], 0)
endif
dev_display_shape_matching_results (ModelID, 'yellow', Row[K], Column[K], Angle[K], Scale[K], Scale[K], 0)
dev_set_window (WindowHandleAvg)
dev_display (ImagePart)
wait_seconds (0.2)
endfor
*计算平均图片
channels_to_image (Templates, MultiChannelImage)
mean_n (MultiChannelImage, ImageMean)
dev_set_window (WindowHandle)
dev_display_shape_matching_results (ModelID, 'green', Row[K-1], Column[K-1], Angle[K-1], Scale[K-1], Scale[K-1], 0)
dev_set_window (WindowHandleAvg)
dev_display (ImageMean)
disp_message (WindowHandleAvg, 'Average object image', 'window', -1, -1, 'black', 'true')
disp_continue_message (WindowHandleAvg, 'black', 'true')
stop ()
其中,主要用到了多通道图像处理函数channels_to_image (Templates, MultiChannelImage)和mean_n (MultiChannelImage, ImageMean),来完成均值计算。
5)将通过均值计算得到的ImageMean,作为最佳匹配模板,再进行几何匹配
create_scaled_shape_model (ImageMean, 0, rad(-1), rad(2), 0, 0.77, 0.78, 0, 'point_reduction_low', 'use_polarity', 45, 30, ModelIDAvg)
find_scaled_shape_model (Image, ModelIDAvg, rad(0), rad(180), 0.77, 0.78, MinScore2, 0, 0, 'interpolation', 2, 0.7, Row, Column, Angle, Scale, Score)
*
dev_display (ImageMean)
disp_message (WindowHandleAvg, 'Resulting shape based model', 'window', -1, -1, 'black', 'true')
get_shape_model_contours (ModelContoursAvg, ModelIDAvg, 1)
area_center (ImageMean, Area1, Row1, Column1)
vector_angle_to_rigid (0, 0, 0, Row1, Column1, 0, HomMat2D)
affine_trans_contour_xld (ModelContoursAvg, ContoursAffinTrans, HomMat2D)
dev_set_color ('yellow')
dev_display (ContoursAffinTrans)
disp_continue_message (WindowHandleAvg, 'black', 'true')
stop ()
*
dev_set_window_extents (-1, -1, Width, Height)
dev_display (Image)
dev_set_color ('green')
dev_display_shape_matching_results (ModelIDAvg, 'green', Row, Column, Angle, Scale, Scale, 0)
disp_message (WindowHandleAvg, 'MinScore: '+MinScore2, 'window', -1, -1, 'black', 'true')
*
clear_shape_model (ModelIDAvg)
clear_shape_model (ModelID)
- 一种几何匹配的改进处理方式
- 模式匹配的一种改进算法----KMP算法
- KMP算法----模式匹配的一种改进算法
- win下冗长选择输入的一种改进方式
- [搜索]一种改进的召回率准确率公式计算方式
- uC/OS-II任务栈处理的一种改进方法
- uC/OS-II任务栈处理的一种改进方法
- MINA2处理转发的一种解决方式
- <Android>超时处理的一种方式
- 一种改进的字符串匹配算法--Quick Search算法
- Redis存储Key的一种设计实现方式:模式匹配
- 关于VirtualHost的匹配解释,无匹配的处理方式
- Lz77的一种改进方法
- 一种改进的回声消除
- HttpUnit: 一种在 WebSphere Studio 中测试 Web 应用程序的改进方式
- NISLVMP:一种新的保护方式,基于VM,改进之<译>
- 一种比较好的 处理viewHolder 的方式
- SQL Server2005维护计划一种错误的处理方式
- AnimRefreshRecyclerViewDemo 分享
- getopt函数--获取命令行参数
- java的Calendar,获取月份少一月的问题及其它注意事项
- JAVA webservice之xfire
- 欢迎来到我的博客
- 一种几何匹配的改进处理方式
- java导入xls和xlsx格式
- cookie mapping
- IOS9后自定义大头针无法正常显示
- hdu 5136 Yue Fei's Battle 树的dp计数
- UIView中的layoutSubviews和drawRect
- 面向对象(多态中成员的特点)
- HDU 1011 Starship Troopers(树形DP入门题)
- Java WebCollector爬虫采集数据