檢測-紋理表面凸起、凹痕、劃痕缺陷的檢測

equalsai發表於2019-11-28

此示例是一個綜合的示例,檢測的是皮革紋理表面上出現的凸起、凹痕、劃痕上的缺陷。使用的依然是光度立體法,只是不同的缺陷,需要使用的是不同引數所生成的影像。

示例程式碼如下:

* 使用光度立體的方法檢測皮革樣品

* Initialization
dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 640, 480, 'black', WindowHandle)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
Message := 'Inspect leather samples using photometric stereo'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Part 1
* 
* Show input images with different illumination
* 先顯示並且輸入同一影像在不同光照下的影像
* 此缺陷檢測,檢測的是紋理凸起缺陷

* 1. 一次性讀入多個影像
read_image (Images, 'photometric_stereo/leather_1_0' + [1:4])
* 迴圈,一次選擇一張影像
for I := 1 to 4 by 1
    Message := 'Sample 1: Acquire image ' + I + ' of 4'
    select_obj (Images, ObjectSelected, I)
    dev_display (ObjectSelected)
    disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
    wait_seconds (0.5)
endfor
* 
* 
* Apply photometric stereo to determine the albedo
Tilts := [6.1,95.0,-176.1,-86.8]
Slants := [41.4,42.6,41.7,40.9]
ResultType := ['gradient','albedo']
* 2. 用該運算元得到反照率影像和表面梯度影像
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], [])
* 
* Display the albedo image
* 顯示反照率影像
dev_display (Albedo)
disp_message (WindowHandle, 'The defect is clearly visible in the albedo image', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Detect defects
* 3. 缺陷檢測
* 
* 該二值化處理有幾個處理:均值處理->使用標準差進行二值化處理
var_threshold (Albedo, Region, 15, 15, 0.2, 0.05, 'light')
* 計算連通域,得到分隔開的連通域
connection (Region, ConnectedRegions)
* 以面積特徵,特徵直方圖選擇區域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 99999)
* 聯合,聯合成一個區域
union1 (SelectedRegions, RegionUnion)
* 閉運算
closing_circle (RegionUnion, RegionClosing, 3.5)
* 計算連通域,得到分開的連通域
connection (RegionClosing, Defects)
* 計算得到區域面積和中心座標
area_center (Defects, Area, Row, Column)
* 生成圓, 圈住缺陷部分
gen_circle (Circle, Row, Column, gen_tuple_const(|Row|,sqrt(Area) + 30))
* Display the defects
dev_display (Albedo)
dev_set_color ('red')
dev_set_draw ('margin')
dev_set_line_width (4)
dev_display (Circle)
disp_message (WindowHandle, 'Albedo image with defect', 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Part 2
* 
* Show input images with different illumination
* 讀入影像,一次讀入多張在不同光照下的影像
read_image (Images, 'photometric_stereo/leather_2_0' + [1:4])
for I := 1 to 4 by 1
    Message := 'Sample 2: Acquire image ' + I + ' of 4'
    select_obj (Images, ObjectSelected, I)
    dev_display (ObjectSelected)
    disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
    wait_seconds (0.5)
endfor
* 
* 
* Apply photometric stereo to determine the albedo
* 用該運算元得到反照率影像和表面梯度影像
photometric_stereo (Images, HeightField, Gradient, Albedo, Slants, Tilts, ResultType, 'poisson', [], [])

* 二值化
threshold (Albedo, Region1, 128, 255)
* 
* Display the albedo image
* 僅僅只使用二值化的方法處理反照率影像,並不能檢測到缺陷區域
dev_display (Albedo)
Message := 'These defects are difficult to detect in the albedo image.'
Message[1] := 'Therefore, we use the gradient information to detect them.'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Detect texture defects using gradient information.
* We are looking for areas with little surface changes.
* 使用梯度資訊檢測紋理缺陷,尋找表面變化很小的區域
* 
* 獲得高斯曲率影像
derivate_vector_field (Gradient, Curl, 1, 'curl')
derivate_gauss (Curl, CurlGradient, 1, 'gradient')
* 
* Display changes of the curl of the gradient field
dev_display (CurlGradient)
Message := 'Changes in the gradient curl'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* Detect texture defects
* 如下程式碼檢測紋理缺陷
* 此處缺陷檢測,檢測的是紋理的凹痕

* 對高斯曲率影像進行二值化處理
threshold (CurlGradient, Region, 0, 0.01)
* 選擇區域
rank_region (Region, RegionCount, 10, 10, 30)
* 計算連通域,得到分隔開的連通域
connection (RegionCount, ConnectedRegions)
* 以面積特徵,特徵直方圖選擇區域
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2000, 99999)
* 聯合,聯合成一個區域
union1 (SelectedRegions, RegionUnion)
* 選擇區域
rank_region (RegionUnion, RegionCount1, 25, 25, 170)
* 計算連通域,得到分隔開的連通域
connection (RegionCount1, NoTextured)
* 
* Display texture defects
* 在反照率影像上顯示選擇的區域
dev_display (Albedo)
dev_set_draw ('margin')
dev_set_color ('red')
dev_set_line_width (3)
dev_display (NoTextured)
disp_message (WindowHandle, 'Non-textured areas on leather', 'window', 12, 12, 'black', 'true')
stop ()
* 
* Detect scratches using curvature information.
* We are looking for areas with high curvature
* 
* 使用曲率資訊檢測劃痕,尋找高曲率區域
* 
* 獲得高斯曲率影像
derivate_vector_field (Gradient, MeanCurvature, 1, 'mean_curvature')
* 
* Display the mean curvature of the surface
* 顯示錶面的平均曲率
dev_display (MeanCurvature)
Message := 'Mean curvature of the surface'
disp_message (WindowHandle, Message, 'window', 12, 12, 'black', 'true')
disp_message (WindowHandle, 'Press F5', 'image', 720, 850, 'black', 'true')
stop ()
* 
* Detect scratches
* 劃痕檢測
* 此處缺陷檢測,檢測的是劃痕

* 計算絕對值影像  因為高斯曲率影像中曲率會有負數
abs_image (MeanCurvature, ImageAbs)
* 二值化處理
threshold (ImageAbs, Region2, 0.15, 255)
* 計算連通域,得到分隔開的連通域
connection (Region2, ConnectedRegions1)
* 以面積特徵,特徵直方圖選擇區域
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 10, 99999)
* 聯合,聯合成一個區域
union1 (SelectedRegions1, RegionUnion1)
* 閉運算
closing_circle (RegionUnion1, RegionClosing, 1.5)
* 計算連通域,得到分隔開的連通域
connection (RegionClosing, ConnectedRegions2)
* 以最大直徑特徵,特徵直方圖選擇區域
select_shape (ConnectedRegions2, SelectedRegions2, 'max_diameter', 'and', 50, 99999)
* 以灰度值選擇區域
select_gray (SelectedRegions2, MeanCurvature, SelectedRegions3, 'deviation', 'and', 0.2, 255)
* 
* Display scratches
* 在反照率影像顯示抓痕
dev_display (Albedo)
dev_set_draw ('margin')
dev_set_color ('red')
dev_set_line_width (3)
dev_display (SelectedRegions3)
disp_message (WindowHandle, 'Deep scratch', 'window', 12, 12, 'black', 'true')

重點說明:
1. 第一部分的檢測,待檢測的是皮革表面的凸起,該檢測,直接使用的是反照率影像,進行預處理和Blob後,即可得到皮革凸起的缺陷。
2. 待檢測的是皮革表面的凹痕和劃痕,該檢測,示例中先直接對反照率影像進行二值化之後,確認該方法無法完成對皮革表面缺陷的檢測。
3. 第二部分的檢測,待檢測的是皮革表面的凹痕,先使用如下運算元得到高斯曲率影像:
derivate_vector_field (Gradient, Curl, 1, 'curl')
derivate_gauss (Curl, CurlGradient, 1, 'gradient')
然後使用該高斯曲率影像Blob分析,即可得到皮革凹痕的缺陷。
4. 第三部分的檢測,待檢測的是皮革表面的劃痕,先使用如下運算元得到高斯曲率影像:
derivate_vector_field (Gradient, MeanCurvature, 1, 'mean_curvature')
然後使用該高斯曲率影像Blob分析,即可得到皮革劃痕的缺陷。
5. 運算元rank_region,使用一個Mask依次對待處理的整個區域過濾,選擇需要的區域。
6. 運算元select_gray,按照灰度值來選擇區域。

更多最新文章,請關注公眾號:

執行流程:
凸起反照率影像如下:

在反照率影像中標記處凸起缺陷:

凹痕反照率影像:

凹痕高斯曲率影像:

在反照率影像中標記處凹痕:

劃痕的高斯曲率影像:

在反照率影像中標記處劃痕:

相關文章