药品包装或质量控制

CSDN 2024-08-29 08:31:31 阅读 83

下述代码是一个图像处理和机器学习分类的脚本,用于识别和分类药片。它使用了HALCON软件的命令集,HALCON是一个用于机器视觉和图像分析的高级编程语言和开发环境。

dev_close_window ()

read_image (Image, ‘blister/blister_mixed_reference’)

dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)

dev_update_off ()

dev_display (Image)

dev_set_draw (‘margin’)

*

First, we extract the content of the blister and passthis information on to the gmm classifier

disp_message (WindowHandle, ‘Train gmm classifier on pill types’, ‘window’, -1, -1, ‘black’, ‘true’)

extract_pill_types (Image, Chambers, ChambersUnion, Classes, PhiRef, RowRef, ColumnRef, PillTypeCount)

NumClasses := |PillTypeCount|

create_class_gmm (3, 3, [1,5], ‘spherical’, ‘normalization’, 10, 42, GMMHandle)

add_samples_image_class_gmm (Image, Classes, GMMHandle, 0)

train_class_gmm (GMMHandle, 100, 0.001, ‘training’, 0.0001, Centers, Iter)Then, the subsequent blisters are tested for their right combination

Count := 12

for FileIndex := 1 to Count by 1

*

Align image read

read_image (Image, ‘blister/blister_mixed_’ + FileIndex$‘02’)

threshold (Image, Region, 90, 255)

connection (Region, ConnectedRegions)

select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 5000, 9999999)

shape_trans (SelectedRegions, RegionTrans, ‘convex’)

orientation_region (RegionTrans, Phi)

if (abs(Phi) > rad(90))

Phi := rad(180) + Phi

endif

area_center (RegionTrans, Area1, Row, Column)

vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D)

affine_trans_image (Image, ImageAffinTrans, HomMat2D, ‘constant’, ‘false’)

reduce_domain (ImageAffinTrans, ChambersUnion, ImageReduced)

decompose3 (ImageAffinTrans, ImageR, ImageG, ImageB)Classify pill type for each chamber

classify_image_class_gmm (ImageReduced, ClassRegions, GMMHandle, 0.005) count_obj (ClassRegions, Number)

gen_empty_obj (FinalClasses)

connection (Chambers, ChambersRemaining)

for Index := Number to 1 by -1

dev_clear_window ()

select_obj (ClassRegions, Region, Index)

intersection (ChambersRemaining, Region, Region)

select_shape (Region, PillsOfOneType, [‘area’,‘width’], ‘and’, [200,40], [3000,68])

difference (ChambersUnion, PillsOfOneType, RegionDifference)

connection (RegionDifference, ConnectedRegions)

select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 0, 7868)

shape_trans (SelectedRegions, SelectedRegions, ‘convex’)

union1 (SelectedRegions, SelectedRegions)

difference (ChambersRemaining, SelectedRegions, ChambersRemaining)

concat_obj (SelectedRegions, FinalClasses, FinalClasses)

endfor

*

*

Check for right combination

gen_empty_obj (MissingPills)

gen_empty_obj (WrongPills)

gen_empty_obj (WrongNumberOfPills)

difference (ChambersUnion, FinalClasses, LeftOvers)

area_center (LeftOvers, Area, Row1, Column1)

if (Area > 0)

connection (LeftOvers, LeftOvers)

count_obj (LeftOvers, Number)

for Index := 1 to Number by 1

select_obj (LeftOvers, ObjectSelected, Index)

intensity (ObjectSelected, ImageB, Mean, Deviation)

if (Deviation > 40)

concat_obj (WrongPills, ObjectSelected, WrongPills)

else

concat_obj (MissingPills, ObjectSelected, MissingPills)

endif

endfor

endifCompute histogram

CountFinalClass := []

for Index := 1 to NumClasses by 1

select_obj (FinalClasses, ObjectSelected, Index)

connection (ObjectSelected, ObjectSelected)

count_obj (ObjectSelected, Size)

CountFinalClass := [CountFinalClass,Size]

endforDisplay classification results and output allover statistic

display_results (ImageAffinTrans, LeftOvers, FinalClasses, WrongPills, CountFinalClass, PillTypeCount, WindowHandle)

if (FileIndex < Count)

disp_continue_message (WindowHandle, ‘black’, ‘true’)

endif

stop ()

endfor Clear classifier handle

clear_class_gmm (GMMHandle)

blister_mixed_reference.png

在这里插入图片描述

blister_mixed_01.png

在这里插入图片描述

blister_mixed_02.png

在这里插入图片描述

blister_mixed_03.png

在这里插入图片描述

blister_mixed_04.png

在这里插入图片描述

blister_mixed_05.png

在这里插入图片描述

blister_mixed_06.png

在这里插入图片描述

blister_mixed_07.png

在这里插入图片描述

blister_mixed_08.png

在这里插入图片描述

blister_mixed_09.png

在这里插入图片描述

blister_mixed_010.png

在这里插入图片描述

blister_mixed_011.png

在这里插入图片描述

blister_mixed_012.png

在这里插入图片描述

以下是程序运行结果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

以下是代码的大致流程和功能解释:

初始化和显示设置:

dev_close_window():关闭当前窗口。

dev_open_window_fit_image():打开一个窗口以适应图像大小。

set_display_font():设置显示字体。

图像读取和预处理:

read_image():读取图像。

threshold():对图像进行阈值处理,提取感兴趣的区域。

connection():连接相邻的区域。

select_shape():根据面积筛选区域。

shape_trans():转换区域形状,例如转换为凸包。

orientation_region():计算区域的方向。

图像变换:

area_center():计算区域的中心点。

vector_angle_to_rigid():根据中心点和方向生成刚体变换矩阵。

affine_trans_image():对图像进行仿射变换。

颜色分解:

decompose3():将图像分解为红绿蓝三个颜色通道。

GMM分类器训练:

create_class_gmm():创建高斯混合模型(GMM)分类器。

add_samples_image_class_gmm():向GMM分类器添加图像样本。

train_class_gmm():训练GMM分类器。

药片类型分类:

classify_image_class_gmm():使用训练好的GMM分类器对图像进行分类。

后处理和统计:

count_obj():计算对象的数量。

gen_empty_obj():生成空的对象。

difference():计算差集。

union1():计算并集。

concat_obj():连接对象。

结果展示和统计输出:

display_results():展示分类结果和统计信息。

循环处理多个图像:

通过一个循环读取和处理多个图像文件。

清理资源:

clear_class_gmm():清理GMM分类器资源。

这段代码是一个完整的工作流程,从图像的读取、预处理、特征提取、分类器训练、分类、后处理到结果展示。它适用于自动化药片识别和分类的场景,例如在药品包装或质量控制中。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。