*********************************木板的纹理识别程序
**********************************本程序知识量太大,需要多多研究!
***定义变量
FeaturesExtended:=[]
FeaturesExtended1:=[]
Classes := ['apple','beech','cherry','maple','oak']
NumberClasses := |Classes|
**加载图像文件
list_files ('F:/7.机器视觉/Halcon/halcon学习/纹理识别专题', ['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)
**初始化窗口
dev_close_window ()
read_image (Image, ImageFiles[0])
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
for i := 0 to |ImageFiles| - 1 by 1
**1.提取特征
read_image (Image, ImageFiles[i])
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Region, 31, 254)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
**灰度共生矩阵,目的是提取纹理特征后面四个变量
cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
*sobel边缘检测
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
**获得灰度直方图,8是量化因子
gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHisto)
FeaturesExtended:=[Energy, Correlation, Homogeneity, Contrast]
**向特征数组中添加一个特征AbsoluteHisto
FeaturesExtended:=[FeaturesExtended,AbsoluteHisto]
cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
*sobel边缘检测
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
**获得灰度直方图,8是量化因子
gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHisto)
FeaturesExtended1 := [FeaturesExtended,Energy, Correlation, Homogeneity, Contrast]
**向特征数组中添加一个特征AbsoluteHisto
FeaturesExtended1 := [FeaturesExtended1,AbsoluteHisto]
**生成特征向量
FeatureVector := real(FeaturesExtended1)
**如果是第一张图像,则创建分类器。
if(i == 0)
***2.创建分类器
NumberFeatures := |FeaturesExtended1|
create_class_mlp (NumberFeatures, 15, 5, 'softmax', 'normalization', 10, 42, MLPHandle)
endif
**3.添加样本到分类器中
add_sample_class_mlp (MLPHandle, FeatureVector, i)
stop()
endfor
**4.训练分类器
train_class_mlp (MLPHandle, 200, 1, 000.01, Error, ErrorLog)
stop()
**写入分类器
write_class_mlp (MLPHandle, 'D://1.gmc')
**5.分类器识别特征向量
for i := 0 to |ImageFiles|-1 by 1
**提取测试样本的特征向量
read_image (Image, ImageFiles[i])
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Region, 31, 254)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 99999)
Classes := ['apple','beech','cherry','maple','oak']
**灰度共生矩阵,目的是提取纹理特征后面四个变量
cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
*sobel边缘检测
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
**获得灰度直方图,8是量化因子
gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHisto)
FeaturesExtended:=[Energy, Correlation, Homogeneity, Contrast]
**向特征向量中添加一个特征AbsoluteHisto
FeaturesExtended:=[FeaturesExtended,AbsoluteHisto]
cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
*sobel边缘检测
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3)
**获得灰度直方图,8是量化因子
gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHisto)
FeaturesExtended1 := [FeaturesExtended, Energy, Correlation, Homogeneity, Contrast]
**向特征向量中添加一个特征AbsoluteHisto
FeaturesExtended1 := [FeaturesExtended1,AbsoluteHisto]
**得到测试样本的特征向量
FeatureVector := real(FeaturesExtended1)
**识别测试样本的特征向量
classify_class_mlp (MLPHandle, FeatureVector, 1, ClassIDs, Confidence)
dev_display (Image)
ImageFiles1 :='founde classes ' + Classes[ClassIDs[0]]
disp_message (WindowHandle, ImageFiles1, 'image', 12, 12, 'black', 'true')
stop()
endfor
disp_message (WindowHandle, '所有测试样本都已经识别完成...', 'window', 12, 12, 'black', 'true')
stop()
disp_message (WindowHandle, '所有工作完成...', 'window', 12, 12, 'black', 'true')
stop()
这个程序虽然和之前的程序一样使用了MLP,但是这个程序涉及到了一个概念:特征向量。特征提取和特征识别始终贯穿了机器视觉的学习和使用,是核心中的核心。
**灰度共生矩阵,目的是提取纹理特征后面四个变量
cooc_feature_image (Image, Image, 6, 90, Energy, Correlation, Homogeneity, Contrast)
特征相加,相当于数组的加法:
FeaturesExtended:=[FeaturesExtended,AbsoluteHisto]