圖像處理(二)

halcon例程 inspect_solar_fingers.hdev 註釋

Halcon中的幾個窗口:

  1. 圖形窗口
    左上角座標爲(0,0),x軸向下延伸,y軸向右延伸,z軸表明灰度
  2. 變量窗口
  3. 程序窗口

檢測太陽能板上的缺陷

檢測流程:字體

  1. 三通道圖分解成三張單通道圖
  2. 篩選出灰度在指定範圍內的區域並將每個區域本身鏈接起來
  3. 選出好的區域和雜亂的區域
  4. 在整個圖片上找,若是既不是好的區域,也不是雜亂的區域,那就是有問題的區域
* For the solar industry, a common problem is the damage of
* fingers of solar cells. This example shows how to
* extract the broken fingers using morphology.
* 
* 通常放在程序的開始,將dev_update_window, dev_update_var, dev_update_pc所有設置成off,目的是減小在GUI更新耗費的時間。
* dev_update_window: default: on,指定算子返回的全部圖標對象是否須要顯示在活動的圖形窗口。這個選項設置成off後,須要使用dev_display算子來顯示。
* dev_update_var: default: on,指定變量窗口在程序指定過程當中的行爲,設置成off後變量在程序執行完以前都不會更新;設置爲on變量窗口中的內容在每次有變量發生變化時都會改變
* dev_update_pc: default: on,指定程序在執行過程當中pc(程序計數器)的行爲
dev_update_off ()
* 關閉活動的圖形窗口
dev_close_window ()
* 圖片名變量
ImageName := 'solar_cell/solar_cell_'
* 讀入圖片,經常使用的圖片格式的後綴能夠不加,第一個參數是輸出:讀取到的圖片,當讀取了多個文件時是一個列表;第二個參數:文件路徑,當須要讀取多個文件時,以列表形式輸入,例如:
* 同時讀取兩張圖片,文件名分別爲1.jpg和2.jpg
* read_image(Image, ['1', '2']
read_image (Image, ImageName + '01')

* 打開一個窗口大小保持圖像比例的圖像窗口,參數:
* Image 要顯示的圖像
* Row 新窗口左上角的行座標
* Column 新窗口作商家的列座標
* WidthLimit 寬度最大值,默認-1
* HeightLimit 高度最大值,默認-1
* WindowHandle 新的圖形窗口的句柄
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)

* 設置顯示的字體 窗口句柄,大小,字體,是否加粗,是否傾斜
* 注意字體是不是已經在系統中安裝有的
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
* 設置在圖像窗口上顯示的各類元素的顏色,例如圈區域之類的
dev_set_color ('red')
* 設置區域的填充模式,margin僅顯示輪廓,fill填滿
dev_set_draw ('margin')
* 設置輪廓線寬
dev_set_line_width (2)
* 
* 找出每張圖上的缺陷區域
* For each image of a solar cell, extract defect areas
NumImages := 6
for Index := 1 to NumImages by 1
    read_image (Image, ImageName + Index$'02')
    * 將一張三通道圖片分解爲三張單通道圖片
    decompose3 (Image, ImageR, ImageG, ImageB)
    * Segment dark regions (everything except the fingers) 分割出黑色區域(除了有特徵的區域外的全部區域)
    * 獲取出知足閾值條件的圖片區域,參數:傳入圖片,傳出分割的區域,最小灰度,最大灰度
    threshold (ImageR, Region, 0, 159)
    * 計算一個區域的鏈接的組件,參數:傳入區域,傳出鏈接的組件
    connection (Region, ConnectedRegions)
    * Select good parts and clutter regions 篩選出好的部分和雜亂的部分
    * 經過特徵篩選區域, 參數:傳入區域,傳出選中的區域,傳入須要覈驗的特徵列表,特徵是「和」仍是「或」,特徵的最小值列表,特徵的最大值列表。區域範圍上下限都包含。
    * 篩選出知足條件:面積在3500-5000,寬度在130-300之間的區域(兩邊較窄的部分)
    select_shape (ConnectedRegions, GoodSmallParts, ['area','width'], 'and', [3500,130], [5000,300])
    * 篩選出知足條件:面積在6000-10000,寬度在350-550之間的區域(中間較寬的部分)
    select_shape (ConnectedRegions, GoodLongParts, ['area','width'], 'and', [6000,350], [10000,550])
    * 篩選出知足條件:寬度在350-550之間或 高度在900-1000或面積在0-100的區域
    select_shape (ConnectedRegions, Clutter, ['width','height','area'], 'or', [900,900,0], [1000,1000,100])
    * Regions that are neither good parts nor clutter contain broken fingers 既不是好的也不是雜亂的區域包含損壞的特徵
    * 找出兩個區域的不一樣區域
    * 鏈接域和好的小區域的不一樣
    difference (ConnectedRegions, GoodSmallParts, Difference)
    * 上面找出的不一樣和好的大區域的不一樣
    difference (Difference, GoodLongParts, Difference)
    * 上面找出的不一樣和雜亂區域的不一樣,剩下的就是壞的區域了
    difference (Difference, Clutter, BrokenParts)
    * 變換區域的形狀, 參數:傳入須要變換的區域,傳出變換後的區域,傳入變換類型爲'rectangle1':與座標軸平行,小的矩形框
    shape_trans (BrokenParts, BrokenPartsTrans, 'rectangle1')
    * Isolate the break for visualization 剔除壞的區域
    * 用一個矩形的構造結構元素腐蝕指定區域,參數:傳入區域,傳出腐蝕後的區域,傳入矩形的寬,矩形的高
    * 腐蝕的依據是什麼?
    erosion_rectangle1 (BrokenParts, RegionErosion, 1, 25)
    * 鏈接腐蝕後的區域
    connection (RegionErosion, ConnectedBreaks)
    * 對鏈接好的區域作變換,'outer_circle' :小的圈
    shape_trans (ConnectedBreaks, Breaks, 'outer_circle')
    * 用一個圓形的元素膨脹,參數:傳入區域,傳出膨脹後的區域,傳入圓形的半徑
    dilation_circle (Breaks, Breaks, 6)
    * Remove empty regions 移除空的區域
    * (This could also be achieved with set_system('store_empty_region','false')
    * 選擇區域,傳入區域,傳出選擇好的區域,特徵是面積,特徵關係是和,最小1,最大99999999
    * 選擇出面積在1-99999999的區域
    select_shape (Breaks, Breaks, 'area', 'and', 1, 99999999)
    * 計算出列表中元素的數量
    * 算出有多少個破損塊
    count_obj (Breaks, CountBreaks)
    * 
    *  Display results of inspection 顯示檢查的結果
    * 
    dev_display (Image)
    dev_display (BrokenPartsTrans)
    dev_display (Breaks)
    * 
    if (CountBreaks == 0)
        disp_message (WindowHandle, 'Cell OK', 'window', 12, 12, 'black', 'true')
    else
        disp_message (WindowHandle, 'Cell not OK', 'window', 12, 12, 'red', 'true')
    endif
    * 
    if (Index != NumImages)
        * 顯示繼續執行的消息框,顯示內容始終爲"Click 'Run' to continue"
        disp_continue_message (WindowHandle, 'black', 'true')
        * 程序中止運行
        stop ()
    endif
    * If only one defect is present, zoom in 若是隻發現了一個缺陷,將缺陷放大顯示
    if (CountBreaks == 1)
        * 在座標(0, 610)打開一個300*300的黑色的窗口
        dev_open_window (0, 610, 300, 300, 'black', WindowHandle1)
        * 獲取區域的面積和中心位置
        area_center (Breaks, Area, Row, Column)
        * 調整顯示的圖片
        dev_set_part (Row[0] - 50, Column[0] - 50, Row[0] + 50, Column[0] + 50)
        dev_display (Image)
        dev_display (BrokenPartsTrans)
        dev_display (Breaks)
        stop ()
        * 激活窗口
        dev_set_window (WindowHandle1)
        * 關閉窗口
        dev_close_window ()
    endif
endfor

經常使用的運算符:

  1. 賦值::=
  2. for循環 for start to end by step... endfor
    start end都會包含,步幅step可調整
  3. if語句 if...endif

算子使用

  1. threshold(Image, Region, MinGray, MaxGray)
    應該怎樣選取合適的閾值範圍?能夠在圖形窗口看一下3d點圖感覺一下
    原圖:

    3d點圖:
    3d

  2. erosion_rectangle1(Region, RegionErosion, Width, Height)
    用一個矩形的結構元素腐蝕指定區域。
    1. 什麼是腐蝕?
    2. 腐蝕的做用是什麼?

圖像的取樣和量化

取樣:對座標值進行數字化;
量化:對幅值進行數字化code

數字圖像處理方法分類:線性和非線性對象

相關文章
相關標籤/搜索