举例Halcon,简述数字图像处理之Blob分析和纹理分析texture_laws

简介: 举例Halcon,简述数字图像处理之Blob分析和纹理分析texture_laws

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


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


相关文章
|
11月前
|
数据挖掘 计算机视觉 Python
Python数据分析中图像处理的实用技术点:图像加载与保存、图像转换与增强、特征提取与描述
Python数据分析中图像处理的实用技术点:图像加载与保存、图像转换与增强、特征提取与描述
92 1
Python数据分析中图像处理的实用技术点:图像加载与保存、图像转换与增强、特征提取与描述
|
5月前
|
编解码 并行计算 算法
MPI分形图像高精度绘制程序和PC端Mandelbrot-Julia分形集预览程序
这篇文章描述了一个使用2010年技术的集群程序,该程序基于Linux + MPI + C++或Windows + .NET + C#,用于并行计算生成高分辨率BMP图像,特别是Mandelbrot和Julia集。在8台节点上,程序实现了7.31的稳定加速比,并在更大规模任务中有望提升。它支持MPI并行计算、任务日志、不同阶数的分形集生成、批处理、多线程以及优化的颜色处理等功能。创新点包括颜色表的正弦控制、动态调整运算精度、复杂颜色生成、优化的颜色更新和并发机制等。程序产生的图像样本显示了其多样性和质量。作者提供源代码,并提到设计思路可应用于类似图像生成任务。
|
1月前
|
Serverless 计算机视觉
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
这篇文章介绍了如何使用OpenCV库通过mask图像绘制分割对象的外接椭圆。首先,需要加载mask图像,然后使用`cv2.findContours()`寻找轮廓,接着用`cv2.fitEllipse()`拟合外接椭圆,最后用`cv2.ellipse()`绘制椭圆。文章提供了详细的代码示例,展示了从读取图像到显示结果的完整过程。
53 0
语义分割笔记(三):通过opencv对mask图片来画分割对象的外接椭圆
|
3月前
|
存储 前端开发 定位技术
osgEarth使用笔记4——加载矢量数据
osgEarth使用笔记4——加载矢量数据
119 0
|
6月前
GEE——Google dynamic world中在影像导出过程中无法完全导出较大面积影像的解决方案(投影的转换)EPSG:32630和EPSG:4326的区别
GEE——Google dynamic world中在影像导出过程中无法完全导出较大面积影像的解决方案(投影的转换)EPSG:32630和EPSG:4326的区别
128 0
|
6月前
Halcon 学习笔记二:简单blob分析
Halcon 学习笔记二:简单blob分析
241 0
|
6月前
|
计算机视觉
OpenCV(十一):图像仿射变换
OpenCV(十一):图像仿射变换
118 0
|
计算机视觉 C++
【OpenCV • c++】基础图像的绘制
【OpenCV • c++】基础图像的绘制
180 1
|
传感器 编解码 监控
Baumer工业相机堡盟相机如何使用Binning像素合并功能( Binning像素合并功能的优点和行业应用)(C++)(C#)
Baumer工业相机堡盟相机如何使用Binning像素合并功能( Binning像素合并功能的优点和行业应用)(C++)(C#)
250 0
|
文字识别 监控 算法
Baumer工业相机堡盟相机使用BGAPISDK联合Halcon直接进行彩色图像显示(Color)(C#)(将图像数据Buffer转为HObject)
Baumer工业相机堡盟相机使用BGAPISDK联合Halcon直接进行彩色图像显示(Color)(C#)(将图像数据Buffer转为HObject)
157 0
下一篇
无影云桌面