Halcon木板纹理识别(halcon分类器)

模板纹理识别的步骤 

  • 特征提取 

  • 图像处理(二值化选中感兴趣区域,灰度共生矩阵(原图和感兴趣区域)得到特征,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 

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864