|
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 '四近鄰==================================================
|
|
|
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
|
|
|
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 '===============================
|
|
|
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開始
理解這題想的頭都疼了 望各位大大指點迷津了 感謝!
|
|
|
2013/9/3 上午 09:52:17
@@.土法練鋼不是不好 只是通常一個小原則改變,你就要全部重寫
這幾年影像識別的函式庫很多。 先去看看opencv吧
|
|
|
2014/8/8 下午 03:52:58
這是可以的,遞迴方面我有寫過,但速度方面並不太理想。
但程式碼短很多呢!
Flood Fill Algorithm
http://acm.nudt.edu.cn/~twcourse/ConnectedComponentLabeling.html
這演算法應該就是你要的,看看吧!
|
|
|
|
|
|
|
|
|
|
板主 : 徵求中
Top 10 評價排行 |
 |
影像處理與計算機圖學 |
|
|
|
|
|
|
|
|
|
影像處理與計算機圖學 |
 |
|
|
專家等級 |
評價 |
|
|
一代宗師 |
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/ |
|
|