halcon 圓環類缺陷檢測的一種方法(極坐標變換法)

目錄

  • 簡介
  • 極坐標變換
      • 定義
      • 原理
      • Halcon中的極坐標變換
          • 1、polar_trans_image_ext算子用法與參數剖析
          • 2、polar_trans_region_inv算子用法與參數剖析
      • 圓環類缺陷檢測思路與步驟
  • Halcon實例
      • 實例簡介
      • 程序解讀
      • 思路剖析
  • 應用實例1
      • 項目介紹
      • 處理程序
      • 處理效果
  • 應用實例2
      • 項目介紹
      • 處理程序
      • 處理效果

簡介

圓環類檢測在我們日常的缺陷檢測中經常遇到。比如玻璃瓶口的缺陷檢測,硬幣的缺陷檢測,膠墊的缺陷檢測…
我們對于圓環檢測不像對于矩形等物體的檢測,檢測區域比較規整,便于我們使用形態學對區域進行篩選,但是圓環物品我們發現會出現一些問題,比如使用矩形形態學會對環形的邊界處理產生影響等等。在這種情況下我們可以使用極坐標變換的方法,將環形轉換成矩形進而對缺陷進行處理。

圖例:
實例1在這里插入圖片描述
在這里插入圖片描述

極坐標變換

定義

在圖像處理中,尤其是在處理環形、圓形圖像的過程中,會使用到極坐標變換。將方形圖像轉換成圓形,即“方轉圓”。或者實現圓形轉換成方形“圓轉方”。

我們把圓形圖像轉換成方形圖像的過程稱為圖像的極坐標變換;反之則為圖像的反極坐標變換

原理

極坐標想必學過高中數學的人都聽過,一般的坐標系中用(x, y)值來描述一個點的位置,而在極坐標系中,則使用到原點的距離ρ和夾角θ來描述該點的位置。
首先,正常的圖像都是在直角坐標系下的,可以看做一個二維平面。我們要對圖像進行坐標變換,首先要把位置轉換到新的坐標系,然后將值賦過去。
這里有兩個值需要確定:1.位置 2.值。即變換后任一個像素的值與位置。
這里:變幻后的值不變。即求解變幻的位置關系式
極坐標變換及其反變換的關鍵在于,根據極坐標變換前的圖像確定極坐標變換后的圖像上每個像素點的像素值。也即是找到“圓圖”和“方圖”間幾何坐標的對應關系。

證明:
在這里插入圖片描述
如上圖所示,實現極坐標變換的關鍵即在于找到圓圖上任一點P(i,j),在方圖上對應的點p(m,n),然后通過插值算法實現圓圖上所有像素點的賦值。

方圖上,其行列數分別為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在方圖上對應行數為r/delta_r;

圓圖上點P在方圖上對應的列數n = thata/delta_t。

以上就是極坐標變換的基本原理,結合相應的插值算法,即可實現圖像的極坐標變換。

Halcon中的極坐標變換

在halcon中極坐標變換算子:
polar_trans_image_ext(針對圖像);polar_trans_region(針對區域);polar_trans_contour_xld(針對XLD輪廓)。
在halcon中反極坐標變換算子:
polar_trans_image_inv(針對圖像); polar_trans_region_inv(針對區域);polar_trans_contour_xld_inv(針對XLD輪廓)。

1、polar_trans_image_ext算子用法與參數剖析

算子原型:
polar_trans_image_ext(Image : PolarTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
參數說明:
Image (input_object)(多通道)圖像(-array)→對象(byte * / int2 * / uint2 * / real *)*允許計算設備
輸入圖像。
PolarTransImage(output_object)(多通道)圖像(-array)→對象(字節/ int2 / uint2 /實數)
輸出圖像。
Row(input_control)編號→(實數/整數)
圓弧中心的行坐標。
默認值:256
建議值:0、16、32、64、128、240、256、480、512
Column(input_control)號→(實數/整數)
圓弧中心的列坐標。
默認值:256
建議值:0、16、32、64、128、256、320、512、640
AngleStart(input_control)數字→(實數)
要映射到輸出圖像第一列的射線角度。
默認值:0.0
建議值:0.0,0.78539816,1.57079632,3.141592654,6.2831853,12.566370616
AngleEnd(input_control)數字→(實數)
要映射到輸出圖像最后一列的射線角度。
默認值:6.2831853
建議值:0.0,0.78539816,1.57079632,3.141592654,6.2831853,12.566370616
RadiusStart(input_control)數字→(實數/整數)
要映射到輸出圖像第一行的圓的半徑。
默認值:0
建議值:0、16、32、64、100、128、256、512
典型值范圍:0≤RadiusStart
RadiusEnd(input_control)數字→(實數/整數)
要映射到輸出圖像最后一行的圓的半徑。
默認值:100
建議值:0、16、32、64、100、128、256、512
典型值范圍:0≤RadiusEnd
Width(input_control)數→(整數)
輸出圖像的寬度。
默認值:512
建議值:256、320、512、640、800、1024
典型值范圍:0≤寬度≤32767
Height(input_control)數→(整數)
輸出圖像的高度。
默認值:512
建議值:240、256、480、512、600、1024
典型值范圍:0≤高度≤32767
Interpolation (input_control)字符串→(string)
內插法進行變換。
默認值:“ nearest_neighbor”
值列表:‘bilinear’,‘nearest_neighbor’

2、polar_trans_region_inv算子用法與參數剖析

算子原型:
polar_trans_image_inv(PolarImage : XYTransImage : Row, Column, AngleStart, AngleEnd, RadiusStart, RadiusEnd, Width, Height, Interpolation : )
參數說明:
PolarImage(input_object)(multichannel-)image(-array)→object(byte * / int2 * / uint2 * / real *)*允許用于計算設備
輸入圖像。
XYTransImage(output_object)(多通道)圖像(-array)→對象(字節/ int2 / uint2 /實數)
輸出圖像。
Row(input_control)編號→(實數/整數)
圓弧中心的行坐標。
默認值:256
建議值:0、16、32、64、128、240、256、480、512
典型值范圍:0≤行≤32767
Column(input_control)號→(實數/整數)
圓弧中心的列坐標。
默認值:256
建議值:0、16、32、64、128、256、320、512、640
典型值范圍:0≤列≤32767
AngleStart(input_control)數字→(實數)
將輸入圖像的第一列映射到的射線角度。
默認值:0.0
建議值:0.0,0.78539816,1.57079632,3.141592654,6.2831853
AngleEnd(input_control)數字→(實數)
將輸入圖像的最后一列映射到的射線角度。
默認值:6.2831853
建議值:0.0,0.78539816,1.57079632,3.141592654,6.2831853
RadiusStart(input_control)數字→(實數/整數)
要將輸入圖像的第一行映射到的圓的半徑。
默認值:0
建議值:0、16、32、64、100、128、256、512
典型值范圍:0≤RadiusStart
RadiusEnd(input_control)數字→(實數/整數)
要將輸入圖像的最后一行映射到的圓的半徑。
默認值:100
建議值:0、16、32、64、100、128、256、512
典型值范圍:0≤RadiusEnd
Width(input_control)數→(整數)
輸出圖像的寬度。
默認值:512
建議值:256、320、512、640、800、1024
典型值范圍:0≤寬度≤32767
Height(input_control)數→(整數)
輸出圖像的高度。
默認值:512
建議值:240、256、480、512、600、1024
典型值范圍:0≤高度≤32767
Interpolation (input_control)字符串→(string)
內插法進行變換。
默認值:“ nearest_neighbor”
值列表:‘bilinear’,‘nearest_neighbor’

圓環類缺陷檢測思路與步驟

1. 使用Blob分析確定圓心位置與圓環半徑、變換起始終止的角度。
2. 使用XLD輪廓擬合對圓心等參數進行精確定位。(此步驟用于精確定位,有的檢測不需要)
3. 進行極坐標變換
4. 對極坐標變換后的圖像進行處理
5. 進行反極坐標變換
6. 顯示缺陷區域

Halcon實例

inspect_bottle_mouth.hdev

實例簡介

*此示例檢查瓶口是否有缺陷。

程序解讀

傳送門,點擊下方藍色字體跳轉到解讀文章或者復制下方鏈接到瀏覽器。
HALCON示例程序inspect_bottle_mouth.hdev玻璃瓶口缺陷檢測
https://editor.csdn.net/md/?articleId=94733605

思路剖析

*首先,檢測瓶子的基本形態,
*邊緣檢測和圓擬合。
*然后,通過極坐標變換對頸部區域進行變換。
*之后,在變換后的圖像中使用動態閾值
*檢測缺陷。 最后,顯示結果。

應用實例1

項目介紹

在這里插入圖片描述
要求:檢測邊緣的三個紅色圈圈內的缺陷。
原圖
在這里插入圖片描述

處理程序

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

項目介紹

在這里插入圖片描述
要求:如圖所示,該圖為需要找出紅色圓圈內焊點的位置 。
原圖
在這里插入圖片描述

處理程序

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)

處理效果

在這里插入圖片描述
參考文獻:
https://blog.csdn.net/guduruyu/article/details/65436931

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254446.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254446.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254446.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux的mount命令詳解

linux下掛載(mount)光盤鏡像文件、移動硬盤、U盤、Windows和NFS網絡共享 linux是一個優秀的開放源碼的操作系統,可以運行在大到巨型小到掌上型各類計算機系統上,隨著 linux系統的日漸成熟和穩定以及它開放源代碼特有的優越性&…

cat命令

$ cat file 顯示文件中的內容$ cat -n file 可以顯示文件的內容和行號$ cat -b file -b與-n類似,但只標識非空白行的行號$ cat -e file 在每一行的末尾顯示“$”字符,在需要將多行內容轉換成一行時非常有用。$ cat 只是接收標準輸入的內容并顯示&#xf…

生成驗證碼的流程分析.

瀏覽器解析頁面, 攜帶uuid向服務器發送請求獲取圖片, 服務器生成圖片驗證碼, 返回圖片本身給瀏覽器, 客戶端根據圖片輸入驗證碼內容, 把輸入的內容發送給服務器, 服務器對比輸入的驗證碼是否正確.根據前端傳入的uuid從redis中獲取唯一圖片驗證碼名稱. 服務器: 圖片, 圖片內容…

Halcon圖像增強方法與原理概述

目錄簡介Halcon算子與算法原理1.灰度線性變換a、scale_imageb、scale_image_maxc、invert_image2.灰度非線性變換a、log_imageb、exp_image3.圖像增強對比度與照明度a、emphasizeb、illuminate4.直方圖均衡化a、equ_histo_image5.灰度圖像形態學a、 gray_openingb、gray_closin…

指針類型轉換(轉)

當我們初始化一個指針或給一個指針賦值時,賦值號的左邊是一個指針,賦值號的右邊是一個指針表達式。在我們前面所舉的例子中,絕大多數情況下,指針的類型和指針表達式的類型是一樣的,指針所指向的類型和指針表達式所指向…

143. Reorder List

Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do this in-place without altering the nodes values. For example,Given {1,2,3,4}, reorder it to {1,4,2,3}. public void ReorderList(ListNode head) {if(h…

Halcon圖像濾波方法與原理概述

目錄簡介Halcon算子與算法原理基礎濾波a、均值濾波b、中值濾波c、高斯濾波d、導向濾波簡介 圖像濾波,即在盡量保留圖像細節特征的條件下對目標圖像的噪聲進行抑制,是圖像預處理中不可缺少的操作,其處理效果的好壞將直接影響到后續圖像處理和…

碎片化學習不是學習碎片,看這篇了解碎片化學習的真相

高效學習的定義:找到最適合自己的學習手法,在相對短的時間內集中注意力,以解決一個工作生活當中的難題為目的著手學習,你需要勤加練習,有時候還需要向名師求助。——許岑為什么會出現碎片化學習? 隨著科技的…

一篇能加深理解linux 虛擬文件系統的博文

URL: http://asionius.com/article/9 https://www.ibm.com/developerworks/cn/linux/l-vfs/轉載于:https://www.cnblogs.com/rocklee25/p/6926267.html

如何強制ffmpeg編碼時輸出一個關鍵幀

原文地址:http://www.ffmpeg.com.cn/index.php/%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6ffmpeg%E7%BC%96%E7%A0%81%E6%97%B6%E8%BE%93%E5%87%BA%E4%B8%80%E4%B8%AA%E5%85%B3%E9%94%AE%E5%B8%A7 如何強制ffmpeg編碼時輸出一個關鍵幀 AVCodecContext *c //編碼器環境句…

Halcon深度學習環境搭建(win下)全網最全教程

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。 本文鏈接:https://blog.csdn.net/cashmood/article/details/105042928 文章目錄halcon深度學習介紹系統與環境搭建1、對電腦系統與硬件…

第二周進度及工作量統計

項目:詞頻統計修改 項目類型:個人項目 項目完成情況:已完成 項目改進:第二次改進 項目日期:2016.9.14----2.16.9.14 CCSEIT分析需求,設計15:2015:30010編碼實現15:3016:20050文檔程序說明,隨筆2…

p1484 種樹

傳送門 題目 cyrcyr今天在種樹,他在一條直線上挖了n個坑。這n個坑都可以種樹,但為了保證每一棵樹都有充足的養料,cyrcyr不會在相鄰的兩個坑中種樹。而且由于cyrcyr的樹種不夠,他至多會種k棵樹。假設cyrcyr有某種神能力&#xff0c…

Dalsa線掃相機SDK開發-小試牛刀(1)

拿到了dalsa相機,可以用Sapera軟件配置相機,進行圖像采集。但是自己開發的話就得擼起袖子寫代碼了,查了兩篇不錯的博文,作為指導。 Sapera幫助文檔 - 《好好先生》專欄 - 博客頻道 - CSDN.NET http://blog.csdn.net/liubing8609/a…

用FFMPEG SDK進行視頻轉碼壓縮時解決音視頻不同步問題的方法(轉) PTS DTS

用FFMPEG SDK進行視頻轉碼壓縮的時候,轉碼成功后去看視頻的內容,發現音視頻是不同步的。這個的確是一個惱火的事情。我在用FFMPEG SDK做h264格式的FLV文件編碼Filter的時候就碰到了這個問題。經過研究發現,FFMPEG SDK寫入視頻的時候有兩個地方…

深度學習環境搭建(GPU)CUDA安裝(完全版)

文章目錄1、查詢電腦硬件2、環境搭建與軟件安裝1、安裝CUDA運算平臺軟件2、安裝cuDNN支持包3、配置環境變量3、驗證CUDA與cuDNN安裝前幾天在看深度學習。因為對深度學習不是很了解,在配置環境時走了許多彎路,也總是戰戰兢兢的。現在對深度學習的環境搭建…

Linux 中的文件壓縮與解壓

.tar tar xvf FileName.tar # 解壓 tar cvf FileName.tar DirName # 壓縮 .gz gunzip FileName.gz # 解壓 gzip -d FileName.gz # 解壓 gzip FileName # 壓縮 .tar.gz 和 .tgz tar zxvf FileName.tar.gz # 解壓 tar zcvf FileName.tar.gz DirName # 壓縮 .bz2 bzip2 -d FileNam…

Unity3D游戲開發之自由視角下的角色控制

秦元培的博客:http://blog.csdn.net/qinyuanpei/article/details/39125353 1,[Unity3D]Unity3D游戲開發之角色控制漫談 2,[Unity3D]Unity3D游戲開發之自由視角下的角色控制 3,[Unity3D]Unity3D游戲開發之仿仙劍奇俠傳角色控制效果 轉載于:h…

Pycharm用鼠標滾輪控制字體大小

一、pycharm字體放大的設置 File —> setting —> Keymap —>在搜尋框中輸入:increase —> Increase Font Size(雙擊) —> 在彈出的對話框中選擇Add Mouse Shortcut 在彈出的對話框中同時按住ctrl鍵和鼠標滾輪向上滑。 二、…

Halcon自定義函數封裝方法(全網最詳細)

文章目錄1、名詞解釋2、例子介紹1、處理原圖與任務:2、代碼與解析:3、Halcon函數封裝方式①明確需求②選取函數部分進行函數創建,更改函數接口③運行驗證與函數更改操作有網友說不太清楚這個halcon函數的封裝方法。今天寫個教程帖子&#xff…