halcon 粘连物体分割
公眾號:機器視覺那些事兒
“古人云,一生二,二生三,三生萬物。古人有云,水之清則無敵。故名三清!”
此次選取的案例依然是官方Blob案例–基于歐式距離的分水嶺算法的區(qū)域分割。Halcon的官方例程,都是頂級工程師的思想精華,大多實際項目的難度并沒有官方例程復(fù)雜,由于官方例程針對的是有一定Halcon基礎(chǔ)的,本人在此次處理時添加了詳細(xì)的中文注釋,做出一定的調(diào)整,更容易讓讀者理解和接受。
第1步:
使用區(qū)域距離變換算子獲取距離信息圖
distance_transform(Region:DistanceImage:Metric,Foreground,Width,Height)
距離變換簡化了分水嶺算法的復(fù)雜度。距離變換針對二值圖像,目標(biāo)像素為1,背景像素為0。距離變換的結(jié)果圖像是一個灰度圖像,灰度值就是圖像中該像素距離其最近的背景像素的距離。
假設(shè)兩個像素點P1(x1,y1),P2(x2,y2)
距離D = sqrt((x1-x2)(x1-x2) + (y1-y2)(y1-y2))
第2步:
使用閾值分水嶺算子獲取盆地
watersheds_threshold(Image : Basins : Threshold : )
分水嶺算法是一種基于拓?fù)淅碚摰臄?shù)學(xué)形態(tài)學(xué)的分割方法,基本思想是把圖像看做拓?fù)涞孛?#xff0c;圖像中的每一點像素的灰度值表示該店的海拔高度,高灰度代表山脈,低灰度代表盆地,每一個局部極小值及其影響區(qū)域成為集水盆,而集水盆的邊界形成分水嶺。
第3步:
根據(jù)第一步分水嶺算法分離結(jié)果,若盆地部分的灰度< threshold,則被合并到一起。設(shè)B1和B2分別為相鄰盆地的最小灰度值,W為將盆地分割為兩個盆地的最小灰度值。
則分割結(jié)果為:
2.程序使用的算子
distance_transform(Region:DistanceImage:Metric,Foreground,Width,Height)區(qū)域距離變換
watersheds_threshold(Image : Basins : Threshold : )閾值分水嶺
connection(Region : ConnectedRegions : : )計算區(qū)域的連通域
select_shape (ConnectedRegions, SelectedRegions, ‘a(chǎn)rea’, ‘a(chǎn)nd’, 20, 99999) 根據(jù)區(qū)域特征(面積、長度等)提取區(qū)域
distance_transform(Region : DistanceImage : Metric, Foreground, Width, Height : )計算區(qū)域的距離變換
convert_image_type(Image : ImageConverted : NewType : )轉(zhuǎn)換圖像類型(byte* / direction* / cyclic* / int1* / int2* / uint2* / int4* / int8 / real* / complex*)
invert_image(Image : ImageInvert : : )反轉(zhuǎn)圖像
scale_image_max(Image : ImageScaleMax : : )將圖像灰度范圍擴大到【0,255】
intersection(Region1, Region2 : RegionIntersection : : )計算區(qū)域的交集
4.算法思路
(1)簡單的閾值分割;
(2)計算連通域connection;
(3)基于距離變換的分水嶺區(qū)域分割,使用算子distance_tansform,watersheds
(4)盆地與原連通域求交集,分離粘連顆粒;
5.現(xiàn)學(xué)現(xiàn)用
(1)讀入原圖,簡單的閾值分割
*采集圖像
dev_close_window ()
read_image (Image, ‘pellets’)
*計算圖片大小,并以原圖尺寸顯示
get_image_size (Image, Width, Height)
dev_open_window (0, 0, Width, Height, ‘black’, WindowHandle)
dev_display (Image)
stop ()
*01 簡單的閾值分割
threshold (Image, Region, 105, 255)
閾值分割
(2)計算連通域connection
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ‘a(chǎn)rea’, ‘a(chǎn)nd’, 20, 99999)
dev_set_draw (‘margin’)
dev_display (Image)
dev_display (SelectedRegions)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
stop ()
計算連通域并篩選連通域
部分顆粒粘連處在一個連通域
(3)基于距離變換的分水嶺區(qū)域分割,使用算子distance_tansform,watersheds
*03 基于距離變換的分水嶺區(qū)域分割,使用算子distance_tansform,watersheds
*距離變換
distance_transform (SelectedRegions, DistanceImage, ‘octagonal’, ‘true’, 380, 350)
*轉(zhuǎn)換圖像類型,將real類型轉(zhuǎn)換為byte,因為分水嶺迭代運算的圖像為‘byte’類型
convert_image_type (DistanceImage, DistanceImageByte, ‘byte’)
*反轉(zhuǎn)圖像,使得高灰度值在邊緣代表山脈,低灰度值在里面代表盆地
invert_image (DistanceImageByte, DistanceImageInv)
*擴大圖像灰度范圍【0,255】,增加對比度
scale_image_max (DistanceImageInv, DistanceImageInvScaled)
watersheds_threshold (DistanceImageInv, Basins, 5)
dev_display (DistanceImageInvScaled)
dev_display (Basins)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
stop ()
分水嶺圖
已成功分割粘連顆粒
(4)盆地與原連通域求交集,分離粘連顆粒;
*04 盆地與原連通域求交集,分離粘連顆粒
intersection (Basins, SelectedRegions, SegmentedPellets)
最終效果圖
成功分割粘連顆粒
原圖及完整源代碼見百度網(wǎng)盤:
鏈接:https://pan.baidu.com/s/1FV2zYWK2gnA0duFdLnIlXA 密碼:h7t7
總結(jié)
以上是生活随笔為你收集整理的halcon 粘连物体分割的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生态系统服务---生态系统服务构建生态安
- 下一篇: opencv黑白线循迹