工控编程吧

标题: halcon add_samples_image_class_knn函数介绍 [打印本页]

作者: qq263946146    时间: 2019-5-31 20:19
标题: halcon add_samples_image_class_knn函数介绍
add_samples_image_class_knn(Image, ClassRegions : : KNNHandle : )
add_samples_image_class_knn将图像Image中的训练样本添加到k-Nearest-Neighbor (k-NN)当中,(句柄为KNNHandle)。
在使用分类器对classify_image_class_knn的多通道图像进行像素分类之前,
使用add_samples_image_class_knn存储训练样本。
add_samples_image_class_knn的工作原理类似于add_sample_class_knn。
该Image必须有多个等于NumDim的通道(如create_class_knn所指定的那样)。
ClassRegions必须是包含至少两个区域的元组。
ClassRegions中区域的顺序决定了像素的类别。
如果图像中没有特定类的样本,则必须在ClassRegions中的类位置传递一个空区域。
通过这种机制,可以使用多个图像,通过多次调用add_samples_image_class_knn,
对不同的图像和适当选择的区域进行调用,将所有相关类的训练样本添加到k-NN分类器中。
ClassRegions中的区域应包含对应类别的代表性培训样本。
因此,它们不需要覆盖整个图像。
ClassRegions中的区域不应该相互重叠,
因为这些来自重叠区域的样本会被分配到训练数据中的多个类中,
这可能会导致分类性能下降。




1.classify_image_class_knn(Image : ClassRegions, DistanceImage : KNNHandle, RejectionThreshold : )
classify_image_class_knn使用k-Nearest-Neighbor分类器(k-NN) ->KNNHandle对多通道图像图像执行像素分类。
在调用classify_image_class_knn之前,
必须使用train_class_knn训练k-NN分类器。
图像必须具有NumDim通道(如create_class_knn所指定)。
在输出上,ClassRegions包含了分类的结果NumClasses区域。


注意,ClassRegions中返回的区域的顺序与add_samples_image_class_knn中的训练区域定义的类的顺序相对应。
参数RejectionThreshold 可用于拒绝分类不确定的像素。
RejectionThreshold表示分类返回到最近邻居的距离阈值。
所有具有低于RejectionThreshold 的像素都不分配给任何类。
DistanceImage包含每个像素到其最近邻居的距离。


例程:
*例程展示如何使用k-NN分类器分割RGB图像。分类器被训练成四种不同的颜色。注意,分类结果在直觉上是正确的。
*但是,也可以看出,超出训练班范围的颜色会被分配给一个可信度较高的类型。
*在船舷上,绿色在船的顶部,而舱门则被划分为四个类型之一,其可信度很高。
dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 735, 485, 'black', WindowHandle)
dev_set_draw ('margin')
dev_set_colored (6)
dev_set_line_width (3)
read_image (Image, 'patras')
dev_display (Image)
Color := ['indian red','cornflower blue','white','black','yellow']
*创建包含四个类别样本的区域
gen_rectangle1 (Sea, 10, 10, 120, 270)
gen_rectangle2 (Deck, [170,400], [350,375], [-0.56,-0.75], [64,104], [26,11])
union1 (Deck, Deck)
gen_rectangle1 (Walls, 355, 623, 420, 702)
gen_rectangle2 (Chimney, 286, 623, -0.56, 64, 33)
concat_obj (Sea, Deck, Classes)
concat_obj (Classes, Walls, Classes)
concat_obj (Classes, Chimney, Classes)
dev_set_color (Color[0])
dev_display (Deck)
dev_set_color (Color[1])
dev_display (Sea)
dev_set_color (Color[2])
dev_display (Walls)
dev_set_color (Color[3])
dev_display (Chimney)
Message := 'Training regions for the color classifier'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*创建分类器添加样本,再进行训练
create_class_knn (3, KNNHandle)
add_samples_image_class_knn (Image, Classes, KNNHandle)
dev_display (Image)
Message := 'Training ...'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
train_class_knn (KNNHandle, [], [])
Message := Message + ' ready.'
Message[1] := 'Segment image using the classifier ...'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
* Segment (classify) the image
*进行分类
classify_image_class_knn (Image, ClassRegions, DistanceImage, KNNHandle, 255.0 * 255.0)
region_to_mean (ClassRegions, Image, ImageClass)
dev_display (ImageClass)
Message[1] := Message[1] + ' ready.'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
clear_class_knn (KNNHandle)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()

*因为船舷上的黄色油漆,顶灯上的绿色,及门无意中被分配到四个已训练的分别器中,
*我们将构造一个用于拒绝的分类,其中包含来自每个不需要的颜色的样本,并使用此拒绝类重新训练分类器。
gen_rectangle2 (Rejection, [193,66,261], [235,332,328], [-0.32,-1.45,-1.51], [33,34,60], [4,3,3])
union1 (Rejection, Rejection)
concat_obj (Classes, Rejection, Classes)
dev_display (Image)
dev_set_color (Color[0])
dev_display (Deck)
dev_set_color (Color[1])
dev_display (Sea)
dev_set_color (Color[2])
dev_display (Walls)
dev_set_color (Color[3])
dev_display (Chimney)
dev_set_color (Color[4])
dev_display (Rejection)
disp_message (WindowHandle, 'Add a rejection class to improve the robustness of the classifier', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
dev_display (Image)
* Create the classifier and add the samples
*创建分类器添加样本,训练分类器
create_class_knn (3, KNNHandle)
add_samples_image_class_knn (Image, Classes, KNNHandle)
Message := 'Training the classifier with rejection class...'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
train_class_knn (KNNHandle, [], [])
Message := Message + ' ready.'
Message[1] := 'Segment image using the classifier ...'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
* 用分类器分割图像
classify_image_class_knn (Image, ClassRegionsNotRejected, DistanceImage1, KNNHandle, 255.0 * 255.0)
*选择只想要的分类类别
copy_obj (ClassRegionsNotRejected, ClassRegionsNotRejected, 1, 4)
*平滑处理后的黑色区域为不想要的
region_to_mean (ClassRegionsNotRejected, Image, ImageClassNotRejected)
dev_display (ImageClassNotRejected)
Message[1] := Message[1] + ' ready.'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
clear_class_knn (KNNHandle)
例程执行结果为
(, 下载次数: 0)