Photoshop和Halcon中的極座標變換

 

極座標想必學太高中數學的人都聽過,通常的座標系中用(x, y)值來描述一個點的位置,而在極座標系中,則使用到原點的距離ρ和夾角θ來描述該點的位置。算法

 

我很早就接觸了Photoshop,知道Photoshop裏面有個極座標的扭曲濾鏡,以下圖:函數

 

明白了極座標(正向、反向)的大體效果是:能將矩形圖案變成圓形(環形)圖案,或者反過來。優化

 

例如製做這種超現實的特效:spa

 

Photoshop中的「極座標」濾鏡的原理是:以右上角爲圓心,旋轉之後生成的是一個長寬都是畫布兩倍的圖形,而後將此圖形壓縮至二分之一,最後將圓心移到畫面中央。(注意下面三個圖形之間的相對位置)rest

 

Halcon中極座標的處理可能爲了使用方便,將內部算法通過了優化,因此外在表現形式略有不一樣。code

 

Halcon中與極座標變換相關的算子共有7個,不過polar_trans_image已通過時,官方不建議使用,能夠看到Halcon對Image、Region、XLD均可以運用極座標變換和反變換regexp

 

Halcon示例程序中關於極座標的例子有: inspect_bottle_mouth.hdev。下面的代碼亦是根據這個例子精簡而來,完整代碼以下(注意看註釋):blog

 1 *說明:本例由Halcon示例程序 inspect_bottle_mouth.hdev 精簡而成,可先參考示例程序再閱讀本代碼。  2 
 3 dev_set_draw ('margin')  4 dev_set_line_width (2)  5 set_font (3600, '-Courier New-16-*-*-*-*-1-')  6 
 7 list_files ('C:/Users/Administrator/Desktop/bottle', ['files','follow_links','recursive'], ImageFiles)  8 tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)  9 
10 for Index := 1 to |ImageFiles| - 1 by 1
11  read_image (Image, ImageFiles[Index]) 12  get_image_size (Image, Width, Height) 13     threshold (Image, Region, 0, 60) 14  fill_up (Region, RegionFillUp) 15     opening_circle (RegionFillUp, RegionOpening, 8.5) 16  smallest_circle (RegionOpening, Row0, Column0, Radius0) 17  
18     *下面這個函數是本身寫的抓圓的函數,細節不表。你也能夠用fit_circle_contour_xld  gen_circle_contour_xld實現相似功能 19     find_circle (Image, PartCircleXLD, Regions, Cross, Circle, Row0, Column0, Radius0 + 10, 0, 360, 30, 70, 20, 1, 50, 'negative', 'first', 'inner', 10, 'circle', RowCenter, ColCenter, Radius) 20  dev_display (Image) 21  dev_display (Circle) 22     
23     *該算子對一個圖像的圓弧區域進行極座標變換,圓弧外徑是Radius,內徑是Radius - 100,即圓弧厚度是100 24     *同理,圓弧展開成矩形後,矩形寬度應該是外弧圓圈的周長,即6.28319 * Radius(周長 = 2π × r) ;矩形高度應該是圓弧厚度,即100 25     polar_trans_image_ext (Image, PolarTransImage, RowCenter, ColCenter, 0, 6.28319, Radius - 100, Radius, 6.28319 * Radius, 100, 'nearest_neighbor') 26     
27     *下面這句僅用於觀察image的反向極座標變換,生成的圖片的寬高仍是設置爲最原始圖像的Width, Height 28     polar_trans_image_inv  (PolarTransImage, XYTransImage, RowCenter, ColCenter, 0, 6.28319, Radius - 100, Radius, Width, Height, 'nearest_neighbor') 29     
30     *mean_image選擇主要沿水平方向進行模糊,動態閾值的'not_equal'參數同時篩選出了跟周圍比過亮和過暗的區域(由於過暗和過亮都是缺陷) 31     mean_image (PolarTransImage, ImageMean, 500, 3) 32     dyn_threshold (PolarTransImage, ImageMean, Region1, 30, 'not_equal') 33     
34     fill_up_shape (Region1, RegionFillUp1, 'area', 1, 100) 35     *開運算去掉細小干擾 36     opening_circle (RegionFillUp1, RegionOpening1, 1.5) 37  connection (RegionOpening1, ConnectedRegions) 38     
39     *之因此要進行極座標轉換,就是爲了這裏用'height'來篩選,這是本例使用極座標變換最關鍵的緣由 40     select_shape (ConnectedRegions, SelectedRegions, 'height', 'and', 10, 99999) 41     polar_trans_region_inv (SelectedRegions, XYTransRegion, RowCenter, ColCenter, 0, 6.28319, Radius - 100, Radius, 6.28319 * Radius, 100, Width, Height, 'nearest_neighbor') 42  dev_display (Image) 43  dev_display (XYTransRegion) 44     
45  stop () 46 endfor

 

雖然極座標變換是本例中的核心思路,可是仍有三句很是巧妙的代碼,仔細想一想爲何這三句代碼很巧妙:

31 mean_image (PolarTransImage, ImageMean, 500, 3) 32 dyn_threshold (PolarTransImage, ImageMean, Region1, 30, 'not_equal')
40     select_shape (ConnectedRegions, SelectedRegions, 'height', 'and', 10, 99999)
 

該圖極座標轉換後的圖像爲:圖片

 

 

部分處理效果圖以下:ci

相關文章
相關標籤/搜索