1、Blob分析
计算机视觉中的Blob是指图像中的一块连通区域,Blob分析就是对前景/背景分离后的二值图像,进行连通域提取和标记。标记完成的每一个Blob都代表一个前景目标,然后就可以计算Blob的一些相关特征。其优点在于通过Blob提取,可以获得相关区域的信息,但是速度较慢,分析难度大。Blob分析就是对这一块连通区域进行几何分析得到一些重要的几何特征,例如:区域的面积、中心点坐标、质心坐标、最小外接矩形、主轴等。
Blob分析的一般步骤:
a图像分割:分离出前景和背景
b连通性分析:根据目标的连通性对目标区域进行标记,或者叫拓扑性分析
c特征量计算:描述了区域的几何特征,这些几何特征不依赖与灰度值
以Halcon为例,来看一个很简单的例子:
read_image (Image, 'printer_chip/printer_chip_01')
threshold (Image, Region, 128, 255)
connection (Region, ConnectedRegions)
area_center (ConnectedRegions, Area, Row, Column)
1.图像分割
将图像分离为目标像素和背景像素,初始分割之后一般需要进行形态学处理才能满足使用要求。常用分割方法:直接输入;硬阈值分割;软阈值分割。常用形态学处理包括:连通、膨胀、腐蚀、开操作、闭操作、顶帽变换、击中与不击中变换、交集、差异、骨架、边界等。
阈值分割又包括:
(1)简单阈值分割threshold
适用范围:目标与背景之间存在灰度差(如果环境稳定,阈值可以在离线状态下一次确定)
(2)动态阈值分割dyn_threshold
适用范围:背景不均一无法确定全局阈值、目标经常表现为比背景局部亮一些或者暗一些。这时候需要通过其领域来找到一个合适的阈值进行分割。确定其领域的方法是:通过一些平滑滤波算子来确定领域,例如mean_image或者binomial_filter
(3)自动全局阈值方法bin_threshold
(4)watersheds_threshold
2.特征量计算常用
area_center,区域面积Area和中心(Row,Column)
area_center_gray,区域面积Area和灰度中心(Row,Column)
smallest_rectangle1最小外接矩形
smallest_rectangle2最小外接仿射矩形,
compactness,紧凑度
elliptic_axis,计算region区域中的椭圆参数
intensity,计算region区域的灰度平均值和偏差
min_max_gray,最小最大灰度值
2、纹理分析(Texture Analysis)
2.1先看看基础知识
纹理是对图象的象素灰度级在空间上的分布模式的描述,反映物品的质地,如粗糙度、光滑性、颗粒度、随机性和规范性等。当图象中大量出现同样的或差不多的基本图象元素(模式)时,纹理分析是研究这类图象的最重要的手段之一。
纹理分析方法按其性质而言,可分为4大类:统计分析方法、结构分析方法、信号处理(频谱分析)方法和模型方法。
纹理特征反映了物体本身的属性,有助于将两种不同的物体(或者两幅图像)区别开来。
纹理是图像像素点灰度级或颜色的某种变化,反复出现纹理基元和它的排列规则,而且这种变化是空间统计相关的。构成纹理特征的两个要素:
a.纹理基元:由一定的形状和大小多种图像基元的组合叫纹理基元。
b.纹理是由纹理基元排列组合而成的。基元排列的疏密,周期性,方向性等的不同,能使图像的外观产生极大地改变。
纹理分析的目的:指通过一定的图像处理技术提取出纹理特征参数,从而获得纹理的定量或定性描述的处理过程。
纹理分析:
检测出纹理基元;获得有关基元排列分布方式的信息
指通过一定的图像处理技术抽取出纹理特征,获得纹理的定量或定性描述的处理过程。它首先从像素出发,检测出纹理基元,并找到纹理基元排列的信息,建立纹理基元模型。
纹理分析方法:
常用的纹理特征提取方法一般分为四大类:
a.基于统计的方法:灰度共生矩阵、灰度行程统计、灰度差分统计、局部灰度统计、半方差图、自相关函数等
优点:方法简单,易于实现。
缺点:无法利用全局信息,与人类视觉模型不匹配;计算复杂度较高,计算耗时。
较为经典的算法为灰度共生矩阵方法,其通过统计不同灰度值对的共现频率得到灰度共生矩阵,基于矩阵可计算出14种统计量:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。灰度梯度共生矩阵将图梯度信息加入到灰度共生矩阵中,综合利用图像的灰度与梯度信息,效果更好。图像的梯度信息一般通过梯度算子(也称边缘检测算子)提取,如sobel、canny、reborts等。
b.基于模型的方法:同步自回归模型、马尔可夫模型、吉布斯模型、滑动平均模型、复杂网络模型等
c.基于结构的方法:句法纹理分析、数学形态学法、Laws纹理测量、特征滤波器等
d.基于信号处理的方法:Radon变换、离散余弦变换、局部傅里叶变化、Gabor变换、二进制小波变换、树形小波分解等
2.2再看看Halcon的介绍
纹理分析的第一种典型应用是利用纹理滤波器对图像进行滤波处理,以增强(enhance)或抑制(suppress)特定的纹理。滤波后的图像通过blob analysis或者分类算法,将具有相同纹理的部分分割为同一区域(region)。texture_laws是Halcon中纹理分析的重要算子,其本质原理是利用不同的kernel与图像进行卷积运算,提取出图像的高频部分或低频部分。纹理(texture)由纹理单元(texel)组成,纹理单元是纹理图像中最小的重复单元,texel是纹理的基本单元。
texture_laws(Image : ImageTexture : FilterTypes, Shift, FilterSize : )
参数说明:
参数一Image:原始图像
参数二ImageTexture:输出图像,即laws纹理滤波结果
参数三FilterTypes:过滤器类型
参数四Shift:灰度值转换,滤波后的灰度值可能比较大,转换后的灰度值Gray=Gray/(Shift),要根据滤波器选择合适的灰度值转换
参数五FilterSize:过滤器大小,3、5、7可选
过滤器都是由l e s r w o这几个相邻构成,halcon帮助文档中单个向量都有原型,对于组合出来的滤波器矩阵,就是两个向量的点积。
The names of the filters are mnemonics for “level,” “edge,” “spot,” “wave,” “ripple,” “undulation,” and “oscillation.”
滤波器类型由滤波向量(vector)的两个字母组成,第一个字母表示在列方向的滤波器向量,第二个字母表示在行方向的滤波器向量。
第二种典型应用是计算图像的纹理特征用于图像的分类,纹理滤波器作为预处理滤波器来增强(enhance)或抑制(suppress)特定的纹理。Halcon中标准的纹理特征(feature)算子是gen_cooc_matrix(生成共生矩阵),另一个常用的算子是entropy_gray(灰度熵,用于计算图像的平均信息量(entropy)和各向异性(anisotropy))。
以3x3的滤波器矩阵为例:
l = [ 1 2 1 ],
e = [ -1 0 1 ],
s = [ -1 2 -1 ]
滤波向量l增强滤波方向的图像的亮度。滤波向量e检测了滤波方向上的突变(即边缘,高频区域)。滤波向量s同样检测了滤波方向上的突变(与滤波向量e检测方法不一样)。滤波后图像很容易溢出(这不是个准确说法,实际意义是对于byte类型的图像,灰度值超过了255),因此需设置合适的shaft值缩放灰度值。
一般来说,可以选择滤波向量中的 "l", "e", "s", "r", "w", "o"与滤波向量"l"组合来增强图像的低频部分,或者与滤波向量"o"组合来增强图像的高频部分。
滤波器类型的第二个字母"l", "e", "s", "r", "w", "o"依次检测图像低频部分到高频部分。例如,滤波器"le"检测图像 中相对低频的部分,而滤波器"ls"检测图像中相对高频的部分。
2.3举例说明
举例1:请参见Halcon的案例,cooc_feature_image.hdev
* Calculate a co-occurrence matrix and derive gray value features thereof * read_image (Image, 'mreut') get_image_size (Image, Width, Height) dev_close_window () dev_open_window (0, 0, Width, Height, 'black', WindowID) dev_display (Image) dev_set_draw ('margin') * Create a rectangle parallel to the coordinate axes gen_rectangle1 (Rectangle1, 350, 100, 450, 200) gen_rectangle1 (Rectangle2, 100, 200, 200, 300) cooc_feature_image (Rectangle1, Image, 6, 0, Energy1, Correlation1, Homogenity1, Contrast1) cooc_feature_image (Rectangle2, Image, 6, 0, Energy2, Correlation2, Homogenity2, Contrast2)
举例2:请参见Halcon的案例,texture.hdev
这个例子是主要讲解了histo_2dim 、class_2dim_sup 搭配使用灰度直方图进行图像分割。
* Find textured areas (trees and bushes) * dev_close_window () Interactive := 0 dev_close_window () read_image (MreutHill, 'mreut_y') get_image_size (MreutHill, Width, Height) dev_open_window (0, 0, Width, Height, 'black', WindowHandle) * Filter an image using a Laws texture filter 使用Laws纹理过滤器过滤图像 texture_laws (MreutHill, SS, 'ss', 0, 5) texture_laws (MreutHill, EE, 'ee', 2, 5) * Separated median filtering with rectangular masks 使用矩形掩膜进行中值滤波 median_separate (SS, SSMed, 25, 25, 'mirrored') median_separate (EE, EEMed, 25, 25, 'mirrored') dev_display (MreutHill) if (Interactive) draw_region (TestReg, WindowHandle) else gen_rectangle1 (TestReg, 376, 221, 466, 246) endif * Calculate the histogram of two-channel gray value images 计算双维度灰度值图像的直方图 histo_2dim (TestReg, SSMed, EEMed, Histo2Dim) threshold (Histo2Dim, RegionFeat, 3, 1000000) fill_up (RegionFeat, RegionFillUpFeat) opening_circle (RegionFillUpFeat, FeatOpen, 1.5) dilation_circle (FeatOpen, FeatureSpace, 1.5) * Segment an image 使用二维像素分类对图像进行分割 class_2dim_sup (SSMed, EEMed, FeatureSpace, RegionClass) opening_circle (RegionClass, ResultClass2, 3.5) dev_set_color ('red') dev_set_draw ('margin') dev_display (MreutHill) dev_display (ResultClass2) disp_continue_message (WindowHandle, 'black', 'true') stop () * Continue to view textured areas threshold (SSMed, RegionThre, 35, 255) connection (RegionThre, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150.000000, 99999.000000) closing_circle (SelectedRegions, ResultClass1, 3.5) dev_display (MreutHill) dev_display (ResultClass1)
举例3:详情请参见书籍《Halcon机器视觉算法原理与编程实战》,9.3.5 提取图像的纹理特征,gen_cooc_matrix共生矩阵
dev_close_window () *读取输入的图片 read_image (Image, 'data/board') *将输入的彩色图像转为黑白图像 rgb1_to_gray (Image, GrayImage) get_image_size (GrayImage, Width, Height) *创建一个与输入图像同样大小的窗口 dev_open_window (0, 0, Width/4, Height/4, 'black', WindowID) *设定画笔宽度 dev_set_line_width (5) *创建两个窗口用于显示参数计算的结果 dev_open_window (0, 512, 320, 320, 'black', WindowID1) dev_open_window (512, 512, 320, 320, 'black', WindowID2) *分别设置两个矩阵,选择不同的两部分区域 gen_rectangle1 (Rectangle1, 200,10, 380, 190) gen_rectangle1 (Rectangle2, 580, 650, 730, 800) *分别对两个矩形求取灰度共生矩阵Matrix1和Matrix2 gen_cooc_matrix (Rectangle1, GrayImage, Matrix1, 6, 0) gen_cooc_matrix (Rectangle2, GrayImage, Matrix2, 6, 0) *分别对Matrix1和Matrix2提取灰度特征参数 cooc_feature_matrix (Matrix1, Energy1, Correlation1, Homogeneity1, Contrast1) cooc_feature_matrix (Matrix2, Energy2, Correlation2, Homogeneity2, Contrast2) *采取另一种方式,直接对矩阵2的图像求灰度特征参数,结果与上面两步计算出的参数是一致的 cooc_feature_image (Rectangle2, GrayImage, 6, 0, Energy3, Correlation3, Homogeneity3, Contrast3) *显示图像窗口和两个矩形的灰度共生矩阵 dev_set_window (WindowID) dev_set_draw ('margin') dev_display (GrayImage) dev_display (Rectangle1) dev_set_color('yellow') dev_display (Rectangle2) dev_set_window (WindowID1) dev_display (Matrix1) *以字符串的形式,分别在两个矩阵的对应窗口上显示灰度特征值的计算结果 String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: '] dev_set_color('red') disp_message (WindowID1, String$'-14s' + [Energy1,Correlation1,Homogeneity1,Contrast1]$'6.3f', 'window', 12, 12, 'white', 'false') dev_set_window (WindowID2) dev_display (Matrix2) dev_set_color('yellow') String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: '] disp_message (WindowID2, String$'-14s' + [Energy2,Correlation2,Homogeneity2,Contrast2]$'6.3f', 'window', 12, 12, 'white', 'false')
举例4:详情参见我发的帖子http://www.ihalcon.com/read-14263-1.html
read_image (Image, '') *ROI gen_rectangle1 (Rectangle, 482.313, 458.083, 847.963, 1001.78) reduce_domain (Image, Rectangle, ImageReduced) crop_domain (ImageReduced, ImagePart) *使用Laws纹理过滤器过滤图像 texture_laws(ImagePart, ImageTexture, 'el', 3, 5) *计算灰度值的平均值和偏差 intensity(ImageTexture, ImageTexture, Mean, Deviation)
-------参考文献------
https://github.com/WONQIAN/texture-analysis
数字图像处理,图像的纹理分析 依托纹理特征进行分割分类 纹理合成 统计纹理分析 频谱分析法 结构纹理分析