vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Erstellen von dynamischen Kontextmen?s - wann immer Sie sie brauchen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Umriss 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.).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

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