上一个笔记里面有一个错误:
regiongrowing算子没有使用一个Row*Column的平滑滤波器处理图像,这个尺寸是一个用来判断两个点是否属于同一区域的模板。
文档上建议在使用这个算子之前做一下平滑滤波。
补充一个使用hsv图像识别图像中的红色药丸的例子:
read_image(Image, 'blister_mixed_11')
decompose3(Image, Image1, Image2, Image3)
trans_from_rgb(Image1, Image2, Image3, ImageResult1, ImageResult2, ImageResult3, 'hsv')
threshold(ImageResult1, Region1, 0, 50)
connection(Region1, ConnectedRegions)
select_shape(ConnectedRegions, SelectedRegions, 'area', 'and', 100, 999999)
union1(SelectedRegions, RegionUnion)
reduce_domain(Image, RegionUnion, ImageReduced)
decompose3(ImageReduced, Image11, Image21, Image31)
threshold(Image21, Region, 0, 60)
connection(Region, ConnectedRegions1)
select_shape(ConnectedRegions1, SelectedRegions1, 'area', 'and', 1000, 99999)
-
近似计算图像的内外边界:
内边界使用原图像减去适度腐蚀后的图像;
外边界使用适度膨胀后的图像减去原图像。 -
闵可夫斯基加减法
当结构元对称时,与膨胀或腐蚀的效果是一致的;
当结构元不对称时,与膨胀或腐蚀的效果不一致,区别在于膨胀或腐蚀需要先对结构元做原点对称。
相关算子:minkowski_sub1,minkowski_add1 -
再看击中击不中
这个点在之前看的时候被我跳过去了。
在halcon中有算子hit_or_miss可以来看某个区域是否击中击不中,例子:
read_image(Characters, 'characters')
* 创建一个椭圆形结构元,长短轴半径分别是25和20
* 这个结构元被用来做击中
gen_ellipse(Ellipse1, 45, 40, rad(90), 25, 20)
* 获取结构元半径
boundary(Ellipse1, RegionBorder1, 'outer')
* 再创建一个椭圆形结构元,这个结构元被用来做击不中
gen_ellipse(Ellipse2, 45, 40, rad(90), 40, 35)
boundary(Ellipse2, RegionBorder2, 'outer')
rgb1_to_gray(Characters, GrayImage)
threshold(GrayImage, Region3, 180, 255)
* 当满足第一个结构元击中并且第二个结构元击不中的情况下,结构元圆心组成了区域RegionHitMiss
hit_or_miss(Region3, RegionBorder1, RegionBorder2, RegionHitMiss, 45, 40)
击中要求结构元完全被区域包含;击不中要求结构元与区域没有交集。
-
开闭运算
halcon中有直接给出开闭运算的算子,可以不必自己做一次腐蚀再做一次膨胀。
算子名称opening和closing相关。 -
复习一下顶帽变换和底帽变换
顶帽变换:较暗的背景中求较亮的像素
halcon:top_hat,gray_tophat
底帽变换:较亮的背景中求较暗的像素
halcon:bottom_hat, gray_bothat -
select_shape_std
选择指定特征的区域,可以指定特征为'max_area',直接选择出面积最大的区域 -
gen_recetangle2(Rectangle, Row, Column, Phi, Lenght1, Length2)
画一个矩形,矩形的中心再(Row, Column),矩形的宽是Length1的__两倍__ (水平方向长度),矩形的高是Length2的 两倍 (竖直方向长度),
矩形绕着中心旋转Phi的弧度。
角度转弧度:rad(90),表示 (pi / 2)
小结:
今天系统的运用了一下Region相关的算子,笔记只记录一些需要注意的事项,算子远远不止这么多。明天计划把xld,图像运算,边缘分析相关的算子过一遍。