| |
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 |
|
|
sevAniGif (VB/VBA)
Anzeigen von animierten GIF-Dateien
Ab sofort lassen sich auch unter VB6 und VBA (Access ab Version 2000) animierte GIF-Grafiken anzeigen und abspielen, die entweder lokal auf dem System oder auf einem Webserver gespeichert sind. Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere 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
|
|