模板纹理识别的步骤
特征提取
图像处理(二值化选中感兴趣区域,灰度共生矩阵(原图和感兴趣区域)得到特征,sobel得到轮廓,灰度直方图得到特征)
创建分类器,添加特征,保存,识别
1.文件夹遍历
list_image_files(::ImageDirector,Options:ImageFiles)
ImageDirector:文件夹路径;
Options:搜索选项(‘default’默认值为’files’)
‘files’ 指定搜索的格式为文件
‘directories’ 指定走所得格式为文件夹
‘recursive ’ 指定可以遍历文件夹下的文件
‘follow_links’
‘max_depth 5’ 指定遍历的深度
‘max_files 1000’ 指定遍历的最大文件数目
Files:文件(文件的路径)
Eg. list_files (‘D:/资料库/Downloads’, [‘files’,’follow_links’], ImageFiles)
2.文件格式筛选
tuple_regexp_select(::Data,Expression:Selection)
Data:被选择的文件路径数组
Expression:文件格式的摘选规则
\. 转义
(bmp|JPG)筛选的文件格式
‘ignore_case’ 忽略大小写
Selection 选择出的文件路径的数组
Eg. tuple_regexp_select (ImageFiles,[‘\.(tif|tiff|gif|bmp|jpg)$’,’ignore_case’], ImageFiles)
3.图像的灰度共生矩阵
cooc_feature_image(Regions, Image : : LdGray, Direction : Energy, Correlation, Homogeneity, Contrast)
Regions:区域
Image :图像
LdGray:要区分灰度值的数量(默认值6)
List of value:1,2,3,4,5,6,7,8
Direction :计算矩阵的方向(默认0)
List of value :0,45,90,135,’mean‘
Energy:能量(是灰度共生矩阵各元素值的平方和,是对图像纹理的灰度变化稳定程度的度量,反映了图像灰度分布均匀程度和纹理粗细度。能量值大表明当前纹理是一种规则变化较稳定的纹理)
Correlation:相关性,用来度量图像的灰度级在行或列方向上的相关性程度,值越大相关性越大
Homogeneity:熵,是图像包含信息量的随机性度量,当共生矩阵中所有值均相等或者像素值表现出最大的随机性时,熵最大,熵值越大图像越复杂。
Contrast:反差,对比度(度量矩阵的值是如何分布的和图像中局部变化的多少,反映了图形的清晰度和纹理的沟纹深浅。纹理的沟纹越深,反差越大,效果清晰)
Eg.cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
4.sobel_amp(Image : EdgeAmplitude : FilterType, Size : )
Eg.sobel_amp(Image,EdgeAmplitude,’sum_abs’,3)
Sobel算子得到的一次导数计算得到的图像边缘
5.灰度直方图
Gray_histo_abs(Regions,Image::Quantization:AbsoluteHisto)
Quantization:灰度值的量化(将256分成几份)
AbsoluteHisto:得到的值
Eg. gray_histo_abs(EdgeAmplitude,EdgeAmplitude,8,AbsoluteHistoEdgeAmplitude)
6.创建分类器
create_class_mlp(::NumInput,NumHidden,NumOutPut,OutputFunction,Preprocessing,NumComponents,RandSeed:MLPHandle)
NumInput:输入变量的个数
NumHidden:隐藏层的单元数
NumOutPut:输出变量的数目
OutputFunction:输出层激励函数的类型’softmax’,’linear’,
‘logistic’(默认softmax)
Preprocessing:转换特征向量的处理方法
NumComponents:转换特征的数目
RandSeed:初始化多层感知器的随机数种子
MLPHandle:
Eg.create_class_mlp (NumFeatures, 15, 5, ‘softmax’, ‘normalization’, 10, 42, MLPHandle)
7.添加训练集
add_sample_class_mlp(::MLPHandle,Features,Target:)
MLPHandle:训练器
Features:被储存的特征值
Target:指定的类别或期望的返回向量
Eg. add_sample_class_mlp (MLPHandle, FeatureVector, i)
8.训练分类器
Train_class_mlp(::MLPHandle,MaxIterations,WeightTolerance,ErrorTolerance:Error,ErrorLog)
MLPHandle:
MaxIterations:优化算法的最大迭代次数
WeightTolerance:最优算法在两次迭代的不同权重的阈值
ErrorTolerance:在训练数据上最优算法在两次迭代的平均错误的差值阈值
Error:训练数据的平均误差
ErrorLog:作为一个优化算法的迭代次数函数在训练数据上的平均错误
Eg. train_class_mlp(MLPHandle,200,1,0.0001,Error,ErrorLog)
9.保存训练数据
Write_class_mlp(::MLPHandle,FileName:)
Eg. write_class_mlp(MLPHandle, ‘D://1.gmc’)
10.识别
classify_class_mlp(::MLPHandle,Features,Num:Class,Confidence)
Features:特征向量
Num:确定所属类的上限(选出几个结果)
Class:特征向量根据多层神经网络的分类结果(得到的结果)
Confidence:分类结果的置信度
Eg.
classify_class_mlp(MLPHandle,FeatureVector,1,FoundClassIDs, k)
本文识别了5个木板图片
list_files ('E:/HA/picture', ['files','follow_links'], Files) tuple_regexp_select(Files,['\\.(jpg)$','ignore_case'],selection) for Index := 0 to |Files|-1 by 1 dev_close_window () read_image (Image, Files[Index]) get_image_size (Image, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) classes:=['1','2','3','4','5'] rgb1_to_gray (Image, GrayImage) threshold (GrayImage, Regions, 22, 254) connection (Regions, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10000, 60000) cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast) sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3) gray_histo_abs (SelectedRegions, EdgeAmplitude, 8, AbsoluteHisto) featureValue:=[Energy, Correlation, Homogeneity, Contrast,AbsoluteHisto] cooc_feature_image (SelectedRegions, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast) featureValue:=[featureValue,Energy, Correlation, Homogeneity, Contrast,AbsoluteHisto] featureNum:=|featureValue| featureVector:=real(featureValue) if (Index=0) *5为图片数目 create_class_mlp (featureNum, 10, 5, 'softmax', 'normalization', 10, 42, MLPHandle) endif add_sample_class_mlp (MLPHandle, featureVector,Index) endfor train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog) stop() write_class_mlp (MLPHandle, 'D://2.gmc') read_image (Image, 'E:/HA/网络启蒙班二十讲/picture/2.jpg') dev_display (Image) rgb1_to_gray (Image, GrayImage) threshold (GrayImage, Regions, 22, 254) connection (Regions, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10000, 60000) cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast) sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3) gray_histo_abs (SelectedRegions, EdgeAmplitude, 8, AbsoluteHisto) featureValue:=[Energy, Correlation, Homogeneity, Contrast,AbsoluteHisto] cooc_feature_image (SelectedRegions, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast) featureValue:=[featureValue,Energy, Correlation, Homogeneity, Contrast,AbsoluteHisto] featureVector:=real(featureValue) classify_class_mlp (MLPHandle, featureVector, 1, Class, Confidence) dev_display (Image) disp_message (WindowHandle, classes[Class[0]], 'window', 12, 12, 'black', 'true')
* 这个例子的目的是对不同的事物进行分类 * 木材的表面纹理. * 查看文件是否存在 file_exists ('classify_wood.gmc', FileExists) if (FileExists) USE_STORED_CLASSIFIER := 1 else USE_STORED_CLASSIFIER := 0 endif *首先设置图像的路径,初始图像 *读取并指定设置。 get_system ('image_dir', HalconImages) *获取HALCON的系统参数的当前值。 get_system ('operating_system', OS) if (OS{0:2} == 'Win') tuple_split (HalconImages, ';', HalconImages) else tuple_split (HalconImages, ':', HalconImages) endif *变量赋值 ImagePath := '/wood/' ReadOK := false *查询h开发程序中的首选项 dev_get_preferences ('suppress_handled_exceptions_dlg', SaveMode) dev_set_preferences ('suppress_handled_exceptions_dlg', 'true') *read_image读取图像 for k := 0 to |HalconImages| - 1 by 1 try read_image (Image, HalconImages[k] + ImagePath + 'apple/apple_01') ReadPath := HalconImages[k] + ImagePath ReadOK := true break catch (Exception) endtry endfor *disp_message写入文本消息 if (not ReadOK) disp_message (WindowID, 'Could not find the images in $HALCONIMAGES', 'window', -1, -1, 'black', 'true') stop () endif dev_set_preferences ('suppress_handled_exceptions_dlg', SaveMode) *读取图片 read_image (Image, ImagePath + 'apple/apple_01') *获取图片信息 get_image_pointer1 (Image, Pointer, Type, Width, Height) *关闭窗口 dev_close_window () *打开一个新的窗口 dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowID) *设置字体属性 set_display_font (WindowID, 22, 'mono', 'true', 'false') *显示image dev_display (Image) dev_update_off () * 现在指定了不同的木类。 Classes := ['apple','beech','cherry','maple','oak','walnut'] *程序默认使用一个存储分类器。但是,如果你, *要进行培训,建立use_stored_classifier 0。 *如果分类器可以不被发现,use_stored_classifier *自动设置为0。 if (USE_STORED_CLASSIFIER == 1) *从文件中读取多层感知器。 read_class_mlp ('classify_wood.gmc', MLPHandle) NumClasses := |Classes| else *计算多个金字塔层次上的纹理特征 gen_features (Image, FeatureVector) NumFeatures := |FeatureVector| NumClasses := |Classes| NumHidden := 15 * 创建用于分类或回归的多层感知器。 create_class_mlp (NumFeatures, NumHidden, NumClasses, 'softmax', 'normalization', 10, 42, MLPHandle) for CorrectClassID := 0 to NumClasses - 1 by 1 *列出目录中的所有文件。 list_files (ReadPath + Classes[CorrectClassID], 'files', Files) for k := 0 to |Files| - 1 by 2 *读取image read_image (Image, Files[k]) *显示 dev_display (Image) *计算多个金字塔层次上的纹理特征 gen_features (Image, FeatureVector) *将训练样本添加到多层感知器的训练数据中 add_sample_class_mlp (MLPHandle, FeatureVector, CorrectClassID) endfor endfor *训练多层感知器 train_class_mlp (MLPHandle, 200, 1, 0.0001, Error, ErrorLog) *将多层感知器写入文件 write_class_mlp (MLPHandle, 'classify_wood.gmc') *将信息写入文本 disp_message (WindowID, 'Training of wood textures completed\nPress \'Run\' to continue', 'window', -1, -1, 'black', 'true') *停止程序执行 stop () endif Errors := 0 Count := 0 for CorrectClassID := 0 to NumClasses - 1 by 1 *查找所以文件 list_files (ReadPath + Classes[CorrectClassID], 'files', Files) for k := 0 to |Files| - 1 by 1 Count := Count + 1 *读取 read_image (Image, Files[k]) *计算文理特征 gen_features (Image, FeatureVector) *用多层感知器计算特征向量的类。 classify_class_mlp (MLPHandle, FeatureVector, 2, FoundClassIDs, Confidence) *显示 dev_display (Image) *设置颜色 dev_set_color ('blue') *写入信息 disp_message (WindowID, 'correct class: ' + Classes[CorrectClassID], 'window', 24, 12, 'black', 'true') if (CorrectClassID != FoundClassIDs[0]) dev_set_color ('red') *设置文本光标的位置。 set_tposition (WindowID, 55, 12) *写入文本 write_string (WindowID, 'found class: ' + Classes[FoundClassIDs[0]]) Errors := Errors + 1 *此过程显示“单击”运行“继续”在屏幕右下角。 disp_continue_message (WindowID, 'red', 'true') stop () endif wait_seconds (0.1) endfor endfor ErrorRate := real(Errors) / Count * 100.0 clear_class_mlp (MLPHandle)
---------------------
作者:抓棋
来源:CSDN
原文:https://blog.csdn.net/weixin_43216599/article/details/82723045
版权声明:本文为博主原创文章,转载请附上博文链接!

