一 OTSU
OTSU,是一种自适应阈值确定的方法,又叫大津法,简称OTSU,是一种基于全局的二值化算法,它是根据图像的灰度特性,将图像分为前景和背景两个部分。当取最佳阈值时,两部分之间的差别应该是最大的,在OTSU算法中所采用的衡量差别的标准就是较为常见的最大类间方差。前景和背景之间的类间方差如果越大,就说明构成图像的两个部分之间的差别越大;
记T为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1,图像的总平均灰度为u,前景和背景图象的方差,则有:
*****************************************************************************第一 图像预处理********************************************************
*读取一张图像
read_image(Image,'1.bmp')
*对图像的灰度值在0到255范围内拉伸
scale_image_max (Image, ImageScaleMax)
*反选像素的位
bit_not (ImageScaleMax, ImageNot)
*生成一个椭圆元素
gen_disc_se (SE, 'byte', 45,45, 0)
*黑帽运算,分割比临近暗的区域
gray_bothat (ImageNot, SE, ImageBotHat)
*生成ROI1
gen_rectangle1 (ROI_0, 574.119, 268.867, 644.104, 337.728)
*生成ROI2
gen_rectangle1 (TMP_Region, 87.9029, 783.297, 179.989, 809.627)
*合并两个ROI
union2 (ROI_0, TMP_Region, ROI_0)
*生成ROI3
gen_rectangle1 (TMP_Region, 743.558, 937.222, 839.327, 997.981)
*合并ROI
union2 (ROI_0, TMP_Region, ROI_0)
*将合并ROI区域的图像剪切
reduce_domain (ImageBotHat, ROI_0, TemplateImage)
*设置区域填充方式
dev_set_draw ('margin')
*获取图像的数据,类型,高度,宽度
get_image_pointer1 (TemplateImage, Pointer, Type, Width, Height)
*显示图像
dev_display (TemplateImage)
*****************************************************************************第二 自动寻找最佳阈值********************************************************
* 最大方差初始化为0
MaxVariance := 0.0
* 最佳分割灰度阈值从1遍历到255,初始阈值的选取可以取图像平均灰度值
for ImgThreshold := 1 to 255 by 1
dev_display (TemplateImage)
* 前景区域分割
threshold (TemplateImage, Region, ImgThreshold, 255)
* 获得前景区域像素个数
area_center (Region, Area, Row, Column)
* 获得前景区域均值和方差
intensity (Region,TemplateImage, Mean, Deviation)
*对前景区域进行反选
complement (Region, RegionComplement)
*获取背景区域的面积和坐标
area_center (RegionComplement, Area1, Row1, Column1)
*获得背景区域像素个数、均值和方差
intensity (RegionComplement,TemplateImage, Mean1, Deviation1)
* 计算类间方差
Otsu := Area*1.0/[Width*Height]*Area1*1.0/[Width*Height]*pow(Mean-Mean1,2)
* 获取最大类间方差最佳阈值
if (Otsu>MaxVariance)
MaxVariance := Otsu
BestThreshold := ImgThreshold
endif
endfor
dev_display (TemplateImage)
dev_set_color ('green')
dev_set_draw ('fill')
*****************************************************************************第三 分割缺陷目标********************************************************
* 阈值操作,选取高亮目标,即为缺陷
threshold (TemplateImage, Region1, BestThreshold, 255)
* 对缺陷区域进行连通处理
connection(Region1, ConnectedRegions)
* 根据面积过滤出大的缺陷
select_shape (ConnectedRegions, SelectedRegions1, 'area', 'and', 261.07, 1971)
* 填充缺陷内部间隙
fill_up(SelectedRegions1, RegionFillUp)
* 显示图像
dev_display(Image)
* 显示缺陷区域
dev_display(RegionFillUp)
stop()