19、常用例子

一、生成二值化图像

1、region_to_bin(Region : BinImage : ForegroundGray, BackgroundGray, Width, Height : )

 

read_image (Image, 'fabrik')//读入图像

threshold (Image, Regions, 171, 255)//阈值分割,产生区域region

get_image_size (Image, Width, Height)//获取原始图像大小

region_to_bin (Regions, BinImage, 255, 0, Width, Height)//根据原始图像大小把region转换为image

2、paint_region(Region, Image : ImageResult : Grayval, Type : )

    功能:在region定义区域内则输出指定的Grayval像素,不在region指定区域的则输出相应的Image像素。

    read_image (Image, 'fabrik')

gen_rectangle1 (Region, 30, 20, 100, 200)//绘制矩形region

paint_region (Region, Image, ImageResult1, 255, 'fill')//输出图像

 

complement (Region, RegionComplement)//region的补集

paint_region (RegionComplement, Image, ImageResult, 255, 'fill')//输出图像

二、剪裁图像

1、reduce_domain(Image, Region : ImageReduced : : )

    在region定义区域内用Image像素输出到ImageReduced,region定义区域以外,没有像素值。

    crop_domain(Image : ImagePart : : )

    

    

read_image (Image, 'fabrik')

gen_rectangle1 (Rectangle, 30, 20, 300, 300)//绘制矩形region

reduce_domain (Image, Rectangle, ImageReduced)//较少定于区域

crop_domain (ImageReduced, ImagePart)//剪裁图像

三、根据一个点、一个角度绘制一条直线(封装成函数)

函数体:h_gen_line( : Line : Row, Col, Angle, Length, RegionOrXLD : )

if (Length<1)

return()

endif

 

tuple_cos (Angle, Cos)

tuple_sin (Angle, Sin)

 

XX:=Length*Cos

YY:=Length*Sin

 

if (RegionOrXLD = 'Region')

gen_region_line (Line, Row, Col, Row+YY, Col+ XX)

else

 

gen_contour_polygon_xld (Line, [Row, Col], [Row+YY, Col+XX])

endif

 

return ()

 

四、输入一个仿射矩形,输出其四个端点以及四个边终点

函数体:

get_rectangle2_points(::CenterY,CenterX,Phi,Len1,Len2:CornerY,CornerX,LineCenterY,LineCenterX)

 

*矩形端点坐标变量、边中心坐标变量初始化

CornerX :=[]

CornerY := []

LineCenterX := []

LineCenterY := []

 

*临时变量初始化

RowT:=0

ColT:=0

 

*判断仿射矩形是否有效

if(Len1<=0 or Len2<=0)

return()

endif

 

*计算仿射矩形角度的正弦值、余弦值

tuple_cos (Phi, Cos)

tuple_sin (Phi, Sin)

 

*矩形第一个端点坐标

ColT:= CenterX-Len1*Cos - Len2*Sin

RowT:= CenterY-(-Len1*Sin + Len2*Cos)

CornerY := [CornerY,RowT]

CornerX := [CornerX,ColT]

 

*矩形第二个端点坐标

ColT:= CenterX+Len1*Cos - Len2*Sin

RowT:= CenterY-(Len1*Sin + Len2*Cos)

CornerY := [CornerY,RowT]

CornerX := [CornerX,ColT]

 

*矩形第三个端点坐标

ColT:= CenterX+Len1*Cos + Len2*Sin

RowT:= CenterY-(Len1*Sin - Len2*Cos)

CornerY := [CornerY,RowT]

CornerX := [CornerX,ColT]

 

*矩形第四个端点坐标

ColT := CenterX-Len1*Cos + Len2*Sin

RowT:= CenterY-(-Len1*Sin - Len2*Cos)

CornerY := [CornerY,RowT]

CornerX := [CornerX,ColT]

 

*矩形第一条边中心坐标

LineCenterY[0] := (CornerY[0]+CornerY[1])*0.5

LineCenterX[0] := (CornerX[0]+CornerX[1])*0.5

 

*矩形第二条边中心坐标

LineCenterY[1] := (CornerY[1]+CornerY[2])*0.5

LineCenterX[1] := (CornerX[1]+CornerX[2])*0.5

 

*矩形第三条边中心坐标

LineCenterY[2] := (CornerY[3]+CornerY[2])*0.5

LineCenterX[2] := (CornerX[3]+CornerX[2])*0.5

 

*矩形第四边中心坐标

LineCenterY[3] := (CornerY[3]+CornerY[0])*0.5

LineCenterX[3] := (CornerX[3]+CornerX[0])*0.5

 

*返回

return ()

 

调用:

draw_rectangle2 (3600, Row, Column, Phi, Length1, Length2)

gen_rectangle2 (Rectangle, Row, Column, Phi, Length1, Length2)

get_rectangle2_points(Row, Column,Phi, Length1, Length2,CornerY,CornerX,LineCenterY,LineCenterX)

四、从多个轮廓中选择最长轮廓、最短轮廓(封装成函数)

函数体:

select_min_max_length_contour(Contours:MinLengthContour,MinLengthContour, MaxLengthContour)

 

 

 

*打开错误信息

dev_set_check('give_error')

*最长轮廓变量初始化

gen_empty_obj(MaxLengthContour)

*开启捕获异常

try

*统计轮廓集合的数量

count_obj(Contours, Number)

*捕获异常

catch(Exception)

*异常处理

return()

endtry

*如果轮廓数量无效,返回

if(Number<1)

return()

endif

*最长长度、最长长度索引初始化

Max_Length:=0

Max_Index:=0

*最短长度、最短长度索引初始化

Min_Length:=99999

Min_Index:=0

*遍历每个轮廓的长度

for i:=1 to Number by 1

*选择轮廓

select_obj(Contours, ObjectSelected, i)

*求轮廓长度

length_xld(ObjectSelected, Length)

*保存最长轮廓的长度和索引

if(Max_Length<Length)

Max_Length:=Length

Max_Index:=i

endif

*保存最短轮廓的长度和索引

if(Min_Length>Length)

Min_Length:=Length

Min_Index:=i

endif

endfor

*选择最长轮廓

select_obj(Contours, MaxLengthContour, Max_Index)

*选择最断轮廓

select_obj(Contours, MinLengthContour, Min_Index)

*返回

return ()

 

 

五、保存原始图像和结果图像

read_image (Image, 'fabrik')

edges_sub_pix (Image, Edges, 'canny', 1, 20, 40)

 

OriPath:='c:/ori.bmp'

ResultPath:='c:/result.bmp'

FileFormat:=''

Index:=strrchr(OriPath,'.')

t1:=Index+1

t2:=strlen(OriPath)-1

FileFormat:=OriPath{t1:t2}

write_image(Image,FileFormat,0,OriPath)

ErrorCode:=0

try

get_image_size (Image, Width, Height)

dev_open_window (0, 0, Width, Height, 'black', WindowHandle)

dev_display(Image)

 

disp_message (WindowHandle, 'OK', 'window', 12, 12, 'green', 'true')

dev_display (Edges)

Index:=strrchr(ResultPath,'.')

t1:=Index+1

t2:=strlen(ResultPath)-1

FileFormat:=ResultPath{t1:t2}

 

 

dump_window (WindowHandle,FileFormat,ResultPath)

catch (Exception)

ErrorCode:=Exception[0]

 

endtry

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2022-05-08 23:07  ihh2021  阅读(270)  评论(0)    收藏  举报