前言
本文对图像种的银币进行分割,然后计银币数量
一、原图
二、图像处理基本思路
先取一个银币的模板,然后根据模板使用findmodelshape得到
- 首先二值化提取轮廓,会获得所有的银币区域
- 根据轮廓获取只有一个银币的轮廓范围
- 然后得到区域
- 生成xld的基于形状的模板
- 下面直接找模板即可
三、halcon代码实现
1.二值化获得区域
read_image (Coin, 'coin.jpg')
* 平滑图像
mean_image(Coin, ImageMean, 5, 5)
* 二值化
threshold(ImageMean, Region, 128, 255)
* 分割区域
connection(Region, ConnectedRegions)
* 选择只有一个银币的区域
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 95000, 100000)
2.创建XLD模板
主要算子:create_shape_model_xld
*提取边界
gen_contour_region_xld(SelectedRegions, Contours, 'border')
*XLD 輪廓(contour)的平滑
smooth_contours_xld(Contours, SmoothedContours, 15)
*使用XLD轮廓作为输入参数
create_shape_model_xld(SmoothedContours, 'auto', 0, 360, 'auto', 'auto', 'ignore_local_polarity', 5, ModelID)
*获得模板的轮廓
get_shape_model_contours(ModelContours, ModelID, 1)
3.找模板
read_image(Image,'coin.jpg')
mean_image(Image, ImageMean1, 3, 3)
find_shape_model(Image, ModelID, 0, 0.78, 0.7, 20, 0.5, 'least_squares', 1, 0.9, Row, Column, Angle, Score)
for Index := 0 to |Score|-1 by 1
disp_message(WindowHandle, Index, 'window', Row[Index], Column[Index], 'black', 'true')
* 生成刚性变换的矩阵
vector_angle_to_rigid( 0, 0, 0, Row[Index], Column[Index], Angle[Index],HomMat2D)
* 刚性变换,为了在图像中呈现银币区域
affine_trans_contour_xld(ModelContours, ContoursAffinTrans, HomMat2D)
endfor
disp_message(WindowHandle, '硬币总数为:'+Index$'1''', 'window', 40, 12, 'black', 'true')
clear_shape_model(ModelID)
4.效果展示
5.完整代码
read_image (Coin, 'coin.jpg')
mean_image(Coin, ImageMean, 5, 5)
threshold(ImageMean, Region, 128, 255)
connection(Region, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 95000, 100000)
*提取边界
gen_contour_region_xld(SelectedRegions, Contours, 'border')
*XLD 輪廓(contour)的平滑
smooth_contours_xld(Contours, SmoothedContours, 15)
*使用XLD轮廓作为输入参数
create_shape_model_xld(SmoothedContours, 'auto', 0, 360, 'auto', 'auto', 'ignore_local_polarity', 5, ModelID)
*找到模板的轮廓
get_shape_model_contours(ModelContours, ModelID, 1)
dev_close_window()
dev_open_window(0, 0, 512, 512, 'black', WindowHandle)
read_image(Image,'coin.jpg')
mean_image(Image, ImageMean1, 3, 3)
find_shape_model(Image, ModelID, 0, 0.78, 0.7, 20, 0.5, 'least_squares', 1, 0.9, Row, Column, Angle, Score)
for Index := 0 to |Score|-1 by 1
disp_message(WindowHandle, Index, 'window', Row[Index], Column[Index], 'black', 'true')
vector_angle_to_rigid( 0, 0, 0, Row[Index], Column[Index], Angle[Index],HomMat2D)
affine_trans_contour_xld(ModelContours, ContoursAffinTrans, HomMat2D)
endfor
disp_message(WindowHandle, '硬币总数为:'+Index$'1''', 'window', 40, 12, 'black', 'true')
clear_shape_model(ModelID)