blob分析

什么是blob分析?

以每个像素的灰度值作为分析对象  也称为像素颗粒分析  团块分析

blob分析的流程?

采集图像==>预处理(不一定需要)==>分割==>计算显示
预处理(拉开对比度):ROI(感兴趣区域),去噪,几何变换
分割:二值化,形态学,特征选择

把图像通过分割变成多个区域,选取自己需要的区域,做排序,运算,显示

二值化:根据灰度值的范围将一幅图像中的像素分为两部分(区域),这个过程叫做二值化,这个范围叫做阈值
灰度直方图:对一幅图像中像素的灰度值做一个概率统计
特征直方图:将多个区域的特征进行概率统计

区域形态学

区域膨胀,区域腐蚀,区域开运算,区域闭运算

区域膨胀和区域闭运算都是增加区域像素点
区域腐蚀和区域开运算都是减少区域像素点

区域开运算:先腐蚀后膨胀,腐蚀>膨胀,结果是减少像素点
区域闭运算:先膨胀后腐蚀,膨胀>腐蚀,结果是增加像素点

在相同的结构元素半径下,区域膨胀比区域闭运算增加的像素点多,腐蚀比开运算减少的像素点少

结构元素半径越大,增加或腐蚀的像素点越多

结构元素像什么形状,区域形态学处理后结果越像什么形状

开运算能够去除一些孤立的点,毛刺,断开小连接,总的形状几乎不变,
闭运算能够填充小孔,弥合一些小裂缝,总的形状几乎不变

算子详解

一、预处理:ROI(感兴趣区域),去噪,几何变换

平移和旋转矩阵(刚体变换)   几何变换—仿射变换 (求矩阵)    
vector_angle_to_rigid (Row, Column, Phi, Row, Column, Phi, HomMat2D)
Row(输入):参考点变换前的行坐标
Column(输入):参考点变换前的列坐标
Phi(输入):参考点变换前的角度
Row(输入):参考点变换后的行坐标
Column(输入):参考点变换后的列坐标
Phi(输入):参考点变换后的角度
HomMat2D(输出):输出矩阵

生成一个单位矩阵(齐次矩阵):任何一个矩阵乘以它都是自己本身,过渡
hom_mat2d_identity (HomMat2DIdentity)

平移矩阵     几何变换—仿射变换(求矩阵)    
hom_mat2d_translate (PhiDeg, Column, Row, HomMat2DTranslate)
PhiDeg:输入矩阵
Column: 输入行的平移量
Row: 输入列的平移量  
HomMat2DTranslate:输出平移矩阵

旋转矩阵     几何变换—仿射变换(求矩阵)    
hom_mat2d_rotate (PhiDeg, Phi, Column, Row, HomMat2DRotate)
PhiDeg:输入矩阵
Phi: 输入旋转角度(弧度)
Column:输入旋转中心的行坐标
Row:输入旋转中心的列坐标
HomMat2DRotate: 输出旋转矩阵

缩放矩阵     几何变换—仿射变换(求矩阵)    
hom_mat2d_scale (PhiDeg, 2, 2, Column, Row, HomMat2DScale)
PhiDeg:输入矩阵
2: 行方向缩放比例
2: 列方向的缩放比例
Column:缩放中心行坐标  
Row:缩放中心列坐标  
HomMat2DScale:输出缩放矩阵

区域仿射变换       几何变换—仿射变换(仿射变换 
affine_trans_region (Region, RegionAffineTrans, HomMat2DScale, 'nearest_neighbor')
Region(输入):输入区域
RegionAffineTrans(输出):输出区域
HomMat2DScale:需要乘的矩阵(模板中心坐标转实例)
'nearest_neighbor':插值算法

图像的仿射变换       几何变换—仿射变换(仿射变换 
affine_trans_image (Image, ImageAffineTrans, HomMat2DScale, 'constant', 'false')
Image(输入):输入图像
ImageAffineTrans(输出):输出图像
HomMat2DScale:需要乘的矩阵(模板中心坐标转实例)
'constant':插值算法
'false':是否适应大小,选 true 会改变图像大小

轮廓的仿射变换     几何变换—仿射变换(仿射变换 
affine_trans_contour_xld (ModelContours, ContoursAffineTrans, HomMat2D)
ModelContours(输入):输入轮廓
ContoursAffineTrans(输出):输出轮廓
HomMat2D:需要乘的矩阵(模板原点坐标转实例)

点的仿射变换       几何变换—仿射变换(仿射变换 
affine_trans_point_2d (HomMat2D2, Row, Column, Qx1, Qy1)
HomMat2D2:需要乘的矩阵(模板中心坐标转实例)
Row, Column:转换前坐标
Qx1, Qy1:转换后的坐标

像素的仿射变换       几何变换—仿射变换(仿射变换 
affine_trans_pixel (HomMat2D2, Row, Column, Qx1, Qy1)
HomMat2D2:需要乘的矩阵(模板中心坐标转实例)
Row, Column:转换前坐标
Qx1, Qy1:转换后的坐标

镜像
mirror_image (Image1, ImageMirror, 'row')
输入图像
输出图像
行、列、对角  进行镜像(按中心翻转)

错切(倾斜字体拉正)
求文本行倾斜角度
text_line_slant (Region, Image, 50, rad(-45), rad(45), SlantAngle)
输入区域   输入图像  文字行的高度  最小倾斜度  最大倾斜度  
输出角度(rad)
hom_mat2d_identity (HomMat2DIdentity)  //生成一个单位矩阵
生成错切矩阵
hom_mat2d_slant (HomMat2DIdentity, -SlantAngle, 'x', 0, 0, HomMat2DSlant)
单位矩阵   倾斜角度(跟文本倾斜角度相反)  倾斜的坐标轴(x或y)  起始点
输出错切矩阵

已知对应点变换前的坐标和变换后的坐标,求点的仿射变换矩阵
vector_to_rigid (x, y, Tx, Ty, HomMat2D1)
输入变换前坐标   变换后坐标
输出转换矩阵
注意:点最少要两个组成一条线,先绕原点旋转,再平移
已知矩阵求缩放,旋转、平移等参数
hom_mat2d_to_affine_par (HomMat2D1, Sx, Sy, Phi, Theta, Tx, Ty)
输入矩阵
输出x方向缩放参数,y方向缩放参数,旋转,倾斜角度,x方向平移量,y方向平移量
注意:这个平移量是先旋转完角度后的x、y平移到目标x、y的平移

画区域 等待右键确认
draw_region (Region, WindowHandle)
Region(输出):输出区域
WindowHandle:窗口句柄

线性变换(缩放变换--可以使用灰度直方图选择缩放)
当你想对图片整体拉亮或者拉暗的时候使用(y=kx+b)
scale_image (Image, ImageScaled, 19.6154, -1883)
Image(输入):输入图像
ImageScaled(输出):输出图像
19.6154:k的值
-1883:b的值

对数变换(新图像黑白分明)
(y=a的x次方)
exp_image (Pellets, ExpImage, 'e')
Pellets(输入):输入图像
ExpImage(输出):输出图像
'e':a的值

指数变换(新图像灰不拉几)
(y=loga的x次方)
log_image (Pellets, LogImage, 'e')
Pellets(输入):输入图像
LogImage(输出):输出图像
'e':a的值

彩色转为灰度图像
rgb1_to_gray (Image, image1)
image:输入彩色图像
image1:输出灰度图像

彩色图像拆为三通道
decompose3 (Image, R, G, B)
Image(输入):输入图像
R:输出R色域图像
G:输出G色域图像
B:输出B色域图像

RGB转HSV
trans_from_rgb (R, G,B, h, s, v, 'hsv')
输入:R, G,B三张色域图像
输出:输出 HSV分量    H:色度  S:饱和度  V:亮度
'hsv':HSV模式(可以填其他模式)

生成不带方向矩形区域(图形窗口,画笔,生成ROI区域)
gen_rectangle1 (ro1, 42.2297, 2.98511, 510.366, 727.113)
ro1(输出):输出区域  
左上角的行列坐标  
右下角的行列坐标

生成带方向矩形区域(图形窗口,画笔,生成ROI区域)
gen_rectangle2 (ROI_0, 214.969, 230.667, rad(-12.7316), 40.5684, 36.6986)
ROI_0输出):输出区域  
中心行列坐标
主轴方向与水平夹角
半长
半宽

区域形状转换
shape_trans (Regions1, RegionTrans, 'rectangle1')
Regions1(输入):输入区域
RegionTrans(输出):输出区域  
rectangle1:形状转换名称

填充区域孔洞
fill_up (Regions, RegionFillUp)

抠图(本质遮挡输入区域以外的区域)
不是裁剪,只是把其他区域遮盖住,本质还是一整张图(只能扣一个区域,想扣多个区域,先联合成一个区域)
reduce_domain(image, Region, ImageReduced)
image(输入):输入图像  
Region:输入区域(单区域)  
ImageReduced(输出):输出图像(跟原图的大小一致)

裁剪
crop_domain (reduce1, ImagePart1)
一般搭配抠图使用,先扣图,再裁剪
reduce1(输入):输入图像
ImagePart1(输出):输出图像
矩形区域裁剪图像
crop_rectangle1 (Image2, ImagePart, 100, 100, 200, 200)
输入图像
输出图像
要裁剪的左上角行列坐标,右下角行列坐标
区域裁剪
clip_region (Region, RegionClipped, 0, 0, 256, 256)
输入区域
输出区域
要裁剪的左上角行列坐标,右下角行列坐标
xld轮廓裁剪
clip_contours_xld (CroppedContours, ClippedContours, 0, 0, 512, 512)
输入轮廓
输出轮廓
要裁剪的左上角行列坐标,右下角行列坐标

设置单个像素灰度值
set_grayval (Image, 444, 555, [255,0,0])
输入图像   像素行、列坐标   值(单通道直接写值,三通道写三个值[255,0,0])

提取区域边界像素,输出区域
一般提取后再膨胀一点再抠图
boundary (SelectedRegions, RegionBorder, 'inner') 
SelectedRegions(输入):输入区域
RegionBorder(输出):输出区域
inner:边界类型(默认内边界)

获得图片句柄、类型、宽高
get_image_pointer1 (ImagePart1, Pointer, Type, Width, Height)
ImagePart1(输入):输入图像
Pointer(输出):输出图像句柄
Type:输出图像类型
Width, Height:输出图像宽高

保存窗口图像(也可以在  可视化--保存窗口)
dump_window (window, 'postscript', 'halcon_dump')
窗口句柄,保存的格式,路径

预处理汇总

差分高斯  拆通道   灰度形态学   差分  频域   光度立体   灰度变换(线性  对数  指数) 图像增强    光照均匀   颜色模型转换    边缘图像
1、灰度形态学
灰度膨胀和闭运算----增加亮像素     闭运算增加亮像素的同时减少暗像素,效果更好
灰度腐蚀和开运算----增加暗像素     开运算增加暗像素的同时减少亮像素,效果更好

gray_dilation_shape (ImageScaleMax, ImageMax, 3, 3, 'octagon')    灰度膨胀
输入图像   输出图像    掩膜高    掩膜宽    形状
gray_dilation_rect (ImageScaleMax, ImageMax1, 3, 3)     灰度膨胀
输入图像   输出图像    掩膜高    掩膜宽 
gray_erosion_shape (ImageScaleMax, ImageMax, 3, 3, 'octagon')    灰度腐蚀
输入图像   输出图像    掩膜高    掩膜宽    形状
gray_erosion_rect (ImageScaleMax, ImageMax1, 3, 3)     灰度腐蚀
输入图像   输出图像    掩膜高    掩膜宽 
gray_closing_shape (ImageMax, ImageClosing, 5, 5, 'octagon')     灰度闭运算
gray_closing_rect (ImageClosing, ImageClosing1, 5, 5)     灰度闭运算
输入图像   输出图像    掩膜高    掩膜宽    形状
gray_opening_rect (ImageScaleMax, ImageOpening, 5, 5)      灰度开运算
gray_opening_shape (ImageScaleMax, ImageOpening1, 5, 5, 'octagon')    灰度开运算
输入图像   输出图像    掩膜高    掩膜宽    形状
2、差分高斯   
diff_of_gauss (Image, imageGauss, 3, 5)
输入图像   输出高斯图像(高斯图像要经过最大值归一化处理)   平滑系数   偏差值
3、图像算术运算
图像差分(缺陷图减去标准图得到缺陷)--特征区域抠出来再相减,避免背景干扰
sub_image (Image1, Image2, ImageSub, 1, 128)
图像1   图像2   减法得到的图像    乘1   加128

图像相乘(图像整体像素变大,黑白像素对比度拉开)
mult_image (Image, Image, ImageResult, 0.05, 0)
图像1   图像2   乘法得到的图像    乘0.05   加0

二、分割(二值化,形态学,特征选择)

图像阈值分隔汇总

二值化(可以使用灰度直方图选择阈值)
threshold(image, region, mingray, maxgray)  四个参数
image(输入):需要二值化的图像
region(输出):二值化后输出的图像变量名称
mingray:最小阈值
maxgray:最大阈值
二值化(适合黑白分明使用)自动全局阈值分割
binary_threshold(ImageScaled, Region, 'smooth_histo', 'light', UsedThreshold)
ImageScaled(输入):需要二值化的图像
Region(输出):二值化后输出的图像变量名称
'smooth_histo':算法(大津阈值法  平滑直方图)  'max_separability'    'smooth_histo'
'light':亮暗选择  (light --亮,dark--暗)
UsedThreshold:输出阈值
动态阈值---将原图和滤波平滑后的图对比
dyn_threshold (GrayImage, ImageMean, RegionDynThresh, 5, 'dark')
GrayImage(输入):输入图像1(原图)
ImageMean(输入):输入图像2(均值滤波图)
RegionDynThresh(输出):输出区域
5:偏移阈值
'dark':亮暗选择
标准偏差局部阈值分割--原图和对应像素掩膜覆盖的像素的平均,灰度值对比
var threshold (Image, Region, 4, 4, 0.2, 12, ‘dark’ )
输入图像,输出区域
掩膜大小  标准差因子   绝对阈值   亮暗选择
局部阈值--二值化小范围
local_threshold (Image, Region, 'adapted_std_deviation', 'light', [], [])  //适合光照不均的情况
输入图像  输出区域  算法  亮暗选择 
字符提取阈值--提取字符
char_threshold (Image, Region, Characters, 2, 95, Threshold)
输入图像  输出区域  输出字符   平滑系数   百分比(越大对暗字符要求越高) 输出阈值

分水领域法
把图像灰度值分成一块一块的区域,区域中心灰度值小,区域边缘灰度值大,区域边缘减去两边中心的最大灰度值之差小于设定阈值合并
用分水领域法分割图像后,再用灰度特征--熵(gray_entropy) 筛选区域  区域灰度值越杂乱熵越大
watersheds_threshold (ImageMedian, Basins1, 10)
输入图像,输出区域,分水岭的阈值

区域开运算(结构元素为圆)
区域腐蚀(结构元素为圆)

opening_circle (Region, RegionOpening, 5)  三个参数
erosion_circle (Region, RegionOpening, 5)  三个参数
Region(输入):输入区域
Regionopening(输出):输出形态学运算后的区域
5(输入):结构元素半径

区域膨胀(结构元素为圆)
dilation_circle (Region, RegionDilation, 7.5)
closing_circle(Region, RegionDilation, 7.5)
Region(输入):输入区域
Regionopening(输出):输出形态学运算后的区域
7.5(输入):结构元素半径

连通域断开(提取区域)
connection(region,connectdregion)  两个参数
region(输入):输入一个区域
connectdregion(输出):输出多个区域

区域联通
union1 (RegionDilation, RegionUnion)
RegionDilation(输入):输入的区域数组
RegionUnion(输出)输出的区域

区域特征选择(区域过滤)(可以使用特征直方图)
select_shape(regions, selectdregions, features, operation, min, max)  六个参数
regions(输入):输入图像变量数组
selectdregions(输出):输出图像变量数组
features:特征名称
operation:逻辑关系
min:最小特征值
max:最大特征值

特征选择(选择区域面积最大的)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
ConnectedRegions(输入):输入图像变量数组
SelectedRegions(输出):输出图像变量
'max_area':特征选择
70:像素值

区域排序
sort_region(regions, SortedRegions, 'first_point', 'true', 'column')
regions(输入):输入区域  
SortedRegions(输出):输出排序后的区域
'first_point':参考点  (character:(常用的))
'true':递增/递减  
'column':行列

区域方向
orientation_region (RegionTrans, Phi)
输入区域
输出角度(弧度)
区域转正搭配使用
orientation_region (RegionDilation, Phi)
if (abs(Phi)<rda(90))
    *转为0°
    vector_angle_to_rigid (Row, Column, Phi, Row, Column, 0, HomMat2D)
else
    *转为180°
    vector_angle_to_rigid (Row, Column, Phi, Row, Column, rad(180), HomMat2D)
endif

三、计算、显示

求区域最小外接圆
smallest_circle (SortedRegions, Row, Column, Radius)
SortedRegions(输入):输入区域  
Row(输出):圆心行坐标
Column(输出):圆心列坐标
Radius(输出): 圆的半径

求区域最小外接矩形
smallest_rectangle2 (SelectedRegions, RowRef, ColumnRef, PhiRef, Length1, Length2)
SelectedRegions(输入):输入区域
RowRef(输出): 输出矩形的中心行坐标
ColumnRef(输出): 输出矩形的中心列坐标 
PhiRef(输出):输出矩形的角度  
Length1(输出):输出矩形的半宽
Length2(输出):输出矩形的半高

求区域的重心行列坐标和面积(可以求图片)
area_center (Region, Area, Row, Column)
Region(输入):输入区域
Area: 输出区域的面积
Row: 输出区域的重心行坐标
Column: 输出区域的重心列坐标

求区域的角度-弧度
找到区域的最小外接椭圆,水平轴与椭圆的主轴的夹角就是区域的角度
注:主轴方向指向椭圆尖锐的一端,水平轴与主轴正方向的夹角
orientation_region (Region, Phi)
Region(输入):输入区域
Phi(输出):输出角度(单位弧度(rad))

Phideg:=deg(Rad)            将弧度转度
Phirad:=rad(Phideg)         将度转弧度

在图片显示文本
disp_message(WindowHandle,string,'image',Row, Column,'color','box')
WindowHandle(输入):输入窗口句柄
string(输入):显示的文本
'image'(输入):坐标系选择(一般选图片坐标系)
Row(输入):文本左上角的行坐标
Column(输入):文本左上角的列坐标
'color'(输入):文本颜色  
'box'(输入): 文本背景颜色(一般为false)

四、页面设置算子

窗体算子
dev_get_window (WindowHandle)    获得窗口的句柄
dev_open_window ()    打开窗口  
dev_close_window ()    关闭窗口 
dev_clear_window ()     清除窗口 

取消更新(函数->管理函数->运行时设置,取消三个更新设置)
dev_update_off ()

全局设置字体
set_display_font(WindowHandle, size, 'font', 'true', 'false')
WindowHandle(输入):输入窗体句柄  
size:字体大小
'font':字体的类型
'true'是否采用粗体字  
'false'是否采用斜体字

设置边缘
dev_set_draw('margin')

设置线宽
dev_set_line_width(3)

统计当前时刻(单位:秒)
 count_seconds (Seconds1)
 count_seconds (Seconds2)
time:=Seconds1-Seconds2  (秒)
time:=Seconds1-Seconds2*1000  (毫秒)

计算两条线交点
intersection_lines (Row, Column, Row, Column, Row, Column, Row, Column, Row1, Column1, IsOverlapping)
第一条线起始行列坐标
第二条线起始行列坐标
输出交点行列坐标  两条线是否平行

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值