分类器,lut与彩色图像处理学习笔记

本文介绍了彩色图像处理技术,包括拜耳图像转换为RGB图像的方法及其插值算法对比,并演示了如何使用二维像素分类进行图像分割。此外,还探讨了基于GMM的分类器创建与训练过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.彩色图像处理,以下例程通过采集图像模拟拜耳图像,再通过拜耳图像经过插值转换为RGB图像,计算出源图像与转换图像之间的差异。

simulate_bayer_image 通过采集图像来模拟拜耳图像
cfa_to_rgb 拜耳图像转换为RGB图像
tile_images_offset 将多个图像对象平铺成具有显式定位信息的大图像。

tile_images_offset(Images : TiledImage : OffsetRow, OffsetCol, Row1, Col1, Row2, Col2, Width, Height : )
Row1 对应输入图像的复制部分的左上角的行坐标。
Col1 对应输入图像的复制部分的左上角的列坐标。
Row2 对应输入图像的复制部分的右下角的行坐标。
Col2 对应输入图像的复制部分的右下角的列坐标。
选出原图直接复制部分的图像

dev_update_off ()
read_image (Image, 'patras')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_display (Image)
disp_message (WindowHandle, 'Original image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* Simulate a Bayer image by sampling the channels of the original image.
simulate_bayer_image (Image, ImageCFA)
dev_display (ImageCFA)
disp_message (WindowHandle, 'Bayer image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* Compare the interpolation modes that are available in cfa_to_rgb.
Interpolations := ['bilinear','bilinear_dir','bilinear_enhanced']
NumIntModes := |Interpolations|
gen_empty_obj (RGBImages)
gen_empty_obj (SubImages)
for I := 0 to NumIntModes - 1 by 1
    Interpolation := Interpolations[I]
    * Reconstruct an RGB image from the Bayer image.
cfa_to_rgb (ImageCFA, RGBImage, 'bayer_gb', Interpolation)
    * ['bilinear','bilinear_dir','bilinear_enhanced']双线性插值,双线性方向插值,双线性增强插值
    sub_image (Image, RGBImage, ImageSub, 1, 128)
    * Visualize the results.
    dev_display (RGBImage)
    disp_message (WindowHandle, 'RGB image (\'' + Interpolation + '\')', 'window', 12, 12, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
    dev_display (ImageSub)
    disp_message (WindowHandle, 'Difference image', 'window', 12, 12, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
    * 得到转换图像元组和差值图像元组
    concat_obj (RGBImages, RGBImage, RGBImages)	 	
    concat_obj (SubImages, ImageSub, SubImages)
endfor
* 
* Compare the interpolation modes in two selected zoomed image parts.
PartWidth := 140
PartHeight := 93
PartsRow := [122,62]
PartsColumn := [79,471]
dev_close_window ()
dev_open_window (0, 0, PartWidth * 3 * 2, PartHeight * 3 * 2, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
concat_obj (Image, RGBImages, OrigRGBImages)
concat_obj (Image, SubImages, OrigSubImages)
LabelResults := ['Original','\'bilinear\'','\'bilinear_dir\'','\'bilinear_enhanced\'']
for IPart := 0 to |PartsRow| - 1 by 1
    * Visualize the resulting RGB images.
    tile_images_offset (OrigRGBImages, RGBImagesTiled, [0,0,PartHeight,PartHeight], [0,PartWidth,0,PartWidth], gen_tuple_const(NumIntModes + 1,PartsRow[IPart]), gen_tuple_const(NumIntModes + 1,PartsColumn[IPart]), gen_tuple_const(NumIntModes + 1,PartsRow[IPart] + PartHeight - 1), gen_tuple_const(NumIntModes + 1,PartsColumn[IPart] + PartWidth - 1), PartWidth * 2, PartHeight * 2)
    dev_display (RGBImagesTiled)
    R := [0:|LabelResults| - 1] / 2
    C := [0:|LabelResults| - 1] % 2
    disp_message (WindowHandle, LabelResults, 'image', 3 + PartHeight * R, 3 + PartWidth * C, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
    * Visualize the difference images.
    tile_images_offset (OrigSubImages, SubImagesTiled, [0,0,PartHeight,PartHeight], [0,PartWidth,0,PartWidth], gen_tuple_const(NumIntModes + 1,PartsRow[IPart]), gen_tuple_const(NumIntModes + 1,PartsColumn[IPart]), gen_tuple_const(NumIntModes + 1,PartsRow[IPart] + PartHeight - 1), gen_tuple_const(NumIntModes + 1,PartsColumn[IPart] + PartWidth - 1), PartWidth * 2, PartHeight * 2)
    dev_display (SubImagesTiled)
    R := [0:|LabelResults| - 1] / 2
    C := [0:|LabelResults| - 1] % 2
    disp_message (WindowHandle, LabelResults, 'image', 3 + PartHeight * R, 3 + PartWidth * C, 'black', 'true')
    if (IPart < |PartsRow| - 1)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor

2.使用二维像素分类分割图像。
histo_2dim (Pattern, Red, Blue, Histo2Dim) 求红蓝两个通道的直方图
class_2dim_sup (Red, Blue, FeaturesClosed, RegionClass2Dim) 使用二维像素分类分割两个通道的图像。

Segment an image using two-dimensional pixel classification.
* 
* For interactive mode set this variable to 1
Interactive := 0
read_image (Image, 'ic')
dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'white', WindowID)
* Convert a three-channel image into three images
decompose3 (Image, Red, Green, Blue)
dev_display (Red)
dev_set_color ('red')
if (Interactive)
    draw_region (Pattern, WindowID)
else
    gen_rectangle1 (Pattern, 362, 276, 371, 298)
endif
* Calculate the histogram of two-channel gray value images
histo_2dim (Pattern, Red, Blue, Histo2Dim)
threshold (Histo2Dim, Features, 1, 255)
* Close a region with a circular structuring element
closing_circle (Features, FeaturesClosed, 11.5)
dev_set_draw ('fill')
dev_set_part (0, 0, 511, 511)
dev_display (Red)
class_2dim_sup (Red, Blue, FeaturesClosed, RegionClass2Dim)

class_2dim_unsup对两幅图像进行聚类分割。

learn_ndim_norm 为class_ndim_norm构造类。
class_ndim_norm对多通道图像中的像素进行分类。结果在区域中作为每个分类对象的一个区域返回。使用的度量(“欧几里得”或“最大值”)是由度量决定的。此参数必须设置为learn_ndim_norm中使用的相同值。参数SingleMultiple确定是否为每个集群生成一个区域(“single”)或多个区域(“multiple”)。半径决定了星系团的半径或半边缘长度。中心决定它们的中心。

read_image (Image, 'ic')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowID)
dev_display (Image)
dev_set_color ('red')
gen_rectangle1 (Region, 360, 198, 369, 226)
gen_empty_region (EmptyRegion)
learn_ndim_norm (Region, EmptyRegion, Image, 'euclid', 10, 0.01, Radius, Center, Quality)
dev_set_color ('blue')
class_ndim_norm (Image, Regions, 'euclid', 'multiple', Radius, Center)
dev_display (Image)
dev_display (Regions)

创建GMM分类器
create_class_gmm (3, 5, 1, ‘full’, ‘none’, 3, 42, GMMHandle)
add_samples_image_class_gmm (Image, Classes, GMMHandle, 0)
disp_message (WindowHandle, ‘Training GMM classifier…’, ‘window’, 48, 12, ‘black’, ‘true’)
train_class_gmm (GMMHandle, 100, 0.001, ‘training’, 0.001, Centers, Iter)
*
创建以GMM分类器为基础的lut分类器
disp_message (WindowHandle, ‘Creating LUT classifier…’, ‘window’, 84, 12, ‘black’, ‘true’)
create_class_lut_gmm (GMMHandle, [‘bit_depth’,‘rejection_threshold’], [6,0.03], ClassLUTHandle)
clear_class_gmm (GMMHandle)
classify_image_class_lut

dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 800, 600, 'white', WindowHandle)
dev_set_draw ('margin')
ImageRootName := 'color/color_fuses_0'
FuseTypes := [5,10,15,20,30]
FuseColors := ['Orange','Red','Blue','Yellow','Green']
FuseHighlight := ['orange','red','blue','goldenrod','forest green']
DisplayTextShift := [85,65,75,85,85]
dev_set_color ('white')
dev_set_line_width (2)
read_image (Image, ImageRootName + '0')
dev_display (Image)
* 
* Define ROIs for the training data of the classifier
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
gen_rectangle1 (FuseOrange, 195, 90, 230, 120)
dev_display (FuseOrange)
disp_message (WindowHandle, 'Orange Fuse', 'image', 160, 90 - 65, 'black', 'true')
gen_rectangle1 (FuseRed, 191, 280, 226, 310)
dev_display (FuseRed)
disp_message (WindowHandle, 'Red Fuse', 'image', 160, 280 - 55, 'black', 'true')
gen_rectangle1 (FuseBlue, 190, 470, 225, 500)
dev_display (FuseBlue)
disp_message (WindowHandle, 'Blue Fuse', 'image', 160, 470 - 60, 'black', 'true')
gen_rectangle1 (FuseYellow, 192, 672, 227, 702)
dev_display (FuseYellow)
disp_message (WindowHandle, 'Yellow Fuse', 'image', 160, 672 - 70, 'black', 'true')
gen_rectangle1 (FuseGreen, 197, 880, 232, 910)
dev_display (FuseGreen)
disp_message (WindowHandle, 'Green Fuse', 'image', 160, 880 - 65, 'black', 'true')
gen_empty_obj (Classes)
concat_obj (FuseOrange, FuseRed, Classes)
concat_obj (Classes, FuseBlue, Classes)
concat_obj (Classes, FuseYellow, Classes)
concat_obj (Classes, FuseGreen, Classes)
disp_message (WindowHandle, 'ROIs for the training data', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Create the GMM classifier, add the samples, and train it
create_class_gmm (3, 5, 1, 'full', 'none', 3, 42, GMMHandle)
add_samples_image_class_gmm (Image, Classes, GMMHandle, 0)
disp_message (WindowHandle, 'Training GMM classifier...', 'window', 48, 12, 'black', 'true')
train_class_gmm (GMMHandle, 100, 0.001, 'training', 0.001, Centers, Iter)
* 
* Create the GMM-based LUT classifier
disp_message (WindowHandle, 'Creating LUT classifier...', 'window', 84, 12, 'black', 'true')
create_class_lut_gmm (GMMHandle, ['bit_depth','rejection_threshold'], [6,0.03], ClassLUTHandle)
clear_class_gmm (GMMHandle)
* 
* Segment images with LUT classifier
for Img := 0 to 3 by 1
    read_image (Image, ImageRootName + Img)
    count_seconds (T1)
    classify_image_class_lut (Image, ClassRegions, ClassLUTHandle)
    count_seconds (T2)
    TimeToClassify := (T2 - T1) * 1000
    dev_display (Image)
    dev_set_line_width (3)
    for Fuse := 1 to 5 by 1
        * 
        * Perform post-processing on returned classes
        copy_obj (ClassRegions, ObjectsSelected, Fuse, 1)
        closing_circle (ObjectsSelected, RegionClosing, 3.5)
        connection (RegionClosing, ConnectedRegions)
        select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2500, 99999)
        fill_up (SelectedRegions, RegionFillUp)
        area_center (RegionFillUp, Area, Row, Column)
        shape_trans (RegionFillUp, RegionTrans, 'convex')
        dev_set_color (FuseHighlight[Fuse - 1])
        dev_display (RegionTrans)
        * 
        disp_message (WindowHandle, FuseColors[Fuse - 1] + ' ' + FuseTypes[Fuse - 1] + ' A', 'image', Row - 10, Column - DisplayTextShift[Fuse - 1], FuseHighlight[Fuse - 1], 'white')
    endfor
    disp_message (WindowHandle, TimeToClassify$'.1f' + ' ms', 'window', 12, 12, 'black', 'true')
    if (Img < 3)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor
* 
clear_class_lut (ClassLUTHandle)
**disp_message (WindowHandle, 'No more lines to execute', 'window', 50, 12, 'black', 'true')

GMM分类器
create_class_gmm (3, 4, [1,10], ‘full’, ‘none’, 2, 42, GMMHandle)
add_samples_image_class_gmm (Image, Classes, GMMHandle, 2.0)
dev_display (Image)
train_class_gmm (GMMHandle, 500, 1e-4, ‘uniform’, 1e-4, Centers, Iter)
clear_samples_class_gmm (GMMHandle)
classify_image_class_gmm (Image, ClassRegions, GMMHandle, 0.0001)

KNN分类器
create_class_knn (3, KNNHandle)
add_samples_image_class_knn (Image, Classes, KNNHandle)
train_class_knn (KNNHandle, [], [])
classify_image_class_knn (Image, ClassRegions, DistanceImage, KNNHandle, 255.0 * 255.0)
clear_class_knn (KNNHandle)

create_class_lut_mlp
create_class_lut_svm
create_class_lut_gmm
create_class_lut_knn
基于分类器的lut查找表运行速度比mlp,svm,gmm,knn 快很多
LUT指显示查找表(Look-Up-Table),本质上就是一个RAM。它把数据事先写入RAM后,每当输入一个信号就等于输入一个地址进行查表,找出地址对应的内容,然后输出。

lut用于颜色转换(例子是从rgb转到hsv,相反同理)
create_color_trans_lut (‘hsv’, ‘from_rgb’, 8, ColorTransLUTHandle)
apply_color_trans_lut (Red, Green, Blue, Hue, Saturation, Intensity, ColorTransLUTHandle)
clear_color_trans_lut (ColorTransLUTHandle)

region_to_mean 用它们的平均灰度值绘制区域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值