精华内容
下载资源
问答
  • 区域提取
    千次阅读
    2020-03-03 10:04:29

     

    1、区域的运算

    在学习特征分析之前,先了解一下几个区域的基本运算方式。

    区域的运算主要包含:区域作差、区域合并、区域集合、区域的选择、区域的填充、区域的骨架等。在项目中,根据实际需要,灵活的选择相应的计算方式。

    在Halcon创建两个矩形,作为后面算子测试用:

    *生成两个矩形区域
    gen_rectangle1 (Rectangle1, 123, 196, 186, 356)
    gen_rectangle1 (Rectangle2, 123+20, 196+20, 186-20, 356-20)

    区域作差:将一个区域减去另一个区域,便得到区域的差值。

    算子:difference 

    如:

    *两个矩形区域做差
    difference (Rectangle1, Rectangle2, RegionDifference)

    区域合并(求和):将一个区域和另外一个区域求和,便可以将两个区域合并成一个区域。

    算子:union1、union2 

    如:

    *区域的合并,union1是对集合的合并,union2是对区域的加
    union2 (RegionDifference, Rectangle2, RegionUnion)
    

    区域集合:将两个或者两个以上的区域放入一个集合中,这个集合称为区域的集合。特别注意的是:在集合中,每个区域都是孤立的,并没有进行合并,要与区域的和进行区分,每一个区域称为一个obj

    算子:concat_obj 

    如:

    *两个区域放到一个集合
    concat_obj (Rectangle1, Rectangle2, ObjectsConcat)

    区域的选择:从区域集合中进行区域的选择。

    算子:select_obj。参数3:要选择的区域ID号。

    如:

    *区域的选择:参数3表示要选择的第几个区域
    select_obj (ObjectsConcat, ObjectSelected, 2)

    区域的填充:对区域中的孔洞进行封闭,称为孔洞的填充。

    算子:fill_up 

    如:

    *区域的填充
    fill_up (RegionDifference, RegionFillUp)

    区域骨架的求取:区域的骨架可以理解为图像的中轴,骨架求取就是求取区域中轴的过程。

    算子:skeleton、fill_up_shape

    如:

    *区域骨架的求取
    skeleton (RegionFillUp1, Skeleton)
    
    *指定面积范围的区域的填充:参数4和参数5表示区域面积范围。不在面积范围的不填充
    fill_up_shape (RegionDifference, RegionFillUp1, 'area', 1, 10000)

     

    2、区域的特征分析

    在学习区域特征分析前,先了自我问一下,为什么要学习区域特征分析。根据前面所讲的,已经能够进行区域的分割和区域的提取了。这是因为,如果我们只想从分割出来的区域中提取指定要求的一个区域,那该如何选择呢?那这就需要给定提取区域的特征来进行提取。所以要对区域的特征分析,要根据每一个区域的特征,选择出我们需要的区域。

    常用的区域区域特征:区域的面积、区域的最小外接矩形(长、宽跟角度)、区域的角度、区域的凸性、区域的圆度、区域的最小外接圆大小等。下面来对其进行具体讲解:

    首先绘制一个矩形区域,变量名Region。

    区域的面积:区域内像素点数量总。

    算子:area_center

    area_center (Region, Area, Row4, Column4)

    区域的最小外接矩形:外接矩形长、宽的一半长、宽半轴,对应的矩形长轴方向称为区域的方向。区域的最小外接矩形,分为两种外接方式,如下图所示

    算子:

    smallest_rectangle2:最小外接矩形2

    smallest_rectangle1:最小外接矩形1

    区域的角度:区域的角度就是外接矩形的角度。

    区域的凸性:每个区域都存在一个最小的凸性区域,这个区域内的任意位置两点连线都在该区域内,这样的区域称为区域的凸性区域。其中原区域与凸性区域的比值称为区域的凸性,范围0-1.

    算子:

    shape_trans:将区域转换为凸性区域(凸包)。

    convexity:获取区域的凸性值

    如:

    *凸集转换,'convex'生成凸集,也可以选择生成外接圆
    shape_trans (Region, RegionTrans, 'convex')
    *获取区域的凸性值,值保存在Convexity中。表示的是该区域面积和凸集的比值,范围0-1

    区域的圆度:指区域边界是否接近圆形的程度,范围0-1。

    算子:circularity

    *获取区域的圆度
    circularity (Region, Circularity)

    区域的外接圆:能够将区域完全包含的圆区域,称为区域的最小外接圆。

    算子:

    smallest_circle:获取区域的最小外接圆

    region_features :获得区域的任意特征

    *获取区域外接圆
    smallest_circle (Region, Row3, Column3, Radius)
    gen_circle (Circle, Row3, Column3, Radius)
    *获取区域的特征,比如面积:'area'
    region_features (Circle, 'area', Value)

    3、案例:遥控器上的字符特征提取

    经过前面的阈值分割、形态学膨胀腐蚀、区域特征分析、区域运算等学习,利用这些知识可以对一幅图像中指定的区域进行提取出来。比如对一幅遥控器背面图像的操作说明的文字进行提取。

    需求:提取遥控器上的字符区域,并计算每一个字符汉字区域的面积、外接矩形的长宽,然后将计算的值存储到txt文本文件中。

    遥控器图片

    分析:先将图片转换为灰度图,根据灰度值将遥控器区域提取出来,然后再去求取每个字符的区域,最后再对每一个字符串进行计算区域面积、外接矩形长宽。

     

    程序实现讲解:

    读取图片并灰度转换

    read_image (Image, '素材.jpg')
    *灰度转换
    rgb1_to_gray (Image, GrayImage)

    通过静态全局阈值分割(根据灰度值不同来分割),将图片分割成不同区域。遥控器的图像区域比较亮,灰度值基本在180以上。灰度值查看方法前面已经说过,在图片窗口上,按住Ctrl键,鼠标跳出来的一个是鼠标坐标值、另一个就是灰度值。

    *静态阈值分割
    threshold (GrayImage, Region, 150, 255)

    阈值分割后,每个区域的边缘比较凹凸,形态学开操作(腐蚀)。

    *开操作-腐蚀操作
    opening_circle (Region, RegionOpening, 3.5)

    连通域标记操作

    *连通域标记,将几个区域分隔开
    connection (RegionOpening, ConnectedRegions)

    将遥控器的区域选择出来,遥控器的区域面积最大,因此可以用面积来进行筛选。

    *方法1:遥控器区域面积大,可以用选择面积大的方法。将遥控的区域单独选择出来。
    *参数3:最大面积,参数4:百分比。
    select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
    *方法2:根据凸性、或者遥控的外接矩形凸性来选择,

    注意的是,提取出来的遥控器区域,字符所占的位置都是空的,因为字符是黑色的,在阈值分割的时候都已经分割开来了,因此要获得整个遥控图片所占区域,要将字符串的也位置填充起来。

    *填充:将字符串的填充起来
    fill_up (SelectedRegions, RegionFillUp)

    将遥控器图像,从灰度图中裁剪下来

    *裁剪,将遥控器的图片区域从原图中裁剪下来
    reduce_domain (GrayImage, RegionFillUp, ImageReduced)

    此时就可以对裁剪下来的遥控器图像进行特征分析了。字符是黑色的,遥控面板是白色的,灰度值区分还是很明显的。使用阈值分割即可

    *全局阈值:前两个数值:选择分割的图像灰度范围,最后一个是要选择的分割的面积(可以将一些点去掉)
    fast_threshold (ImageReduced, Region1, 0, 100, 20)

    可以看到,此时提取出来的字符,是斜着的,并且很多字的笔画是分开的并没有连接起来,这样子的话程序是会将其当成多个字符区域。

    因此先将这些字符转到水平。

    *求取区域的方向
    orientation_region (Region1, Phi)
    *求取区域的中心
    area_center (Region1, Area, Row, Column)
    *求取区域的角度,参数6:新的旋转之后的角度
    vector_angle_to_rigid (Row, Column, Phi, Row, Column, -3.1415*0.5, HomMat2D)
    *对区域旋转操作:转到水平
    affine_trans_region (Region1, RegionAffineTrans, HomMat2D, 'nearest_neighbor')

    然后,再膨胀操作。先形态学闭运算、再竖直方向膨胀

    *膨胀操作-闭运算:
    *同一个字符相邻的区域先浓缩成一团:将左右连接在一起
    closing_circle (RegionAffineTrans, RegionClosing, 3.5)
    *然后再竖直方向膨胀,将竖直方向的都连接起来。参数3是宽度表示水平方向的,则值要设置的小
    dilation_rectangle1 (RegionClosing, RegionDilation, 1, 11)

    此时连通域操作,将每个字标记分开

    *连通域操作:
    connection (RegionDilation, ConnectedRegions1)

    观察发现,有一个逗号,还有“约3秒”、“按键”连接在了一起成了一个区域。

    先去掉逗号,通过面积选择来操作

    *选择指定的区域:去除逗号,,逗号面积小,大概80.参数5和参数6表示的是筛选的区域面积范围
    select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 150, 99999)

    分开连接在一起的字符比较麻烦,按下面的方法来实现。

    将Region1旋转至水平和SelectedRegions1求交集才能求出完整的字符

    *旋转至水平
    affine_trans_region (Region1, RegionAffineTrans1, HomMat2D, 'nearest_neighbor')
    *两个区域求交集,得出遥控器上的字符串
    intersection (SelectedRegions1, RegionAffineTrans1, RegionIntersection)

    然后对每个字符区域进行排序

    *区域的排序,参数5:选择排序方式以行排序
    sort_region (RegionIntersection, SortedRegions, 'first_point', 'true', 'row')

    *“约3秒”、“按键”没有分割开,需要分割开。用区域外接矩形1,长度法提取出来

    select_shape (SortedRegions, SelectedRegions2, 'rect2_len1', 'and', 30, 99999)

    然后再对其进行分开操作

    *提取出来后再闭运算-膨胀
    closing_circle (SelectedRegions2, RegionClosing1, 1.5)
    *再竖直方向膨胀(使每个字符笔画都是连接的)
    dilation_rectangle1 (RegionClosing1, RegionDilation1, 1, 11)
    *连通域
    connection (RegionDilation1, ConnectedRegions2)
    *再求交集,获得字符
    intersection ( ConnectedRegions2,SelectedRegions2, RegionIntersection1)

    *生成空区域
    gen_empty_obj (EmptyObject)
    *RegionIntersection1求交集EmptyObject,放到生成的空区域中
    concat_obj (EmptyObject, RegionIntersection1, EmptyObject)

    约3秒”、“按键”连起来的字符区域去掉,再加上“约3秒”、“按键”重新分割开的,形成完整的每个汉字都独立的区域

    ***“约3秒”、“按键”连起来的字符区域去掉,再加上“约3秒”、“按键”重新分割开的。
    *区域做差。
    difference (RegionIntersection, RegionIntersection1, RegionDifference)
    concat_obj (EmptyObject, RegionDifference, EmptyObject)

    至此,遥控器上的每个独立的字符都已经提取出来了。下面要做的就是,每一个字符汉字区域的面积、外接矩形的长宽,然后将计算的值存储到txt文本文件中。

    可以先统计总共有多少个字符,然后将字符进行排序,再写一个循环遍历程序对字符区域进行求面积、计算外接矩形的长宽,将所求的结果保存到数组中。最后将保存区域面积、外接矩形长款的数组数组写到txt文本中。

    功能比较简单,直接贴出代码程序了,代码都有对应注释。

    *统计总共有多少个字符区域
    count_obj (EmptyObject, Number)
    *按行排序
    sort_region (EmptyObject, SortedRegions1, 'first_point', 'true', 'row')
    
    *创建一个数组,用来保存区域面积
    a:=[]
    *创建一个数组,用来保存外接矩形1边长L1
    L1:=[]
    *创建一个数组,用来保存外接矩形1边长L2
    L2:=[]
    
    *遍历
    for i:=1 to Number-2 by 1
        *
        select_obj (SortedRegions1, ObjectSelected, i)
        *区域面积
        area_center (ObjectSelected, Area1, Row1, Column1)
        *遍历的结果添加到数组中,并且添加tab符
        a:=[a,Area1,'\t']
        *外接矩形1的两个边长
        smallest_rectangle2 (ObjectSelected, Row2, Column2, Phi1, Length1, Length2)
        *遍历的结果添加到数组中,并且添加tab符
        L1:=[L1,Length1,'\t']
        *遍历的结果添加到数组中,并且添加tab符
        L2:=[L2,Length2,'\t']
    endfor
    
    *添加换行符
    a:=[a,'\r\n']
    *添加换行符
    L1:=[L1,'\r\n']
    *添加换行符
    L2:=[L2,'\r\n']
    
    ****将37个字符区域的面积和外接矩形1的两个边长参数写到txt文本中
    
    *新建txt。文件保存在程序根目录下
    open_file ('1.txt', 'output', FileHandle)
    fnew_line (FileHandle)
    *写到文本中.面积a
    fwrite_string (FileHandle, a)
    *另起一行再写。L1
    fnew_line (FileHandle)
    fwrite_string (FileHandle, L1)
    *另起一行再写。L2
    fnew_line (FileHandle)
    fwrite_string (FileHandle, L2)
    *关闭文件
    close_file (FileHandle)
    
    

    最终保存到txt文本的数据

    工程完整程序下载链接:

    https://download.csdn.net/download/panjinliang066333/12206334

     

     

    更多相关内容
  • 根据视觉注意机制的经典模型Itti模型来提取图像的低层特征,利用局部迭代的特征合并策略并在此基础上综合自动阈值分割和种子点的区域生长方法得到感兴趣区域提取方法。实验结果表明该方法符合生物的视觉注意机制,...
  • 针对基于视觉的机器人导航中的显著性场景的提取问题,提出了一种基于颜色和纹理的显著性区域提取方法.该方法首先将输入图像提取出L,a,b三个颜色通道并转化为亮度图像;然后分别对L,a,b三个通道进行高斯差分滤波,在亮度...
  • 图像显著性区域提取是计算机视觉处理的重要步骤。结合人类视觉心理、生理模型, 提出一种基于视觉注意机制的彩色图像显著性区域提取模型。通过改进的分水岭算法对彩色图像进行预分割, 从而将原图像分成若干子区域, 在...
  • 运动区域提取和闪频分析并行的火焰检测算法
  • 视频显著性区域提取 C++代码
  • 基于深度学习的显著区域提取方法.pdf
  • 用matlab提取图形中的的感兴趣区域,其他区域全部变成白色
  • opencv区域提取

    2017-05-23 11:48:45
    区域提取
  • 基于CBCT图像的牙髓腔区域提取分割方法
  • 掌纹有效区域提取

    2016-11-15 20:43:21
    掌纹有效区域提取matlab代码,有注释和界面
  • 图像中的车辆图像提取,只提取出有车辆的区域,忽略其他区域
  • 基于视觉显着性的遥感图像感兴趣区域提取
  • 感兴趣区域提取(ROI)matlab实现程序代码 图片的感兴趣区域的提取matlab实现 直接运行go函数即可运行 可视化操作
  • 对于未知环境下机器人导航中的道路检测,提出了一种基于...最后根据直线的特征与相邻帧的数据进行比较,通过区域生长在道路中提取可行区域.实验表明本方法能快速、有效地在形状不规则的路况中检测出道路边界与可行区域.
  • opencv车牌区域提取代码,对照片中车牌区域进行提取识别
  • 这是一份使用传统图像处理方式,借助vs2013和opencv3.*共同完成的一个文字区域提出的demo,仅供参考学习
  • 基于matlab的CT图像处理,提取感兴趣的区域,并染色。计算面积
  • 人脸识别最难得在于特征量的提取,作者在老师的指导下通过对人脸图像打上网格,对区域块图像做二值分析,通过像素比例来做处理。进而得到人脸区域,识别准确性在一般的应用中已经可以满足要求。
  • MSER区域提取,帮助进行图像特定目标检测
  • 主要介绍了Python+Opencv身份证号码区域提取及识别实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 通过图像分割实现小型金属零件特征区域提取图像分割
  • 为此提出在扫描定位之前通过图像处理结合BP神经网络实现QR Code二维码条码区域提取方法。火车票通过图像预处理得到可能是二维码的区域块,提取经图像处理后的二维码区域块图像特征并结合BP神经网络过滤出正确的...
  • matlab 车牌区域提取

    2013-09-22 19:41:43
    matlab 车牌区域提取 在2008上编的 自己注意一下程序中的图片路径就能用
  • 对植物图像进行图像分割,区域标记,区域提取
  • 对图象感兴趣区域系数的提取,图象感兴趣区域系数等等
  • 实现彩色图像显著区域提取,基于注意力机制,使用算法包括k-means,分割等。
  • 针对机器人自动化生产线中视觉定位零件的问题进行了研究,为了能够快速地在复杂背景中提取出零件图像区域,提出了一种基于Logistic回归的零件图像区域提取的机器视觉算法。首先,在工作场景图像中采集若干正类和负类...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 213,064
精华内容 85,225
关键字:

区域提取