檢測流程:字體
* 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
:=
for start to end by step
... endfor
if
...endif
threshold(Image, Region, MinGray, MaxGray)
應該怎樣選取合適的閾值範圍?能夠在圖形窗口看一下3d點圖感覺一下
原圖:
3d點圖:
3d
erosion_rectangle1(Region, RegionErosion, Width, Height)
取樣:對座標值進行數字化;
量化:對幅值進行數字化code
數字圖像處理方法分類:線性和非線性對象