核酸管外观缺陷检测(二)

1.1应用示例思路

(1)创建分类器;

(2)向分类器中添加样本;

(3)训练分类器;

(4) 测试数据,并将检测结果写入txt文件中。

1.2 应用示例相关算子介绍

(1) create_class_mlp( : : NumInput, NumHidden, NumOutput, OutputFunction, Preprocessing, NumComponents, RandSeed : MLPHandle)

功能:create_class_mlp以多层感知器(MLP)的形式创建一个神经网络,它可以用于分类或回归(函数近似),具体取决于OutputFunction的设置方式。MLP由三层组成:具有NumInput个输入变量(神经元)的输入层,具有NumHidden个神经元的隐藏层和具有NumOutput个输出变量的输出层。

控制输入参数1:NumInput:MLP输入变量(特征)的个数;

控制输入参数2:NumHidden:MLP隐藏层神经元的个数;

控制输入参数3:NumOutput:MLP输出变量的个数(类别数);

控制输入参数4:OutputFunction:MLP输出层激活函数的类型,Default value: 'softmax';

控制输入参数5:Preprocessing:用于变换特征向量的预处理类型,Default value: 'normalization';

控制输入参数6:NumComponents:预处理参数:转换特征的数量(Preprocessing= 'none'和Preprocessing= 'normalization'时忽略),Default value: 10;

控制输入参数7:RandSeed:用随机值初始化MLP的随机数生成器的种子值;

控制输出参数:MLPHandle:MLP句柄。

(2) gen_cooc_matrix(Regions, Image : Matrix : LdGray, Direction : )

功能:从输入区域确定在某个方向(0,45,90,135度)上相邻灰度值(有序灰度值数对)出现的次数,并将其存储在位置(I,j)和(j, I)的共现矩阵中(矩阵是对称的),最后再缩放矩阵。

图形输入参数1:Regions:待检查的区域;

图形输入参数2:Image:灰度图像;

图形输出参数:Matrix:共生矩阵;

控制输入参数1:LdGray:灰度级数,Default value: 6;

控制输入参数2:Direction:相邻位置的方向,List of values: 0, 45, 90, 135。

(3) cooc_feature_matrix(CoocMatrix : : : Energy, Correlation, Homogeneity, Contrast)

功能:从共生矩阵中计算灰度值特征;从一个共生矩阵(CoocMatrix)中计算能量(energy)、相关性(correlation)、局部同质性(homogenous)和对比度(contrast)。

图形输入参数:CoocMatrix:输入的共生矩阵;

控制输入参数1:Energy(灰度值均匀性):表示灰度共生矩阵中的元素的平方和。能量越大,表示灰度变化比较稳定,反映了纹理变化变化的均匀程度。比如当像素值全部为1时,对应的共生矩阵中(1,1)有16个,其他为0,则能量为16*16,此时能量最大,灰度变化最稳定,因为都为0;

控制输入参数2:Correlation(灰度值的相关性):表示纹理在行或者列方向的相似程度。相关性越大,相似性越高;

控制输入参数3:Homogeneity(灰度值的局部均匀性):反映图像局部纹理的变化量。值越大,表示图像局部的变化越小。

控制输入参数4:Contrast(灰度值的对比度):表示矩阵的值的差异程度,也间接表现了图像的局部灰度变化幅度。对比度值越大,图像中的纹理深浅越明显,表示图像越清晰;反之,则表示图像越模糊;

(4) cooc_feature_image(Regions, Image : : LdGray, Direction : Energy, Correlation, Homogeneity, Contrast)

功能:计算共生矩阵并推导其灰度值特征。

图形输入参数1:Regions:待检查的区域;

图形输入参数2:Image:灰度图像;

控制输入参数1:LdGray:灰度级数,Default value: 6;

控制输入参数2:Direction:相邻位置的方向,List of values: 0, 45, 90, 135, 'mean';

控制输出参数1:Energy:灰度值均匀性;

控制输出参数2:Correlation:灰度值的相关性;

控制输出参数3:Homogeneity:灰度值的局部均匀性;

控制输出参数4:Contrast:灰度值的对比度

(5) sobel_amp(Image : EdgeAmplitude : FilterType, Size : )

功能:使用sobel(索贝尔)算子计算图像的一阶导数(幅值)进行边缘检测。

图形输入参数:Image:输入图像;

图形输出参数:EdgeAmplitude:边缘幅度图像;

控制输入参数1:FilterType:滤波器类型,Default value: 'sum_abs';

控制输入参数2:Size:滤波器mask尺寸大小,Default value: 3。

(6) gray_histo_abs(Regions, Image : : Quantization : AbsoluteHisto)

功能:计算灰度直方图。

图形输入参数1:Regions:要计算直方图的区域;

图形输入参数2:Image:待计算图像的灰度值分布;

控制输入参数:Quantization:灰度值的量化,Default value: 1.0;

控制输出参数:AbsoluteHisto:灰度值出现的频数。

(7) add_sample_class_mlp( : : MLPHandle, Features, Target : )

功能:向多层感知机的训练数据中添加一个训练样本。

控制输入参数1:MLPHandle:MLP句柄;

控制输入参数2:Features:待存储训练样本的特征向量;

控制输入参数3:Target:待存储训练样本的类或目标向量。

(8) train_class_mlp( : : MLPHandle, MaxIterations, WeightTolerance, ErrorTolerance : Error, ErrorLog)

功能:训练一个多层感知器。

控制输入参数1:MLPHandle:MLP句柄;

控制输入参数2:MaxIterations:优化算法的最大迭代次数;

控制输入参数3:WeightTolerance:在优化算法的两次迭代之间,MLP权值之差设置阈值,Default value: 1.0;

控制输入参数4:ErrorTolerance :在优化算法的两次迭代之间,MLP对训练数据的平均误差设置阈值,Default value: 0.01;

控制输出参数1:Error:MLP对训练数据的平均误差;

控制输出参数2:ErrorLog:MLP在训练数据上的平均误差作为优化算法迭代次数的函数。

(9) write_class_mlp( : : MLPHandle, FileName : )

功能:将训练好的多层感知器模型写入文件。

控制输入参数1:MLPHandle:MLP句柄;

控制输入参数2:FileName:待保存的文件名

(10) classify_class_mlp( : : MLPHandle, Features, Num : Class, Confidence)

功能:用多层感知器计算特征向量的类别。

控制输入参数1:MLPHandle:MLP句柄;

控制输入参数2:Features:特征向量;

控制输入参数3:Num:要确定的最佳类的数量,Default value: 1;

控制输出参数1:Class:用MLP对特征向量进行分类的结果;

控制输出参数2:Confidence:特征向量属于某一类别的置信度。

1.3 应用示例代码

*1、创建分类器
NumFeatures:=72  //输入特征的个数
NumHidden:=15    //隐藏层神经元个数
NumClasses:=2    //输出的类别数
create_class_mlp (NumFeatures, NumHidden, NumClasses, 'softmax', 'normalization', 10, 42, MLPHandle)
*2、添加样本 
*********************添加正样本******************************************
list_files ('./ok/', ['files','follow_links'], P_ImageFiles)
tuple_regexp_select (P_ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], P_ImageFiles)
for i := 0 to |P_ImageFiles| - 1 by 1
    read_image (Image, P_ImageFiles[i])  
    rgb1_to_gray (Image, GrayImage)
    threshold (GrayImage, Regions, 30, 145)
    connection (Regions, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 500000, 800000)
    cooc_feature_image (SelectedRegions, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
    sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
    gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude)
    FeaturesExtended:=[Energy, Correlation, Homogeneity, Contrast]
    FeaturesExtended:=[FeaturesExtended,AbsoluteHistoEdgeAmplitude]
    cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
    sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
    gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude)
    FeaturesExtended1:=[FeaturesExtended,Energy, Correlation, Homogeneity, Contrast]
    FeaturesExtended1:=[FeaturesExtended1,AbsoluteHistoEdgeAmplitude]
    FeatureVector:=real(FeaturesExtended1) //实数化
    *添加正样本
    add_sample_class_mlp (MLPHandle, FeatureVector, 0)
endfor 
************************添加负样本****************************************   
list_files ('./ng1/', ['files','follow_links'], N_ImageFiles)
tuple_regexp_select (N_ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], N_ImageFiles)
for i := 0 to |N_ImageFiles| - 1 by 1
    read_image (Image, N_ImageFiles[i])  
    rgb1_to_gray (Image, GrayImage)
    threshold (GrayImage, Regions, 30, 145)
    connection (Regions, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 500000, 800000)
    cooc_feature_image (SelectedRegions, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
    sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
    gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude)
    FeaturesExtended:=[Energy, Correlation, Homogeneity, Contrast]
    FeaturesExtended:=[FeaturesExtended,AbsoluteHistoEdgeAmplitude]
    cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
    sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
    gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude)
    FeaturesExtended1:=[FeaturesExtended,Energy, Correlation, Homogeneity, Contrast]
    FeaturesExtended1:=[FeaturesExtended1,AbsoluteHistoEdgeAmplitude]
    FeatureVector:=real(FeaturesExtended1) //实数化
    *添加负样本
    add_sample_class_mlp (MLPHandle, FeatureVector, 1)
endfor

*3、训练分类器
train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
stop ()
write_class_mlp (MLPHandle, './HeSuanGuan.gmc')

*4、测试数据
*统计核酸管外观正常的数组
P_Tuple:=[]
*统计核酸管外观缺陷的数组
N_Tuple:=[]
*判断文件是否存在
file_path:= './核酸管外观缺陷检测统计2.txt'
file_exists (file_path, file_exist)
if (file_exist==1)
    delete_file (file_path)
endif
open_file (file_path, 'output', FileHandle)
list_files ('./Test_img/', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
for Index := 0 to |ImageFiles| - 1 by 1
    img_path:=ImageFiles[Index]
    *文件名拆分
    parse_filename (img_path, BaseName, Extension, Directory)
    read_image (Image, img_path)   
    rgb1_to_gray(Image, GrayImage)
    threshold (GrayImage, Regions, 30, 145)
    connection (Regions, ConnectedRegions)
    select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 500000, 800000)
    cooc_feature_image (SelectedRegions, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
    sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
    gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude)
    FeaturesExtended := [Energy,Correlation,Homogeneity,Contrast]
    FeaturesExtended := [FeaturesExtended,AbsoluteHistoEdgeAmplitude]
    cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
    sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
    gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHistoEdgeAmplitude)
    FeaturesExtended1 := [FeaturesExtended,Energy,Correlation,Homogeneity,Contrast]
    FeaturesExtended1 := [FeaturesExtended1,AbsoluteHistoEdgeAmplitude]
    FeatureVector := real(FeaturesExtended1)
    classify_class_mlp (MLPHandle, FeatureVector, 1, FoundClassIDs, k)
    if(FoundClassIDs==0)
        P_Tuple:=[P_Tuple,1]
        fwrite_string(FileHandle,[Index,'核酸管外观正常的图片名:',BaseName])
        fnew_line(FileHandle)
    else
        N_Tuple:=[N_Tuple,0]
        fwrite_string(FileHandle,[Index,'核酸管外观缺陷的图片名:',BaseName])
        fnew_line(FileHandle)
    endif    
endfor

tuple_length (P_Tuple, P_Length)
tuple_length (N_Tuple, N_Length)
Yield_Rate:= real(P_Length)/real(N_Length+P_Length)
fwrite_string(FileHandle,['核酸管良品率:',Yield_Rate])
fnew_line(FileHandle)
close_file (FileHandle)

部分检测结果:

核酸管外观缺陷检测(二)_第1张图片

你可能感兴趣的:(《机器视觉应用》,机器视觉)