*an alg to know if a pixel is an outline pixel based on the pixels around it.
Code:
Public Shared Function isOutLine(ByVal xPos As Integer, ByVal Ypos As Integer, ByVal image As Bitmap, ByVal bias As Integer) As Boolean
Dim result As Boolean = False
Dim change As Byte = 0
If xPos > 0 And xPos < image.Width - 1 And Ypos > 0 And Ypos < image.Height - 1 Then
Dim color1, color2, color3, color4, color5, color6, color7, color8, color9 As Color
color1 = image.GetPixel(xPos - 1, Ypos - 1)
color2 = image.GetPixel(xPos, Ypos - 1)
color3 = image.GetPixel(xPos + 1, Ypos - 1)
color7 = image.GetPixel(xPos - 1, Ypos + 1)
color8 = image.GetPixel(xPos, Ypos + 1)
color9 = image.GetPixel(xPos + 1, Ypos + 1)
color4 = image.GetPixel(xPos - 1, Ypos)
color6 = image.GetPixel(xPos + 1, Ypos)
color5 = image.GetPixel(xPos, Ypos)
If (CType(color5.R, Integer) > CType(color4.R, Integer) - bias) And (CType(color5.R, Integer) < CType(color4.R, Integer) + bias) Then
change += 1
End If
If (CType(color5.G, Integer) > CType(color4.G, Integer) - bias) And (CType(color5.G, Integer) < CType(color4.G, Integer) + bias) Then
change += 1
End If
If (CType(color5.B, Integer) > CType(color4.B, Integer) - bias) And (CType(color5.B, Integer) < CType(color4.B, Integer) + bias) Then
change += 1
End If
If (CType(color5.R, Integer) > CType(color8.R, Integer) - bias) And (CType(color5.R, Integer) < CType(color8.R, Integer) + bias) Then
change += 1
End If
If (CType(color5.G, Integer) > CType(color8.G, Integer) - bias) And (CType(color5.G, Integer) < CType(color8.G, Integer) + bias) Then
change += 1
End If
If (CType(color5.B, Integer) > CType(color8.B, Integer) - bias) And (CType(color5.B, Integer) < CType(color8.B, Integer) + bias) Then
change += 1
End If
End If
'Dim sumR, sumG, sumB As Integer
'sumR = (CType(color1.R, Integer) + CType(color2.R, Integer) + CType(color3.R, Integer))
'sumR -= (CType(color7.R, Integer) + CType(color8.R, Integer) + CType(color9.R, Integer))
''sumG = (CType(color7.R, Integer) + CType(color8.R, Integer) + CType(color9.R, Integer))
''sumG -= (CType(color1.G, Integer) + CType(color2.G, Integer) + CType(color3.G, Integer))
''sumB = (CType(color1.B, Integer) + CType(color2.B, Integer) + CType(color3.B, Integer))
''sumB -= (CType(color7.B, Integer) + CType(color8.B, Integer) + CType(color9.B, Integer))
'sumR = Abs(sumR)
''sumG = Abs(sumG)
''sumB = Abs(sumB)
''Dim sumR2, sumG2, sumB2 As Integer
''sumR2 = (CType(color1.R, Integer) + CType(color4.R, Integer) + CType(color7.R, Integer))
''sumG2 = (CType(color1.G, Integer) + CType(color4.G, Integer) + CType(color7.G, Integer))
''sumB2 = (CType(color1.B, Integer) + CType(color4.B, Integer) + CType(color7.B, Integer))
''sumR2 -= (CType(color3.R, Integer) + CType(color6.R, Integer) + CType(color9.R, Integer))
''sumG2 -= (CType(color3.G, Integer) + CType(color6.G, Integer) + CType(color9.G, Integer))
''sumB2 -= (CType(color3.B, Integer) + CType(color6.B, Integer) + CType(color9.B, Integer))
''sumR2 = Abs(sumR2)
''sumG2 = Abs(sumG2)
''sumB2 = Abs(sumB2)
''sumR2 = color1.R + color4.R + color7.R
''sumG2 = color1.G + color4.G + color7.G
''sumB2 = color1.B + color4.B + color7.B
''sumR2 -= color3.R + color6.R + color9.R
''sumG2 -= color3.G + color6.G + color9.G
''sumB2 -= color3.B + color6.B + color9.B
If change = 6 Then
result = True
End If
Return result
End Function
this manages to detect outlines by checking per pixel and comparing to its surrounding, unfortunately it's very fucking expensive speed wize.
using parallal programming could speed it up by 4 but I should explore other directions