討論區快速選單
知識庫快速選單
網路投保旅行平安險 最完整AWS雲端解決方案培訓 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
求教影像切割利用遞迴實現的code
更改我的閱讀文章字型大小
作者 : ctjh900801(向恩)
[ 貼文 5 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/9/2 下午 03:06:19
小弟最近在鑽研影像切割 從網路上搜集了不少影像處理的知識 並想將之應用到實際的問題上

最近剛好碰到一個棘手的難題 棘手的難題就有不簡單的解法

首先小弟想切割的圖像範例大致如下:

圖像連結
http://social.msdn.microsoft.com/Forums/getfile/326950

要將這個矩形圖中的圓圈跟星星切出來 這看似單純 但是它的附近殘留了不少的噪點

不然用從左掃瞄到右 由上到下 像素點由少增多的特性去切割 這種思路是較簡便的

我也實現過這種思路的code 但是對付如上面這個範例及更多複雜狀況又有噪點的影像就有點力不從心了

所以小弟苦思已久 突然想到這種圖像似乎因為圓和星星的像素點彼此連起來的像素點遠大於那些噪點的像素點

所以想到是否可以利用遞迴的特性去切割這種連續像素點連結的影像

查找了我蒐集的資料中的確影像切割是有這種方法的

以下貼出該方法的思路:

Recursive algorithm 執行步驟:
1. 掃瞄找出灰階值為1且未經標號的像素,
並指定一個未經使用的號碼給該像素。
2. 以遞迴的方式指定同一個標號給該像素之
8-neighbor中像素值為1的像素。
3. 當不再有未經標號且像素值為1之像素即
停止。
4. 回到步驟1。

圖像連結
http://social.msdn.microsoft.com/Forums/getfile/326951

以下給出我自己編的CODE:

Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
     八近鄰切割(Form2.PictureBox1.Image, 0, 0, False, 1)
    End Sub

Private 分析至第幾層全域 As Integer = 1

    Private Function 八近鄰切割(ByVal 待分析圖像 As Image, ByVal xs As Integer, ByVal ys As Integer, ByVal 像素點 As Boolean, ByVal 分析至第幾層區域 As Integer)


     '\\\\\\\\\\\\\\標記法: 思路乃掃瞄過的像素點皆定為已掃過之標記點,掃描的黑點如有連結起來超過20個連結點即成一字
     Dim 分析第幾個文字 As Integer = 1

     Dim 待分析像素點(待分析圖像.Width - 1, 待分析圖像.Height - 1), 分析過之像素點(待分析圖像.Width - 1, 待分析圖像.Height - 1) As Boolean
     Dim 已深入 As Boolean

     For x = xs To 待分析圖像.Width - 1
     For y = ys To 待分析圖像.Height - 1


     If 複製黑點布林陣列(x, y) = True Then

     ' 分析第幾個文字 += 1 : 分析開始儲存 = True
     ' If 分析至第幾層全域 < 分析至第幾層區域 Then
     '分析至第幾層全域 = 分析至第幾層區域
     ' End If
     '四近鄰==================================================
作者 : ctjh900801(向恩)
[ 貼文 5 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/9/2 下午 03:08:52
If Not x = (待分析圖像.Width - 1) And Not y = (待分析圖像.Height - 1) Then
     If 複製黑點布林陣列(x + 1, y) = True And 分析過之像素點(x + 1, y) = False Then
     待分析像素點(x + 1, y) = True : 分析過之像素點(x + 1, y) = True
     分析至第幾層區域 += 1
     分析至第幾層全域 = 分析至第幾層區域

     八近鄰切割(待分析圖像, x + 1, y, 待分析像素點(x + 1, y), 分析至第幾層區域)
     分析至第幾層區域 -= 1
     ElseIf 複製黑點布林陣列(x, y + 1) = True And 分析過之像素點(x, y + 1) = False Then
     待分析像素點(x, y + 1) = True : 分析過之像素點(x, y + 1) = True
     分析至第幾層區域 += 1
     分析至第幾層全域 = 分析至第幾層區域

     八近鄰切割(待分析圖像, x, y + 1, 待分析像素點(x, y + 1), 分析至第幾層區域)
     分析至第幾層區域 -= 1
     ElseIf 複製黑點布林陣列(x - 1, y) = True And 分析過之像素點(x - 1, y) = False Then
     待分析像素點(x - 1, y) = True : 分析過之像素點(x - 1, y) = True
     分析至第幾層區域 += 1
     分析至第幾層全域 = 分析至第幾層區域

     八近鄰切割(待分析圖像, x, y + 1, 待分析像素點(x - 1, y), 分析至第幾層區域)
     分析至第幾層區域 -= 1
     ElseIf 複製黑點布林陣列(x, y - 1) = True And 分析過之像素點(x, y - 1) = False Then
     待分析像素點(x, y - 1) = True : 分析過之像素點(x, y - 1) = True
     分析至第幾層區域 += 1
     分析至第幾層全域 = 分析至第幾層區域

     八近鄰切割(待分析圖像, x, y - 1, 待分析像素點(x, y - 1), 分析至第幾層區域)
     分析至第幾層區域 -= 1
    

作者 : ctjh900801(向恩)
[ 貼文 5 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/9/2 下午 03:09:34
ElseIf 複製黑點布林陣列(x + 1, y - 1) = True And 分析過之像素點(x + 1, y - 1) = False Then
     待分析像素點(x + 1, y - 1) = True : 分析過之像素點(x + 1, y - 1) = True
     分析至第幾層區域 += 1
     分析至第幾層全域 = 分析至第幾層區域
     八近鄰切割(待分析圖像, x + 1, y - 1, 待分析像素點(x + 1, y - 1), 分析至第幾層區域)
     分析至第幾層區域 -= 1
     ElseIf 複製黑點布林陣列(x + 1, y + 1) = True And 分析過之像素點(x + 1, y + 1) = False Then
     待分析像素點(x + 1, y + 1) = True : 分析過之像素點(x + 1, y + 1) = True
     分析至第幾層區域 += 1
     分析至第幾層全域 = 分析至第幾層區域

     八近鄰切割(待分析圖像, x + 1, y + 1, 待分析像素點(x + 1, y + 1), 分析至第幾層區域)
     分析至第幾層區域 -= 1
     ElseIf 複製黑點布林陣列(x - 1, y + 1) = True And 分析過之像素點(x - 1, y + 1) = False Then
     待分析像素點(x - 1, y + 1) = True : 分析過之像素點(x - 1, y + 1) = True
     分析至第幾層區域 += 1
     分析至第幾層全域 = 分析至第幾層區域

     八近鄰切割(待分析圖像, x - 1, y + 1, 待分析像素點(x - 1, y + 1), 分析至第幾層區域)
     分析至第幾層區域 -= 1
     Else
     '=============================


     '\\\\\\\\\\\\\\\\\\\\\\\\\\\
     If 分析至第幾層全域 > 10 Then
     Dim 新影像組合 As New 影像組合(分析第幾個影像)
     新影像組合.儲存的像素點 = 待分析像素點
     待分析像素點 = Nothing
     分析第幾個影像 += 1
     Return 0
     End If
     八近鄰切割(待分析圖像, x, y, 待分析像素點(x, y), 分析至第幾層區域)

     End If
     End If
    
     End If
     ========================================================
     分析過之像素點(x, y) = True
     '===============================
作者 : ctjh900801(向恩)
[ 貼文 5 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/9/2 下午 03:10:11
If 複製黑點布林陣列(x, y) = False Then
     If Not 分析至第幾層區域 = 1 And 已深入 = False Then '深入至第幾層就要從第幾層回去

     分析至第幾層區域 -= 1
     已深入 = True
     Return 0
     End If
     End If
  
     Next
     Next






    End Function
Public Class 影像組合

    Property 第幾筆影像 As Integer
    Public 儲存的像素點(,) As Boolean

    Sub New(s As Integer)
     第幾筆影像 = s
    End Sub


End Class


目前碰到的最大問題就是 遞迴對小弟來說真的有點難度又陌生 不清楚自己的CODE BUG出在哪?

把自己的CODE貼出來給大家看看 刺激一下腦袋 理解這個CODE是否符合這個思路的正確性

目前我在調試的時候 只要ys跑到60幾的值 理論上xs從當前掃描完的這一行要跳至下一行時

ys應該要從0開始掃描起 不過ys好像一直從60幾往上跳 而不是從0開始

理解這題想的頭都疼了 望各位大大指點迷津了 感謝!
作者 : daniel(冷眼)討論區板主 VC++優秀好手遊戲程式設計優秀好手DirectX優秀好手C++優秀好手貼文超過1000則人氣指數超過70000點
[ 貼文 1564 | 人氣 84169 | 評價 6990 | 評價/貼文 4.47 | 送出評價 15 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/9/3 上午 09:52:17
@@.土法練鋼不是不好
只是通常一個小原則改變,你就要全部重寫

這幾年影像識別的函式庫很多。
先去看看opencv吧
作者 : godanokuo(KUO)
[ 貼文 21 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2014/8/8 下午 03:52:58
這是可以的,遞迴方面我有寫過,但速度方面並不太理想。

但程式碼短很多呢! 

Flood Fill Algorithm

http://acm.nudt.edu.cn/~twcourse/ConnectedComponentLabeling.html

這演算法應該就是你要的,看看吧!

 板主 : 徵求中
 > 影像處理與計算機圖學 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 影像處理與計算機圖學 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
影像處理與計算機圖學
1 Linkin 780 
2 CrazyStar 400 
3 青衫 360 
4 白老鼠(Gary) 330 
5 悠悠深藍 220 
6 none 220 
7 shou 200 
8 ultra 200 
9 ghost 140 
10 ozzy 130 
影像處理與計算機圖學
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875