一 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 1dev_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 := OtsuBestThreshold := ImgThresholdendif
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()