minArea := min(Area)
disp_circle (WindowID, Row, Column, Radius)
这里我们发现一个问题。圆不是按坐标位置排列的。我们想显示的是第3个圆,可是显示的是第5个圆。可以考虑算子
sort_region(Regions : SortedRegions : SortMode, Order, RowOrCol : ) 根据他们的位置关系进行排序 修改程序如下:
dev_close_window ()
dev_open_window(0, 0, -1, -1, 'black', WindowID) read_image(Die, 'E:/halcon图像/die_03.png') dev_display(Die)
threshold(Die, Brightregion,100,255)
shape_trans(Brightregion, ROI, 'rectangle2') reduce_domain(Die, ROI, DieROI)
threshold(DieROI, RawSegmentation,0,50)
fill_up_shape(RawSegmentation, Wires, 'area', 1, 100) opening_circle(Wires, BallRegion, 15.5) connection(BallRegion, Balls)
select_shape(Balls, FinalBalls, 'circularity', 'and', 0.85, 1.0)
sort_region (FinalBalls, SortedRegions, 'upper_left', 'true', 'column') count_obj(SortedRegions,NumBalls)
select_obj (SortedRegions, ObjectSelected,3)
smallest_circle(ObjectSelected, Row, Column, Radius) meanRadius := sum(Radius)/|Radius|
area_center(SortedRegions, Area, RowCenter, Colcenter) minArea := min(Area)
disp_circle (WindowID, Row, Column, Radius) 显示效果如下:
Halcon学习(七)图像中显示文字
(2012-12-17 20:47:03)
在图像中显示文字,数字等文本。 * ball.hdev: Inspection of Ball Bonding dev_update_window ('off') dev_close_window ()
dev_open_window (0, 0, 728, 512, 'black', WindowID) read_image (Bond, 'die/die_03') dev_display (Bond)
set_display_font (WindowID, 14, 'mono', 'true', 'false') disp_continue_message (WindowID, 'black', 'true') stop ()
threshold (Bond, Bright, 100, 255) shape_trans (Bright, Die, 'rectangle2')
dev_set_color ('green') dev_set_line_width (3) dev_set_draw ('margin') dev_display (Die)
disp_continue_message (WindowID, 'black', 'true') stop ()
reduce_domain (Bond, Die, DieGrey) threshold (DieGrey, Wires, 0, 50)
fill_up_shape (Wires, WiresFilled, 'area', 1, 100) dev_display (Bond) dev_set_draw ('fill') dev_set_color ('red')
dev_display (WiresFilled)
disp_continue_message (WindowID, 'black', 'true') stop ()
opening_circle (WiresFilled, Balls, 15.5) dev_set_color ('green') dev_display (Balls)
disp_continue_message (WindowID, 'black', 'true') stop ()
connection (Balls, SingleBalls)
select_shape (SingleBalls, IntermediateBalls, 'circularity', 'and', 0.85, 1.0) sort_region (IntermediateBalls, FinalBalls, 'first_point', 'true', 'column') dev_display (Bond) dev_set_colored (12) dev_display (FinalBalls)
disp_continue_message (WindowID, 'black', 'true') stop ()
smallest_circle (FinalBalls, Row, Column, Radius) NumBalls := |Radius| Diameter := 2 * Radius
meanDiameter := sum(Diameter) / NumBalls mimDiameter := min(Diameter) dev_display (Bond)
disp_circle (WindowID, Row, Column, Radius) dev_set_color ('white') for i := 1 to NumBalls by 1 if (fmod(i,2) == 1)
disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] - 2.7 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false') else
disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] + 1.2 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false') endif
endfor
dev_set_color ('green') dev_update_window ('on')
disp_continue_message (WindowID, 'black', 'true') stop ()
dev_close_window () 注释:
dev_update_window ('off') 和 dev_close_window ()的区别:
dev_update_window ('off'):关闭图像窗口的内容,不关闭图形窗口 dev_close_window ():关闭图形窗口
dev_open_window (0, 0, 728, 512, 'black', WindowID):打开一个原点在(0,0)的,宽728,高512,背景为黑色的图形窗口
dev_display (Bond):显示图像,和matlab的imshow一样。
set_display_font (WindowID, 14, 'mono', 'true', 'false'):设置显示的字体
disp_continue_message (WindowID, 'black', 'true'):显示“Press Run (F5) to continue” dev_set_color ('green'):设置显示的颜色
dev_set_line_width (3) :设置显示线条的宽度 dev_set_draw ('margin'):设置所画图形的形状 if (fmod(i,2) == 1):判断i/2的余数是否为1
disp_message (WindowID, 'D: ' + Diameter[i - 1], 'image', Row[i - 1] - 2.7 * Radius[i - 1], max([Column[i - 1] - 60,0]), 'white', 'false'):在图像的(Row[i - 1] - 2.7 * Radius[i - 1], max([Column[i - 1] - 60,0])的这个位置显示“D:半径”
Halcon学习(八)文本操作
(2012-12-17 21:22:06)
1.open_file( : : FileName, FileType : FileHandle) FileType:
'output':创建文本
?append':在原有的文本基础上写入该文件 'input':打开文件
2.fwrite_string( : : FileHandle, String : )写入文件 3.fnew_line( : : FileHandle : )换行
4.close_file( : : FileHandle : )关闭文件 5.fread_char( : : FileHandle : Char)读入字符
6.fread_line( : : FileHandle : OutLine, IsEOF)行读取,IsEOF:判断是否到了文本文件的末尾 7.fread_string( : : FileHandle : OutString, IsEOF)读入字符串 程序如下:
open_file ('E:/halcon图像/新建文本文档.txt', 'output', FileHandle) fwrite_string (FileHandle, 'hallo') fnew_line (FileHandle) close_file (FileHandle)
open_file ('E:/halcon图像/新建文本文档.txt', 'input', FileHandle) * fread_char (FileHandle, Char)
* fread_line (FileHandle, OutLine, IsEOF) fread_string (FileHandle, OutString, IsEOF1) 注意最后三行显示的内容不一样
Halcon学习(九)两幅图像之间处理
(2012-12-17 21:51:40)
1.sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : ) 对两幅图像做减法 g' := (g1 - g2) * Mult + Add 程序如下:
read_image (Scene00, 'autobahn/scene_00') read_image (Scene01, 'autobahn/scene_01')
sub_image (Scene00, Scene01, ImageSub1, 1, 0) dev_display(ImageSub1)
2.abs_image(Image : ImageAbs : : )计算图像的绝对值模型
3.crop_part(Image : ImagePart : Row, Column, Width, Height : )剪切出一个长方形的图像 4.add_image(Image1, Image2 : ImageResult : Mult, Add : ) 两图像相叠加 g' := (g1 + g2) * Mult + Add
5.max_image(Image1, Image2 : ImageMax : : )计算两幅图像每个像素点的最大值 6.min_image(Image1, Image2 : ImageMin : : )计算两幅图像每个像素点的最小值 7.div_image(Image1, Image2 : ImageResult : Mult, Add : ) 两幅图像相除 g' := g1 / g2 * Mult + Add
8.mult_image(Image1, Image2 : ImageResult : Mult, Add : )两幅图像相乘 g' := g1 * g2 * Mult + Add
Halcon学习(十)边缘检测(一)
边缘检测的定义 :使用数学方法提取图像像元中具有亮度值(灰度)空间方向梯度大的边、线特征的过程。
边缘 是指周围像素灰度有阶跃变化或屋顶等变化的那些像素的集合。图像的边缘对应着图像灰度的不连续性。显然图像的边缘很少是从一个灰度跳到另一个灰度这样的理想状况。真实图像的边缘通常都具有有限的宽度呈现出陡峭的斜坡状。边缘的锐利程度由图像灰度的梯度决定。梯度是指灰度变化的最快的方向和数量。
常见的边缘点有三种 :第一种是阶梯形边缘 (Step-edge), 即从一个灰度到比它高好多的另一个灰度。第二种是屋顶型边缘 (Roof-edge), 它的灰度是慢慢增加到一定程度然后慢慢减小。还有一种是线性边缘 (Line-edge), 它的灰度从一级别跳到另一个灰度级别之后然后回来。
边缘检测的方法主要有以下几种: 第一种检测梯度的最大值。由于边缘发生在图像灰度值变化比较大的地方 ,对应连续情形就是说是函数梯度较大的地方,所以研究比较好的求导算子就成为一种思路。 Roberts 算子、 Prewitt 算子和 Sobel 算子等就是比较简单而常用的例子。还有一种比较直观的方法就是利用当前像素邻域中的一些像素值拟合一个曲面 , 然后求这个连续曲面在当前像
素处梯度。从统计角度来说 , 我们可以通过回归分析得到一个曲面 , 然后也可以做类似的处理。
第二种是检测二阶导数的零交叉点。这是因为缘处的梯度取得最大值 ( 正的或者负的 ), 也就是灰度图像的拐点是边缘。从分析学上我们知道 , 拐点处函数的二阶导数是 0 。 第三种,统计型方法。比如说利用假设检验来检测边缘中利用对二阶零交叉点的统计分析得到了图像中各个像素是边缘的概率,并进而得到边缘检测的方案。
1.sobel_amp(Image : EdgeAmplitude : FilterType, Size : )图像的一次导数计算图像的边缘根据 程序如下:
read_image (Image, 'fabrik')
sobel_amp (Image, EdgeAmplitude, 'sum_abs', 3) threshold (EdgeAmplitude, Region, 10, 255) skeleton (Region, Skeleton) dev_display (Image) dev_set_color ('white') dev_display (Skeleton) Image
EdgeAmplitude Region Skeleton
Halcon学习(十一)边缘检测(二)
2.close_edges(Edges, EdgeImage : RegionResult : MinAmplitude : ) 程序如下:
read_image (Image, 'fabrik') dev_close_window ()
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowID) sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 3) threshold (EdgeAmplitude, Edges, 30, 255)
close_edges (Edges, EdgeAmplitude, EdgesExtended, 15) dev_set_color ('green')
dev_display (EdgesExtended) dev_set_color ('red') dev_display (Edges) Image
EdgeAmplitude Edges
EdgesExtended
Halcon学习(十二)边缘检测(三)