var_threshold(Image : Region : MaskWidth, MaskHeight, StdDevScale, AbsThreshold, LightDark : )
使用var_threshold,可以选择输入图像Image 的像素。
这些像素可以
具有较高的局部标准差(对于正StdDevScale),
或较低的局部标准差(对于负StdDevScale)
局部是亮的还是暗的,根据LightDark。
因此,在不均匀的、有噪声的或照明不均匀的背景上分割区域是可能的。
参数:
MaskWidth, MaskHeight
由MaskWidth和MaskHeight定义的过滤掩码的大小决定要分割的对象的最大大小。
但是,如果蒙版选择太大,则可能合并非常接近的对象。
(1)原始图像;我们的目标是计算垂直线。
(2) MaskWidth:= 12, MaskHeight:= 12, StdDevScale:= 0.1,所有垂直线分割正确。
(3)如果选择的掩模尺寸过小(3),则未正确选择所需区域。
(4)如果掩码过大(40),则会合并非常接近的对象。
如果MaskWidth或MaskHeight为偶数,则使用下一个较大的奇数值。
总的来说,值3可以被认为是最小的可感知值。
StdDevScale
局部标准差用于测量图像中的噪声。
它可以通过StdDevScale缩放来反映所需的灵敏度。
较高的值意味着只选择与其周围环境非常不同的像素。
对于参数StdDevScale, -1.0和1.0之间的值是合理的选择,建议使用0.2。
如果参数过高或过低,则可能返回空区域或满区域。
(1)如果StdDevScale过高(1.3),则函数比较挑剔;只选择与周围环境非常相似的像素。
(2)如果StdDevScale过低(-0.3),则会错误地选择太多与其周围环境有点相似的像素。
AbsThreshold
在图像的均匀区域,标准差较低;
因此,单灰度值的影响较大。
为了降低算子在均匀区域的灵敏度,可以通过调整虚阈值来实现。
因此,均匀环境下的小灰度值变化可以忽略不计。
注意,对于StdDevScale的负值,也应该选择AbsThreshold为负值。
LightDark
“light”或“dark”分别返回比周围环境亮或暗的所有像素。
“equal”返回两个选项都没有选择的所有像素,即相对与其周围环境相等的像素。
'not_equal'返回'light'和'dark'的组合结果,即,所有与周围环境不同的像素。
(1)初始图像。
(2)阈值化图像(StdDevScale:= 0.6, MaskWidth:= 15, MaskHeight:= 15, AbsThreshold:= 10)。
上面的图片展示了沿着蓝色箭头的结果是如何形成的。
var_threshold从输入图像中选择像素满足阈值条件的区域。
阈值由每个像素(x,y)周围的局部掩码大小为MaskWidth*MaskHeight的均值灰度值和标准差计算得到。
例程:
* 读取“label”目录中的所有图像,并选择所有以“label_”结尾的,加三个任意字符,加字符串“png”的图像文件。
list_image_files ('label', 'default', [], ImageFiles)
ImageFiles1 := regexp_select(ImageFiles,'label_...png$')
read_image (Image, ImageFiles1[0])
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window_fit_size (0, 0, Width, Height, -1, -1, WindowHandle)
for Index := 0 to |ImageFiles1| - 1 by 1
read_image (Image, ImageFiles1[Index])
var_threshold (Image, Region, 15, 15, 1.01, 40, 'dark')
connection (Region, ConnectedRegions)
*选择高和面积在一定范围内的区域并显示
select_shape (ConnectedRegions, SelectedRegions, ['height','area'], 'and', [20,100], [100,400])
dev_display (Image)
dev_display (SelectedRegions)
stop ()
endfor
|