Hi!
Ich lade via OpenFileDialog ein Bild. Dieses wird zu einem Schwarz-Weiß-BIld gemacht (nicht mit grau verwechseln). Danach benutze ich einen Erosions- und Dilationsfilter, um die meisten Pixelfehler zu beheben. Nun habe ich ein „perfektes“ Schwarz-Weiß-Bild und starte die Prozedur zur Kantenerkennung. Diese arbeitet in 2 Stufen, hier als Beispiel Weiß umranden:
Ich lade via OpenFileDialog ein Bild. Dieses wird zu einem Schwarz-Weiß-BIld gemacht (nicht mit grau verwechseln). Danach benutze ich einen Erosions- und Dilationsfilter, um die meisten Pixelfehler zu beheben. Nun habe ich ein „perfektes“ Schwarz-Weiß-Bild und starte die Prozedur zur Kantenerkennung. Diese arbeitet in 2 Stufen, hier als Beispiel Weiß umranden:
- von oben nach unten und von links nach rechts. Sobald kein Schwarz mehr gesehen wird (und die nächsten Pixel weiß sind), wird sich der Punkt gemerkt, die innere Schleife wird verlassen; und es wird mit dem nächsten y weitergemacht
- unten weitermachen, also von unten nach oben und von rechts nach links. Dito.
Private Liste_mit_Punkten As List(Of Point)
). Mit dieser wird ein Graphics.Path gezogen. Leider ist es so, dass trotz Bildbearbeitung einige Fehler drin sind (siehe Bild 2). Kann man diese beheben?VB.NET-Quellcode
- Imports System.Drawing.Drawing2D
- Public NotInheritable Class AllesGrafische
- Public Shared Sub Paint_the_Rectangle(ByVal g As Graphics, ByVal recta As Rectangle)
- If g IsNot Nothing Then
- g.SmoothingMode = SmoothingMode.AntiAlias 'For Bezier curves, using GraphicsPath, you need SmoothingMode.AntiAlias
- g.CompositingQuality = CompositingQuality.HighQuality
- g.PixelOffsetMode = PixelOffsetMode.HighQuality
- g.InterpolationMode = InterpolationMode.HighQualityBilinear
- Using Pen_Hellblau As Pen = New Pen(Color.FromArgb(0, 200, 255), 1.0F)
- g.DrawRectangle(Pen_Hellblau, recta)
- End Using
- End If
- End Sub
- Public Shared Sub Draw_Curve(ByVal g As Graphics, ByVal theList As List(Of Point))
- If theList IsNot Nothing AndAlso theList.Count > 0 AndAlso g IsNot Nothing Then
- g.SmoothingMode = SmoothingMode.AntiAlias
- g.CompositingQuality = CompositingQuality.HighQuality
- g.PixelOffsetMode = PixelOffsetMode.HighQuality
- g.InterpolationMode = InterpolationMode.HighQualityBilinear
- Using gp As New GraphicsPath
- gp.AddLines(theList.ToArray())
- gp.CloseFigure()
- Using Pen_gelb As Pen = New Pen(Color.FromArgb(255, 255, 0), 2.0F)
- g.DrawPath(Pen_gelb, gp)
- End Using
- End Using
- End If
- End Sub
- End Class
An die Neulinge: Nutzt
Option Strict On
und Option Infer Off
. Dadurch kommt ihr mit Datentypumwandlungen nicht durcheinander und der Code verbessert sich um Einiges! Solche Fehler à la Dim Beispiel As Integer = "123" können nicht mehr passieren.