| |
VB.NET - FortgeschritteneUmriss um unregelmäßige Formen zeichnen | | | Autor: Preußen_Paul | Datum: 04.11.11 00:55 |
| Hallo alle zusammen !!!
Ich habe folgendes Problem bei dem ich nicht weiß wie ich vorgehen soll.
Ich möchte gern ein Graustufenbild (von einem Foto) in die einzelnen Flächen (Grautöne) zerlegen.
Flächen/Formen (Größe und Form unbekannt) sollen erkannt und die Farbe entfernt
und dafür der Umriss gezeichnet werden.
Ich hoffe ich konnte das erklären was mir Kopfzerbrechen macht.
Wenn einer hier eine Idee dazu hat bitte schreiben (Code,Links,Ratschläge,Fragen,etc.). | |
Re: Umriss um unregelmäßige Formen zeichnen | | | Autor: Manfred X | Datum: 04.11.11 05:17 |
| Hallo!
Photos, die in Grausstufen gewandelt werden, umfassen 256 Graustufen.
Eine bestimmte Fläche besteht dabei gewöhnlich nicht aus EINER
Graustufe, sondern sie variiert auch innerhalb einer Fläche.
Flächenbegrenzungen können deshalb nur über einen Schwellenwert
für die Grau-Differenz ermittelt werden, wobei der krit. Differenzwert umso
größer gewählt werden muss je stärker die Farbvarianz in der Fläche ist.
Hier eine triviale Funktion.
Public Shared Function GrauÜbergänge_Markieren _
(ByVal bmp_in As Bitmap,
ByVal ThresholdValue As Integer) As Bitmap
If bmp_in Is Nothing Then Return Nothing
'24 Bit-Bitmap erstellen
Dim gray As New Bitmap(bmp_in.Width, bmp_in.Height, _
Imaging.PixelFormat.Format24bppRgb)
Dim g As Graphics = Graphics.FromImage(gray)
g.DrawImage(bmp_in, 0, 0)
g.Dispose()
'MakeImageGrayscale(gray) optional, Funktion aus dem Net-Forum
Dim gray_rect As New Rectangle(0, 0, gray.Width, gray.Height)
' Bilddaten im Speicher sperren
Dim gray_data As Drawing.Imaging.BitmapData = _
gray.LockBits(gray_rect, Drawing.Imaging.ImageLockMode.ReadWrite, _
gray.PixelFormat)
' Array für Bitmapdaten in geeigneter Größe erstellen
Dim gray_bytes As Integer = gray_data.Stride * gray.Height
Dim gray_array(0 To gray_bytes - 1) As Byte
Dim marker_array(0 To gray_bytes - 1) As Byte
For i As Integer = 0 To marker_array.Length - 1
marker_array(i) = 255
Next i
' Die Bitmapdaten in das Array kopieren
Runtime.InteropServices.Marshal.Copy _
(gray_data.Scan0, gray_array, 0, gray_bytes)
Dim ystart As Integer = 0, yende As Integer = gray.Height - 1
Dim xstart As Integer = 0, xende As Integer = gray.Width - 1
Dim stride As Integer = gray_data.Stride
Dim centervalue As Byte
'DoppelSchleife (Indices = Pixelbezogen)
For y As Integer = ystart + 1 To yende - 1
For x As Integer = xstart + 1 To xende - 1
'Umrechnung auf eindimensionales Byte-Array
'(3 Bytes/Pixel in x-Richtung)
centervalue = gray_array(y * stride + x * 3)
'Schleife über Nachbarpixel
For y1 As Integer = y - 1 To y + 1
For x1 As Integer = x - 1 To x + 1
If Math.Abs(CInt(gray_array(y1 * stride + x1 * 3)) _
- centervalue) > ThresholdValue Then
marker_array(y * stride + x * 3) = centervalue
marker_array(y * stride + x * 3 + 1) = centervalue
marker_array(y * stride + x * 3 + 2) = centervalue
Exit For
End If
Next x1
Next y1
Next x
Next y
' Das Markerarray zurück-kopieren
Runtime.InteropServices.Marshal.Copy _
(marker_array, 0, gray_data.Scan0, gray_bytes)
With gray
.UnlockBits(gray_data)
End With
Return gray
End Function | |
Re: Umriss um unregelmäßige Formen zeichnen | | | Autor: Preußen_Paul | Datum: 05.11.11 01:10 |
| Hallo Manfred X !!!
Danke für den Code den du eingestellt hast. Jedoch ist es nicht das was ich suche/brauche.
Ich habe wohl auch ein paar Sachen vergessen zu erwähnen.
Folgenden Ablauf habe ich bereits.
- Das Bild in eine Picturebox laden
- Ein farbiges Bild auf Graustufen umwandeln
- Die Graustufen auf einen beliebigen Wert (durch User bestimmt) zwischen 1 und 255 "herabstufen" (meistens arbeite ich mit 10 oder 20 Graustufen zum testen)
- danach werden einzeln stehende Pixel ersetzt durch einen angrenzenden Grauton
Was ich jetzt suche/brauche ist die Möglichkeit z.B. die Fläche vom Grauton 10 oder 5 oder 8 als Fläche(n) zu erkennen und den (die) Umriss(e) zu zeichnen.
Es soll so ähnlich sein wie bei Grafikprogrammen der Zauberstab der dir bestimmte Flächen markiert.
Am Ende soll das ganzen Bild in einzelnen Flächen (ohne Farbfüllung) erscheinen.
Ich hoffe ich konnte jetzt besser ausdrücken was mein Problem ist.
Mit bestem Dank
Der Preußen_Paul | |
Re: Umriss um unregelmäßige Formen zeichnen | | | Autor: Manfred X | Datum: 05.11.11 06:18 |
| Hallo!
Eigentlich macht diese Funktion genau das.
Mit welchem Bildformat für die graureduzierten
Bilder arbeitest Du? Format8BPPIndexed?
In dem Fall muss man diese Funktion geringfügig ändern.
Du könntest einen zusätzlichen Parameter einführen,
der die Graustufe angibt. Bei einem indizierten
Bildformat wäre das der Palettenindex - bei einer
16,24,32er Farbtiefe der Grauwert im Bereich 0-255.
Im Code ist dann eine zusätzliche Abfrage (Vergleich
des Bytewertes im Array mit dem Parameterwert) erforderlich.
[I]Am Ende soll das ganzen Bild in einzelnen Flächen
(ohne Farbfüllung) erscheinen.[/I]
Ich interpretiere das so: Das Bild soll weiss bleiben und
nur die Flächenumrisse sollen als Linien gezeichnet werden.
Stimmt das?
Im übrigen: Grafik-Aufgaben erfordern erfordern meist sehr
komplexe Programme.
MfG
Manfred | |
Re: Umriss um unregelmäßige Formen zeichnen | | | Autor: Zardoz | Datum: 06.11.11 19:29 |
| Hallo Preußen_Paul,
kennst du dich mit Apis aus? Erstelle für jede
Farbe eine Region. Anschliessend kannst du die
Umrisse mit FrameRgn zeichnen. Region erstellen:
Alle Pixel der Grafik durchgehen und mit CreateRectRgn
und CombineRgn die Region zusammensetzen.
Gruss,
Zardoz
Gruss,
Zardoz | |
Re: Umriss um unregelmäßige Formen zeichnen | | | Autor: bauer | Datum: 14.11.11 10:49 |
| Irgendwie scheint hier so was in der Art "cartoonizer" gefordert zu sein.
Siehe z.B. dort http://www.codeproject.com/KB/vb/Cartoonizer.aspx
Soweit ich mich entsinne (der letzte Bugfix dazu stammt eh von mir) war da auch eine "Rändererkennung" drin.
Ansonsten stimmt die Aussage von Manfred_X, Graphikalgorithmen in dieser Art sind nicht mehr ganz trivial.
Weitere Anmerkung: .NET Algorithmen sind meist deutlich langsamer als Coding in C / C++.
Viel Erfolg. | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere Infos
|
|
|
Copyright ©2000-2024 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|