■69807 / inTopicNo.1) |
VB2013,8近傍でのラベリング処理について |
□投稿者/ ななし (3回)-(2014/01/30(Thu) 22:29:44)
|
分類:[.NET 全般]
こんばんは。ななしと申します。現在、VB2013を用いた画像処理について学習しています。
今回質問させて頂くのは、8近傍で輪郭を追跡するラベリングについてです。
http://imagingsolution.blog107.fc2.com/blog-entry-198.html
上記webページを参考にしてプログラムを作成してみたのですが、うまく行きません。
どこがおかしいのかわかる方がおられましたらご指摘頂けると幸いです。
Color.Black, Color.Redのみで描画された画像について、Color.Redのピクセルを発見したら、
そこから輪郭を追跡しラベル付けをするプログラムを作成したつもりです。
よろしくお願いいたします。
---以下ソースコード---
Private Sub Button19_Click(sender As Object, e As EventArgs) Handles Button19.Click
Dim i As Integer, j As Integer
Dim cColor As Color
Dim Label As Integer = 1
Dim bBitmap As New Bitmap(PictureBox2.Image)
Dim iArrayValue As Integer(,) = New Integer(PictureBox2.Image.Width - 1, PictureBox2.Image.Height - 1)
For i = 0 To PictureBox2.Image.Width - 1
For j = 0 To PictureBox2.Image.Height - 1
cColor = bBitmap.GetPixel(i, j) 'ピクセルの色の取得
'ピクセルの色の設定
iArrayValue(i, j) = cColor.R
Next
Next
For i = 0 To PictureBox2.Image.Width - 1
For j = 0 To PictureBox2.Image.Height - 1
If iArrayValue(i, j) = Color.Red.R Then
SetLabel2(iArrayValue, i, j, Label)
Label += 1
End If
Next
Next
End Sub
Private Sub SetLabel2(ByRef iArray As Integer(,), iStartX As Integer, iStartY As Integer, iLabel As Integer)
'変数の宣言iCount:設定ピクセル数 im,ip,jm,jp:走査基準位置の上下左右位置
Dim i As Integer, j As Integer, iCount As Integer
Dim im As Integer, ip As Integer, jm As Integer, jp As Integer
Dim Vold As Integer, Vnew As Integer
Dim vec As Integer
'開始位置のラベルの設定
iArray(iStartX, iStartY) = iLabel
'ラベルの設定処理
i = iStartX
j = iStartY
im = i - 1 'im値の設定
ip = i + 1 'ip値の設定
jm = j - 1 'jm値の設定
jp = j + 1 'jp値の設定
Do
iCount = 0 '初期化
'ラベルの設定
Select Case vec
Case 0
If iArray(im, jp) = Color.Red.R Then
iArray(im, jp) = iLabel
Vold = vec
Vnew = (Vold + 6) Mod 8
vec = Vnew
i = im
j = jp
iCount += 1
Exit Select
End If
vec += 1
Case 1
If iArray(i, jp) = Color.Red.R Then
iArray(i, jp) = iLabel
Vold = vec
Vnew = (Vold + 6) Mod 8
vec = Vnew
i = i
j = jp
iCount += 1
Exit Select
End If
vec += 1
Case 2
If iArray(ip, jp) = Color.Red.R Then
iArray(ip, jp) = iLabel
Vold = vec
Vnew = (Vold + 6) Mod 8
vec = Vnew
i = ip
j = jp
iCount += 1
Exit Select
End If
vec += 1
Case 3
If iArray(ip, j) = Color.Red.R Then
iArray(ip, j) = iLabel
Vold = vec
Vnew = (Vold + 6) Mod 8
vec = Vnew
i = ip
j = j
iCount += 1
Exit Select
End If
vec += 1
Case 4
If iArray(ip, jm) = Color.Red.R Then
iArray(ip, jm) = iLabel
Vold = vec
Vnew = (Vold + 6) Mod 8
vec = Vnew
i = ip
j = jm
iCount += 1
Exit Select
End If
vec += 1
Case 5
If iArray(i, jm) = Color.Red.R Then
iArray(i, jm) = iLabel
Vold = vec
Vnew = (Vold + 6) Mod 8
vec = Vnew
i = i
j = jm
iCount += 1
Exit Select
End If
vec += 1
Case 6
If iArray(im, jm) = Color.Red.R Then
iArray(im, jm) = iLabel
Vold = vec
Vnew = (Vold + 6) Mod 8
vec = Vnew
i = im
j = jm
iCount += 1
Exit Select
End If
vec += 1
Case 7
If iArray(im, j) = Color.Red.R Then
iArray(im, j) = iLabel
Vold = vec
Vnew = (Vold + 6) Mod 8
vec = Vnew
i = im
j = j
iCount += 1
Exit Select
End If
vec = 0
End Select
Loop While iCount <> 0
End Sub
|
|