halcon的纹理分析texture_laws

在谈纹理分析之前,先谈谈blog分析。

在halcon中,blog分析是最基础的图像处理方法。


计算机视觉中的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,最小最大灰度值


blog的方法一般很难应用于纹理分析。因为纹理往往意味着连通区域不明显。


纹理分析(Texture Analysis)

1先看看基础知识

纹理是对图象的象素灰度级在空间上的分布模式的描述,反映物品的质地,如粗糙度、光滑性、颗粒度、随机性和规范性等。当图象中大量出现同样的或差不多的基本图象元素(模式)时,纹理分析是研究这类图象的最重要的手段之一。

纹理分析方法按其性质而言,可分为4大类:统计分析方法、结构分析方法、信号处理(频谱分析)方法和模型方法。

纹理特征反映了物体本身的属性,有助于将两种不同的物体(或者两幅图像)区别开来。
纹理是图像像素点灰度级或颜色的某种变化,反复出现纹理基元和它的排列规则,而且这种变化是空间统计相关的。构成纹理特征的两个要素:
a.纹理基元:由一定的形状和大小多种图像基元的组合叫纹理基元。
b.纹理是由纹理基元排列组合而成的。基元排列的疏密,周期性,方向性等的不同,能使图像的外观产生极大地改变。

纹理分析的目的:指通过一定的图像处理技术提取出纹理特征参数,从而获得纹理的定量或定性描述的处理过程。
纹理分析:
检测出纹理基元;获得有关基元排列分布方式的信息
指通过一定的图像处理技术抽取出纹理特征,获得纹理的定量或定性描述的处理过程。它首先从像素出发,检测出纹理基元,并找到纹理基元排列的信息,建立纹理基元模型。
纹理分析方法:
常用的纹理特征提取方法一般分为四大类:
a.基于统计的方法:灰度共生矩阵、灰度行程统计、灰度差分统计、局部灰度统计、半方差图、自相关函数等
优点:方法简单,易于实现。
缺点:无法利用全局信息,与人类视觉模型不匹配;计算复杂度较高,计算耗时。
较为经典的算法为灰度共生矩阵方法,其通过统计不同灰度值对的共现频率得到灰度共生矩阵,基于矩阵可计算出14种统计量:能量、熵、对比度、均匀性、相关性、方差、和平均、和方差、和熵、差方差、差平均、差熵、相关信息测度以及最大相关系数。灰度梯度共生矩阵将图梯度信息加入到灰度共生矩阵中,综合利用图像的灰度与梯度信息,效果更好。图像的梯度信息一般通过梯度算子(也称边缘检测算子)提取,如sobel、canny、reborts等。
b.基于模型的方法:同步自回归模型、马尔可夫模型、吉布斯模型、滑动平均模型、复杂网络模型等
c.基于结构的方法:句法纹理分析、数学形态学法、Laws纹理测量、特征滤波器等
d.基于信号处理的方法:Radon变换、离散余弦变换、局部傅里叶变化、Gabor变换、二进制小波变换、树形小波分解等

image.png

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:

光滑1

光滑2

光滑3

粗糙1

粗糙2


粗糙3


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

数字图像处理,图像的纹理分析 依托纹理特征进行分割分类 纹理合成 统计纹理分析 频谱分析法 结构纹理分析


本文转载自《https://blog.csdn.net/libaineu2004/article/details/104908287》


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年4月    »
1234567
891011121314
15161718192021
22232425262728
2930
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864