30.2、Blob---分割图像
1、histo_to_thresh( : : Histogramm, Sigma : MinThresh, MaxThresh)
功能:根据灰度直方图的统计信息和平滑参数Sigma确定分割阈值。
注:使用前必须用gray_histo(Regions, Image : : : AbsoluteHisto, RelativeHisto)算子统计图像的灰度直方图信息。
2、threshold(Image : Region : MinGray, MaxGray : )
功能:根据输入的分割阈值MinGray, MaxGray分割图像。
例子:
read_image (Image, 'clip')
*统计图像灰度直方图信息
gray_histo (Image, Image, AbsoluteHisto, RelativeHisto)
*根据灰度直方图的统计信息和平滑参数Sigma确定分割阈值
histo_to_thresh (RelativeHisto, 10, MinThresh, MaxThresh)
*确定目标阈值在分割阈值的那个区间
TargetGray:=23
MinGray:=0
MaxGray:=255
count:=|MinThresh|
for Index := 0 to count-1 by 1
if(TargetGray>=MinThresh[Index] and TargetGray<=MaxThresh[Index])
MinGray:=MinThresh[Index]
MaxGray:=MaxThresh[Index]
break
endif
endfor
*分割目标阈值所在的区间
threshold (Image, Region, MinGray, MaxGray)
3、auto_threshold(Image : Regions : Sigma : )
功能:根据图像直方图平滑参数Sigma确定的阈值分割图像
详细看《5、图像分割(阈值)》
例子:
read_image (Image, 'clip')
auto_threshold (Image, Regions, 10)
select_obj (Regions, ObjectSelected, 1)
注:与2中的例子等效
4、bin_threshold(Image : Region : : )
功能:使用自动全局阈值分割图像,它适用于目标物体和背景之间存在明显灰度差的场合。
简单内部原理:首先自动计算灰度直方图的信息,从直方图中提取相关最小值,为了减少最小值的数量,使用高
斯平滑对直方图进行平滑,掩膜尺寸逐渐增大,直到平滑后的直方图只有一个最小值,即一个波谷两个波峰。灰度值在0到最小值之间的像素构成输出区域。
注:这个算子提取的目标物体为较黑(灰度值低)的物体,若想提取较亮(灰度值大)的物体,可以用
invert_image(Image : ImageInvert : : )算子进行反转图像
5、dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : )
功能:动态阈值分割,使用局部阈值分割图像,对于一些应用来说,确定一个全局阈值是不可能的,比如因为
没有通用的参考图像来确定阴影校正
图像的背景是非均匀的
物体在局部范围内通常比背景亮一些或者黑一些
这些情况下,寻找一个固定的阈值来区分物体和背景是不太容易的。
参数:
OrigImage:输入原图像
ThresholdImage:输入包含局部阈值的阈值图像
RegionDynThresh:输出区域region
Offset:用于ThresholdImage图像的Offset,Offset可以理解为OrigImage和ThresholdImage的灰度值对比程度。
LightDark:提取区域region的条件模式
描述:
dyn_threshold根据像素所满足的阈值条件来分割图像,假设g_o表示原始图像OrigImage的像素,g_t表示阈值图
像ThresholdImage的像素。
当LightDark='light' 时
g_o>=g_t + Offset
当LightDark= 'dark' 时
g_o <= g_t - Offset
当LightDark= 'equal' 时
g_t - Offset <= g_o <= g_t + Offset
当LightDark= 'not_equal' 时
g_o< g_t - Offset 或g_o > g_t + Offset
- 满足以上条件的像素则作为结果输出。通常情况下,ThresholdImage图像是OrigImage图像进行滤波后得到的图像,可以使用mean_image,binomial_filter,gauss_image,median_image等算子来进行滤波。接着,dyn_threshold效果类似于对高通滤波后的图像(该图像可由原始图像OrigImage使用highpass_image进行高通滤波得到)使用threshold算子进行阈值分割。
⑵、使用dyn_threshold,可以提取对象的轮廓。提取对象大小(直径)是有低通滤波器的掩膜大小和对象的边缘
幅度来确定的:选择的掩膜尺寸越大,找到的区域就越大。作为一个经验法则:掩膜尺寸应该大于要提取对象的直径(下面的测试例子中的字体直径为它的笔画宽度)的两倍。不要把参数Offset设置为0,一旦设置为0,会找到很多小区域,这些小区域是是噪声。Offset的值在5到40之间是有效的选择。选择的值越大,提取的区域越小。
⑶、如果把Offset设置为-1到1之间,那么会产生很多噪声区域,浪费大量的内存空间。如果Offset太大(大于
60)可能会导致没有像素点满足阈值调节(即产生一个空区域)。如果Offset太小(小于-60),可能会导致所有像素点都满足阈值调节(即产生一个全幅和图像大小一个的区域)。
例子1:
read_image (Image, 'alpha1')
*由上面原理可知道,掩膜尺寸为提取对象的直径(字体笔画宽度)两倍,而笔画宽度为3~5个像素,所以掩膜尺寸至少从11开始逐渐增大,直到合适为止
mean_image (Image, ImageMean, 11, 11)
*由于是要分离出黑色字体,所以选择'dark'模式;把参数Offset从小调大,调节到合适为止。
dyn_threshold (Image, ImageMean, RegionDynThresh,15, 'dark')
*也可以用中值滤波,它的半径为10
median_image (Image, ImageMedian, 'circle', 10, 'mirrored')
dyn_threshold (Image, ImageMedian, RegionDynThresh1, 15, 'dark')
例子2:
read_image (Img3145, 'C:/dyn_threshold.JPG')
rgb1_to_gray (Img3145, GrayImage)
mean_image (Img3145, ImageMean1, 21, 21)
dyn_threshold (Img3145, ImageMean1, RegionDynThresh1,8, 'dark')
connection (RegionDynThresh1, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 8662.35, 20000)
fill_up (SelectedRegions1, RegionFillUp)
6、var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )
功能:使用局部均值和标准偏差分析分割图像,适用于背景不均匀非线性变化。
参数:
Image:输入图像
Region:分割后输出的区域
MaskWidth:输入掩膜的宽度
MaskHeight:输入掩膜的噶度
StdDevScale:输入灰度值标准差的缩放系数
AbsThreshold:输入阈值
AbsThreshold:输入条件模式
(1)、var_threshold根据像素所满足的阈值条件来分割图像。阈值通过平均灰度值和标准偏差计算,平均灰度值和
标准偏差根据已像素(x,y)为中心的局部窗口(尺寸为MaskWide * MaskHeight)内的灰度值计算。如果MaskWidth或MaskHeight是偶数,那么使用最近的、比其大的技术。掩膜大小应该比要分割的图像特征要打,它应包含至少三个像素
(2)、设g(x,y)是像素点(x,y)在Image图像的灰度值,m(x,y)和d(x,y)是相应的均值和标准差。
当StdDevScale>=0时候
V(x,y) = max(StdDevScale * d(x,y),AbsThreshold )
当StdDevScale<0时候
V(x,y) = min(StdDevScale * d(x,y),AbsThreshold )
即:
AbsThreshold当为正值时,如果StdDevScale * d(x,y)小于AbsThreshold,则起作用的是StdDevScale * d(x,y);当AbsThreshold为负值时,如果StdDevScale * d(x,y)大于AbsThreshold,则起作用的是AbsThreshold。
(3)、标准差是用来衡量图像中的噪声,通过StdDevScale与标准差的乘积来反映期望的灵敏度。通过参数LightDark
来确定阈值分割条件:
当LightDark='light' 时
g(x,y)>= m(x,y)+ V(x,y)
当LightDark= 'dark' 时
g(x,y)<= m(x,y)- V(x,y)
当LightDark= 'equal' 时
m(x,y)- V(x,y)<= g(x,y) <= m(x,y)+ V(x,y)
当LightDark= 'not_equal' 时
m(x,y) - v(x,y) > g(x,y) or g(x,y) < m(x,y) + v(x,y).
(4)、所有满足上述条件的像素点作为结果区域输出region
参数StdDevScale值在-1和1之间是明智的选择,StdDevScale以0.2为建议值(默认值),如果参数太小会产生一个空区域或盲区域(和图像区域一样大小)。参数AbsThreshold是除StdDevScale * d(x,y)外另一个起作用的阈值参数。
(5)、先把图像分块,求没小块的均值方差,根据均值方差分割图像
(6)、var_threshold算子具有以下特征:
较好的分开目标和背景
对不合适的参数设置不敏感
只是用单个算子就能实现,编程容易实现
相比dyn_threshold,需要更长的执行时间
*获取图像
open_framegrabber ('File', 1, 1, 0, 0, 0, 0, 'default', -1, 'default', -1, 'default', 'label/label', 'default', -1, 1, FGHandle)
grab_image (Image, FGHandle)
*阈值分割
var_threshold (Image, Region, 15, 20, 1.0, 40, 'dark')
注:由于背景中的方格在分块并求均值方差过程中,由于它的均值恒定,方差波动较小。所以过滤掉。
7、fast_threshold(Image : Region : MinGray, MaxGray, MinSize : )
功能:使用全局阈值快速分割图像
MinSize:提取对象的最小尺寸
原理:假设g为与原像素点的灰度值:
第一步:先处理(满足MinGray <= g <= MaxGray,则输出区域)在行、列方向间隔为MinSize的所有像素点。
第二步:处理上(满足MinGray <= g <= MaxGray,则输出区域)一步选择的点的领域(MinSize*MinSize)
在10版本的halcon上,fast_threshold的处理速度比threshold的处理速度还要低。不建议使用。
具体例程参考:fast_threshold.hdev
8、分水岭法分割图像暂时不需掌握,属于高级应用。详细参考《halcon工业应用》P372