halcon基础案例+算子学习(二)

1.对区域进行交集、补集、反选、合并

1.1对所选区域进行取反

*创建一个窗口
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*画圆(输出、圆点坐标、半径)
gen_circle (Cricle1, 224.5, 250.5, 131.727)
*清除窗口
dev_clear_window ()
*取反操作
complement (Cricle1, RegionComplement)

1.2 计算区域1相对于区域2不同

dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
gen_circle (Cricle1, 122.5, 126.5, 69.7711)
gen_circle (Cricle2, 184.5, 179.5, 73.9256)
*计算Cricle1相对于Cricle2的不同
difference (Cricle1, Cricle2, RegionDifference)
dev_clear_window ()
dev_display (RegionDifference)

1.3计算两个区域的不同

dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
gen_circle (Cricle1, 114.5, 127.5, 89.3588)
gen_circle (Cricle2, 163.5, 171.5, 94.8472)
*计算Cricle1和Cricle2的不同
symm_difference(Cricle1, Cricle2 ,RegionDifference)
dev_clear_window ()
dev_display (RegionDifference)

1.4求两个区域的交集

dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
gen_circle (Cricle1, 114.5, 127.5, 89.3588)
gen_circle (Cricle2, 163.5, 171.5, 94.8472)
*求两个区域的交集
intersection (Cricle1, Cricle2, RegionIntersection)
dev_clear_window ()
dev_display (RegionIntersection)

1.5对所选区域进行合并

dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*读取图片
read_image (Image, 'fabrik')
*设置颜色,
dev_set_colored (12)
*阈值处理(输入的图片、输出图片、阈值范围)
threshold (Image, Region, 128, 255)
*对所选的区域进行连通
connection (Region, ConnectedRegions)
*对所选的区域进行合并
union1 (ConnectedRegions, RegionUnion)
*对两个区域进行合并
*union2 (Circle1, Circle2, RegionUnion)
dev_clear_window ()
dev_display (Image)
dev_display (RegionUnion)

2.对区域进行填充

read_image (image, 'egypt1')
threshold (image, Region, 0, 140)
*对所选区域进行填充
fill_up (Region, RegionFillUp)
*对所选区域进行选择行填充(输入、输出、特征)
fill_up_shape (RegionFillUp, RegionFillUp1, 'area', 1, 100)
dev_display (image)
dev_display (RegionFillUp)

3.对区域进行筛选

dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
read_image (Image, 'fabrik')
threshold (Image, Region, 128, 255)
connection (Region, ConnectedRegions)
*根据面积范围[8000, 9000]进行过滤
dev_display (Image)
*对区域进行筛选(输入、输出、特征)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 8000, 9000)
dev_display (Image)
dev_display (SelectedRegions)
*算子select_shape_std将给定区域的形状与默认形状进行比较。 如果该区域具有相似的形状,则输出为相似的形状.(输入、输出、特征、相似度)
select_shape_std (ConnectedRegions, SelectedRegions1, 'rectangle1', 90)
dev_display (Image)
dev_display (SelectedRegions1)
*算子select_shape_proto 过滤出彼此具有一定关系的区域。(输入、输入、输出、特征、参数)
select_shape_proto (ConnectedRegions, SelectedRegions, SelectedRegions2, 'distance_center', 0, 200)
dev_display (Image)
dev_display (SelectedRegions2)

4.画各种交互的ROI(用鼠标画图形)

其中draw_是用鼠标画会返回个参数, gen_disp_是在图像上画

ev_open_window (0, 0, 512, 512, 'black', WindowHandle)
dev_set_draw ('margin')
*画圆
draw_circle (WindowHandle, Row, Column, Radius)
gen_circle (Circle, Row, Column, Radius)
*画椭圆
draw_ellipse (WindowHandle, Row1, Column1, Phi, Radius1, Radius2)
gen_ellipse (Ellipse, Row1, Column1, Phi, Radius1, Radius2)
*画不规则区域
draw_polygon (PolygonRegion, WindowHandle)
*画直线
draw_line (WindowHandle, Row12, Column12, Row21, Column21)
disp_line (WindowHandle, Row12, Column12, Row21, Column21)
*画标准矩形
draw_rectangle1 (WindowHandle, Row11, Column11, Row2, Column2)
gen_rectangle1 (Rectangle, Row11, Column11, Row2, Column2)
*画仿射矩形
draw_rectangle2 (WindowHandle, Row3, Column3, Phi1, Length1, Length2)
gen_rectangle2 (Rectangle1, Row3, Column3, Phi1, Length1, Length2)
*画闭合区域
draw_region (Region, WindowHandle)

5.计算程序时间

*时间单位(微米)
count_seconds (T1)
read_image (Image, 'fabrik')
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
count_seconds (T2)
RunTime := (T2 - T1)*1000
dev_display (Image)
*在图像上输出信息
disp_message (WindowHandle, '程序运行的时间: '+RunTime+'  ms', 'window', 10, 10, 'black', 'true')

6.将图像转换为数组

* 读取一张图像
read_image (Image, 'fabrik')
* 获取图像大小
get_image_size(Image, Width, Height)
* 获取区域里各点的坐标
get_region_points(Image, Rows, Columns)
* 获取图像中每一点的像素值和坐标位置
get_grayval(Image, Rows, Columns, Grayval)
* 创建一个空的矩阵
create_matrix(Height,Width, 0, GrayMatrix) 
* 为矩阵填充图像数据
set_value_matrix(GrayMatrix,Rows,Columns, Grayval) 

7.自适应窗口

read_image (Image, '1')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle)
*+是变小,-是变大
dev_set_part (0, 0, Height-800, Width-800)
dev_display (Image)

8.彩色图转灰度图

read_image(Image,'patras')
dev_display(Image)
*直接转灰度图
rgb1_to_gray(Image,GrayImage0)
dev_display(GrayImage0)
dev_clear_window()
*把图像转换为三通道,分别求灰度图
decompose3(Image, ImageR, ImageG, ImageB)
rgb3_to_gray(ImageR,ImageG,ImageB,GrayImage)
dev_display(GrayImage)

9.彩色图之间的转换

read_image(Image,'patras')
dev_display(Image)
decompose3(Image, Image1, Image2, Image3)
*RGB转换为其他彩色图
trans_from_rgb(Image1,Image2,Image3,ImageH,ImageS,ImageV,'hsv')
*把其他彩色图转换为RGB图
trans_to_rgb(ImageH,ImageS,ImageV,ImageR,ImageG,ImageB,'hsv')
*把三个一通道转换为一个三通道
compose3(ImageR,ImageG,ImageB,Multichannel)
dev_display(Multichannel)

10.区域生长法,填充区域之间的GAP获分割重叠区域


read_image (Image, 'fabrik')
*区域生长法将图像分割成相同强度的区域,并将其划分成大小为行*列的矩形。 为了确定两个相邻的矩形是否属于相同的区域,
*仅使用其中心点的灰度值。 如果灰度值差小于等于公差,则将矩形合并到一个区域。
regiongrowing (Image, Regions, 1, 1, 3, 1000)
*创建一个空白的区域
gen_empty_region (NoPixel)
expand_region (Regions, NoPixel, RegionExpanded1, 'maximal', 'image')
dev_display (Image)
dev_set_draw ('margin')
dev_set_colored (6)
dev_display (RegionExpanded1)
stop ()

11.在图像上书写文字

dev_close_window ()
read_image (image, 'particle')
get_image_size (image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowID)
dev_set_draw ('margin')
dev_set_color ('green')
threshold (image, Region, 128, 255)
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
*求出区域的面积、行和列
area_center (SelectedRegions, Area, Row, Column)
dev_display (image)
dev_display (SelectedRegions)
*设置光标位置,即文字开头位置
set_tposition (WindowID, Height/2,0)
*书写汉字,其中+表示连接两个字符串
write_string (WindowID, '面积最大区域的行坐标:'+Row+' 面积最大区域的列坐标: '+Column)

12.图像分割之地形学

dev_close_window ()
read_image (image, 'particle')
get_image_size (image, Width, Height)
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowID)
dev_set_draw ('margin')
dev_set_colored (12)
dev_clear_window ()
*高斯滤波,消除噪点
gauss_filter (image, ImageGauss, 9)
*图像反选
invert_image (ImageGauss, ImageInvert)
*从图像里提取分水岭和盆地
*第一个输入参数:输入图像
*第二个输出参数:分割后的盆地区域
*第三个输出参数:分割后的分水岭区域
watersheds (ImageInvert, Basins, Watersheds)
dev_display (image)
dev_display (Basins)

13.图像阈值分割(自动、二值化、文字、相减)

dev_close_window ()
read_image (image, 'egypt1')
read_image (image1, 'alpha1')
get_image_size (image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowID)
dev_clear_window ()
*根据图像的灰度直方图来确定阈值,这里的Sigma是高斯滤波器,用于直方图的平滑.
Sigma := 4
auto_threshold (image, Regions, Sigma)
dev_clear_window ()

*使用二值化阈值分割图像
*如果LightDark =“light”,则选择灰度值大于或等于最佳阈值的所有像素。
*如果LightDark =“dark”,则选择灰度值小于的最佳阈值de 所有像素。
*通过选择Method ='max_separability',可以调用灰度直方图的自动阈值。
*该算法首先计算图像的直方图,然后使用统计矩来找到将像素划分为前景和背景的最佳阈值,
*并使这两个类之间的可分离性最大化。 此方法仅适用于字节和uint2图像。
binary_threshold (image, RegionMaxSeparabilityLight, 'max_separability', 'dark', UsedThreshold)
dev_clear_window ()

*阈值分割提取字符,主要应用是在明亮的纸上分割黑色字符单通道图像。
*第一个输入参数:图像
*第二个输入参数:要计算直方图的区域
*第三个输出参数:分割的字符区域
*第四个输入参数:直方图高斯平滑的Sigma
*第五个输入参数:灰度值差异的百分比
*第五个输出参数:输出计算出的阈值
char_threshold (image1, image, Characters, 6, 95, Threshold)
dev_clear_window ()

*读取一张图像
read_image (Traffic1, 'traffic1')
*读取一张图像
read_image (Traffic2, 'traffic2')
*将图像由byte类型转化为int2类型
convert_image_type (Traffic1, ImageConverted1, 'int2')
*将图像由byte类型转化为int2类型
convert_image_type (Traffic2, ImageConverted2, 'int2')
*将两个图像相减
sub_image (ImageConverted1, ImageConverted2, ImageSub, 1, 0)
*将有符号图像分割为正负两个区域
*第一个输入参数:图像
*第二个输出参数:分割后的正负区域
*第三个输入参数:最小区域大小
*第四个输入参数:最小灰度值大小
*第五个输入参数:阈值
dual_threshold (ImageSub, RegionDiff, 500, 20, 10)

13.图像阈值分割(局部阈值和固定阈值)

dev_close_window ()
read_image (image, 'egypt1')
get_image_size (image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowID)
dev_clear_window ()
*均值滤波
mean_image (image, ImageMean, 9, 9)
*用局部阈值来分割图像。
*第一个输入参数:原始图像
*第二个输入参数:滤波后的图像
*第三个输出参数:分割后的区域
*第四个输入参数:补偿值,范围在540之间比较有用
*第五个输入参数:提取区域的类型,是亮的区域,或暗的区域,或相似区域
dyn_threshold (image, ImageMean, RegionDynThresh, 15, 'not_equal')
dev_clear_window ()

read_image(image1,'1')
*通过局部平均值和标准偏差进行自适应阈值。试用场合不均匀的照明或噪声的图像
*第一个输入参数:输入图像
*第二个输出参数:分割后的区域
*第三个输人参数:分割方法
*第四个输入参数:提取前景还是背景
*第五个输入参数:参数名
*第六个输入参数:参数值
local_threshold(image,Region,'adapted_std_deviation','dark',[],[])
dev_clear_window ()

read_image (image2, 'label_01')
*通过局部平均值和标准偏差进行阈值图像。试用场合不均匀的照明或噪声的图像
*第一个输入参数:输入图像
*第二个输出参数:分割后的区域
*第三个输人参数:均值和标准差的掩码宽度
*第四个输入参数:均值和标准差的掩码高度
*第五个输入参数:标准差因子
*第六个输入参数:最小灰度值和均值之差
*第七个输入参数:提取区域的类型,是亮的区域,或暗的区域,或相似区域,或不相似区域
var_threshold (image2, Region, 15, 15, 1.0, 40, 'dark')
dev_clear_window ()

read_image (image3, 'egypt1')
*用全局阈值分割图像,试用图像亮度均匀的场合
*第一个输入参数:输入图像
*第二个输出参数:分割后的区域
*第三个输入参数:阈值下限
*第四个输入参数:阈值上限
threshold (image3, Region, 0, 150)

14.文本文件的读写

***************************************向文本文件写入字符串内容**********************************************
read_image (Image, 'fabrik')
threshold (Image, Region, 0, 120)
area_center (Region, Area, Row, Column)
*打开文件(输入文件名、执行的操作(读取还是写入)、输出)
open_file ('area.txt', 'output', FileHandle)
*写入文本
fwrite_string (FileHandle, '面积是:'+Area + ' 像素\n')
fwrite_string (FileHandle, 'ROW:'+Row + ' Column'+Column+' \n')
close_file (FileHandle)
*****************************读取文本文件字符串内容*****************************************
open_file ('area.txt', 'input', FileHandle)
*读取文本,其中IsEOF1==1,表示读取一行结束
fread_line (FileHandle, OutLine, IsEOF1)
while (IsEOF1 != 1)
    fread_line (FileHandle, OutLine, IsEOF1)
endwhile
close_file (FileHandle)

15.文件夹相关操作

*遍历文件夹
*获得halcon系统参数
get_system ('example_dir', HalconExamples)
ExampleDir := HalconExamples +'\\hdevelop'
*遍历文件夹(输入文件目录、遍历的特征、找到的文件(或目录))
list_files (ExampleDir, ['files','recursive'], ExampleFiles)

*判断文件是否存在
dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
FileName := '1.jpg'
*判断文件是否存在,输入:文件或文件的绝对路径,输出True或False
file_exists (FileName, FileExists)
if (FileExists)
   *在窗口输出文字,输出窗口、输出内容、位置、字体颜色
   disp_message (WindowHandle, '文件存在', 'window', 12, 12, 'black', 'true')
else
   disp_message (WindowHandle, '文件不存在', 'window', 12, 12, 'black', 'true')
endif

16.形态学膨胀、腐蚀、开运算、闭运算

膨胀:对边界点进行扩充,填充空洞,使边界向外部扩张的过程。
腐蚀:消除物体边界点,使边界向内部收缩的过程,把小于结构元素的物体去除掉.
开运算:先腐蚀后膨胀的过程称为开运算,作用:去除孤立的小点,毛刺,消除小物体,平滑较大物体边界,同时不改变其面积.
闭运算:先膨胀后腐蚀的过程是闭运算。作用:填充物体内细小的空洞,连接临近物体,平滑边界,同时不改变其面积。

*读取图像
read_image (Image, 'fabrik')
*阈值图像
threshold (Image, Region, 128, 255)
*连通处理
connection (Region, ConnectedRegions)
*根据面积过滤
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 8000, 9000)
* 用矩形结构元素膨胀
dilation_rectangle1 (SelectedRegions, RegionDilation1, 3, 3)
* 用圆形结构元素膨胀
dilation_circle (SelectedRegions, RegionDilation2, 2.5)
* 用矩形结构元素腐蚀
erosion_rectangle1 (SelectedRegions, RegionErosion1, 3, 3)
* 用圆形结构元素腐蚀
erosion_circle (SelectedRegions, RegionErosion2, 2.5)
* 用矩形结构元素开运算
opening_rectangle1 (SelectedRegions, RegionOpening1, 10, 10)
* 用圆形结构元素开运算
opening_circle (SelectedRegions, RegionOpening2, 2.5)
*用矩形结构元素闭运算
closing_rectangle1 (SelectedRegions, RegionClosing1, 10, 10)
*用圆形结构元素闭运算
closing_circle (SelectedRegions, RegionClosing2, 3.5)