簡介
圓環(huán)類檢測在我們?nèi)粘5娜毕輽z測中經(jīng)常遇到。比如玻璃瓶口的缺陷檢測,硬幣的缺陷檢測,膠墊的缺陷檢測…
我們對于圓環(huán)檢測不像對于矩形等物體的檢測,檢測區(qū)域比較規(guī)整,便于我們使用形態(tài)學對區(qū)域進行篩選,但是圓環(huán)物品我們發(fā)現(xiàn)會出現(xiàn)一些問題,比如使用矩形形態(tài)學會對環(huán)形的邊界處理產(chǎn)生影響等等。在這種情況下我們可以使用極坐標變換的方法,將環(huán)形轉(zhuǎn)換成矩形進而對缺陷進行處理。
極坐標變換
定義
在圖像處理中,尤其是在處理環(huán)形、圓形圖像的過程中,會使用到極坐標變換。將方形圖像轉(zhuǎn)換成圓形,即“方轉(zhuǎn)圓”?;蛘邔崿F(xiàn)圓形轉(zhuǎn)換成方形“圓轉(zhuǎn)方”。
我們把圓形圖像轉(zhuǎn)換成方形圖像的過程稱為圖像的極坐標變換;反之則為圖像的反極坐標變換
原理
極坐標想必學過高中數(shù)學的人都聽過,一般的坐標系中用(x, y)值來描述一個點的位置,而在極坐標系中,則使用到原點的距離ρ和夾角θ來描述該點的位置。
首先,正常的圖像都是在直角坐標系下的,可以看做一個二維平面。我們要對圖像進行坐標變換,首先要把位置轉(zhuǎn)換到新的坐標系,然后將值賦過去。
這里有兩個值需要確定:1.位置 2.值。即變換后任一個像素的值與位置。
這里:變幻后的值不變。即求解變幻的位置關系式。
極坐標變換及其反變換的關鍵在于,根據(jù)極坐標變換前的圖像確定極坐標變換后的圖像上每個像素點的像素值。也即是找到“圓圖”和“方圖”間幾何坐標的對應關系。
證明:
如上圖所示,實現(xiàn)極坐標變換的關鍵即在于找到圓圖上任一點P(i,j),在方圖上對應的點p(m,n),然后通過插值算法實現(xiàn)圓圖上所有像素點的賦值。
方圖上,其行列數(shù)分別為M、N,方圖上的每一列對應為圓圖上的每條半徑,半徑方向存在著一個長度縮放因子delta_r = M/R,圓周方向被分為N等分,即角度因子為delta_t = 2π/N;
圓圖上,圖像坐標(i,j)和世界坐標(x,y)有著如下變換關系:x = j - R, y = R - i;
那么,圖中P點半徑長度為r = sqrt(xx + yy),角度theta = arctan(y/x);
圓圖上點P在方圖上對應行數(shù)為r/delta_r;
圓圖上點P在方圖上對應的列數(shù)n = thata/delta_t。
以上就是極坐標變換的基本原理,結合相應的插值算法,即可實現(xiàn)圖像的極坐標變換。
Halcon中的極坐標變換
在halcon中極坐標變換算子:
polar_trans_image_ext(針對圖像);polar_trans_region(針對區(qū)域);polar_trans_contour_xld(針對XLD輪廓)。
在halcon中反極坐標變換算子:
polar_trans_image_inv(針對圖像);polar_trans_region_inv(針對區(qū)域);polar_trans_contour_xld_inv(針對XLD輪廓)。
1、polar_trans_image_ext算子用法與參數(shù)剖析
算子原型:
polar_trans_image_ext(Image : PolarTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
參數(shù)說明:
Image (input_object)(多通道)圖像(-array)→對象(byte * / int2 * / uint2 * / real *)*允許計算設備
輸入圖像。
PolarTransImage(output_object)(多通道)圖像(-array)→對象(字節(jié)/ int2 / uint2 /實數(shù))
輸出圖像。
Row(input_control)編號→(實數(shù)/整數(shù))
圓弧中心的行坐標。
默認值:256
建議值:0、16、32、64、128、240、256、480、512
Column(input_control)號→(實數(shù)/整數(shù))
圓弧中心的列坐標。
默認值:256
建議值:0、16、32、64、128、256、320、512、640
AngleStart(input_control)數(shù)字→(實數(shù))
要映射到輸出圖像第一列的射線角度。
默認值:0.0
建議值:0.0,0.78539816,1.57079632,3.141592654,6.2831853,12.566370616
AngleEnd(input_control)數(shù)字→(實數(shù))
要映射到輸出圖像最后一列的射線角度。
默認值:6.2831853
建議值:0.0,0.78539816,1.57079632,3.141592654,6.2831853,12.566370616
RadiusStart(input_control)數(shù)字→(實數(shù)/整數(shù))
要映射到輸出圖像第一行的圓的半徑。
默認值:0
建議值:0、16、32、64、100、128、256、512
典型值范圍:0≤RadiusStart
RadiusEnd(input_control)數(shù)字→(實數(shù)/整數(shù))
要映射到輸出圖像最后一行的圓的半徑。
默認值:100
建議值:0、16、32、64、100、128、256、512
典型值范圍:0≤RadiusEnd
Width(input_control)數(shù)→(整數(shù))
輸出圖像的寬度。
默認值:512
建議值:256、320、512、640、800、1024
典型值范圍:0≤寬度≤32767
Height(input_control)數(shù)→(整數(shù))
輸出圖像的高度。
默認值:512
建議值:240、256、480、512、600、1024
典型值范圍:0≤高度≤32767
Interpolation (input_control)字符串→(string)
內(nèi)插法進行變換。
默認值:“ nearest_neighbor”
值列表:‘bilinear’,‘nearest_neighbor’
2、polar_trans_region_inv算子用法與參數(shù)剖析
算子原型:
polar_trans_image_inv(PolarImage : XYTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
參數(shù)說明:
PolarImage(input_object)(multichannel-)image(-array)→object(byte * / int2 * / uint2 * / real *)*允許用于計算設備
輸入圖像。
XYTransImage(output_object)(多通道)圖像(-array)→對象(字節(jié)/ int2 / uint2 /實數(shù))
輸出圖像。
Row(input_control)編號→(實數(shù)/整數(shù))
圓弧中心的行坐標。
默認值:256
建議值:0、16、32、64、128、240、256、480、512
典型值范圍:0≤行≤32767
Column(input_control)號→(實數(shù)/整數(shù))
圓弧中心的列坐標。
默認值:256
建議值:0、16、32、64、128、256、320、512、640
典型值范圍:0≤列≤32767
AngleStart(input_control)數(shù)字→(實數(shù))
將輸入圖像的第一列映射到的射線角度。
默認值:0.0
建議值:0.0,0.78539816,1.57079632,3.141592654,6.2831853
AngleEnd(input_control)數(shù)字→(實數(shù))
將輸入圖像的最后一列映射到的射線角度。
默認值:6.2831853
建議值:0.0,0.78539816,1.57079632,3.141592654,6.2831853
RadiusStart(input_control)數(shù)字→(實數(shù)/整數(shù))
要將輸入圖像的第一行映射到的圓的半徑。
默認值:0
建議值:0、16、32、64、100、128、256、512
典型值范圍:0≤RadiusStart
RadiusEnd(input_control)數(shù)字→(實數(shù)/整數(shù))
要將輸入圖像的最后一行映射到的圓的半徑。
默認值:100
建議值:0、16、32、64、100、128、256、512
典型值范圍:0≤RadiusEnd
Width(input_control)數(shù)→(整數(shù))
輸出圖像的寬度。
默認值:512
建議值:256、320、512、640、800、1024
典型值范圍:0≤寬度≤32767
Height(input_control)數(shù)→(整數(shù))
輸出圖像的高度。
默認值:512
建議值:240、256、480、512、600、1024
典型值范圍:0≤高度≤32767
Interpolation (input_control)字符串→(string)
內(nèi)插法進行變換。
默認值:“ nearest_neighbor”
值列表:‘bilinear’,‘nearest_neighbor’
圓環(huán)類缺陷檢測思路與步驟
1. 使用Blob分析確定圓心位置與圓環(huán)半徑、變換起始終止的角度。
2. 使用XLD輪廓擬合對圓心等參數(shù)進行精確定位。(此步驟用于精確定位,有的檢測不需要)
3. 進行極坐標變換
4. 對極坐標變換后的圖像進行處理
5. 進行反極坐標變換
6. 顯示缺陷區(qū)域
Halcon實例
inspect_bottle_mouth.hdev
實例簡介
*此示例檢查瓶口是否有缺陷。
思路剖析
*首先,檢測瓶子的基本形態(tài),
*邊緣檢測和圓擬合。
*然后,通過極坐標變換對頸部區(qū)域進行變換。
*之后,在變換后的圖像中使用動態(tài)閾值
*檢測缺陷。最后,顯示結果。
應用實例1
項目介紹
要求:檢測邊緣的三個紅色圈圈內(nèi)的缺陷。
原圖:
處理程序
read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
rgb3_to_gray (Image, Image, Image, ImageGray)
dev_open_window_fit_image (ImageGray, 0, 0, -1, -1, WindowHandle)
dev_set_draw ('margin')
dev_set_line_width (3)
dev_set_draw ('margin')
* dev_set_draw ('fill')
get_image_size (ImageGray, Width, Height)
binary_threshold (GrayImage, Region, 'max_separability', 'dark', UsedThreshold)
connection (Region, ConnectedRegions)
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70)
smallest_circle (SelectedRegions, Row2, Column2, Radius)
gen_circle (Circle, Row2, Column2, Radius)
reduce_domain (ImageGray, Circle, ImageReduced2)
gray_closing_rect (ImageReduced2, ImageClosing1, 10, 4)
polar_trans_image_ext (ImageClosing1, PolarTransImage1, Row2, Column2, 0, 6.28319, Radius-100, Radius-10, 6.28*Radius, 90, 'nearest_neighbor')
mean_image (PolarTransImage1, ImageMean1, 500, 2)
dyn_threshold (PolarTransImage1, ImageMean1, RegionDynThresh1, 10, 'dark')
connection (RegionDynThresh1, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and',100, 9000000)
union1 (SelectedRegions1, RegionUnion)
closing_rectangle1 (RegionUnion, RegionClosing1, 10, 20)
connection (RegionClosing1, ConnectedRegions3)
opening_rectangle1 (ConnectedRegions3, RegionOpening1, 10, 20)
polar_trans_region_inv (RegionOpening1, XYTransRegion1, Row2, Column2, 0, 6.28319, Radius-100, Radius-10, 6.28*Radius, 90, Width, Height, 'nearest_neighbor')
smallest_circle (XYTransRegion1, Row, Column, Radius1)
gen_circle (Circle1, Row, Column, Radius1)
dev_display (ImageGray)
dev_display (Circle1)
處理效果
應用實例2
項目介紹
要求:如圖所示,該圖為需要找出紅色圓圈內(nèi)焊點的位置 。
原圖:
處理程序
read_image (Image, 'C:/Users/Administrator/Desktop/實際圖_副本.bmp')
rgb3_to_gray (Image, Image, Image, ImageGray)
dev_open_window_fit_image (ImageGray, 0, 0, -1, -1, WindowHandle)
dev_set_draw ('margin')
dev_set_line_width (5)
get_image_size (ImageGray, Width, Height)
auto_threshold (ImageGray, Regions, 2)
count_obj (Regions, Number)
select_obj (Regions, ObjectSelected, Number)
fill_up (ObjectSelected, RegionFillUp1)
connection (RegionFillUp1, ConnectedRegions1)
select_shape_std (ConnectedRegions1, SelectedRegions1, 'max_area', 70)
smallest_circle (SelectedRegions1, Row2, Column2, Radius)
gen_circle (Circle, Row2, Column2, Radius)
reduce_domain (ImageGray, Circle, ImageReduced2)
polar_trans_image_ext (ImageReduced2, PolarTransImage1, Row2, Column2, 0, 6.28319, Radius-210, Radius, 6.28*Radius, 210, 'nearest_neighbor')
mean_image (PolarTransImage1, ImageMean1, 200, 5)
dyn_threshold (PolarTransImage1, ImageMean1, RegionDynThresh1, 45, 'dark')
closing_circle (RegionDynThresh1, RegionClosing, 15.5)
connection (RegionClosing, ConnectedRegions2)
select_shape (ConnectedRegions2, SelectedRegions, ['width','height'], 'and', [380,80], [500,160])
polar_trans_region_inv (SelectedRegions, XYTransRegion1, Row2, Column2, 0, 6.28319, Radius-210, Radius, 6.28*Radius, 210, Width, Height, 'nearest_neighbor')
smallest_rectangle2 (XYTransRegion1, Row3, Column3, Phi, Length1, Length2)
gen_rectangle2 (Rectangle, Row3, Column3, Phi, Length1, Length2)
dev_display (ImageGray)
dev_display (Rectangle)
處理效果
-
圖像
+關注
關注
2文章
1078瀏覽量
40375 -
像素
+關注
關注
1文章
202瀏覽量
18547 -
HALCON
+關注
關注
16文章
63瀏覽量
27167
原文標題:halcon 圓環(huán)類缺陷檢測的一種方法(極坐標變換法)
文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論