LowLevelGraphicsLibrary

dr4g0n76
EDIT 26.04.2012:

Lange nicht alle Menüpunkte funktionieren und das Rechteck das man mit der Maus aufziehen kann hat momentan auch keine Funktion... aber alles im entwickeln

Die wichtigsten Funktionen und Kürzel:

Fenster
CTLR-N -> neues Fenster aufmachen
STRG-ALT-C -> Fenster kaskadieren
STRG-ALT-H -> Horizontal anordnen
STRG-ALT-V -> Vertikal anordnen
New Window (open copy) -> vom aktuellen Fenster aus eine Kopie in einem neuen Fenster erstellen
New Window (last loaded) -> neues Fenster mit dem zuletzt geladenen Bild

Filter
CTRL-F -> Filter ausführen

Windows->Script:

Filter ausführen (oberer Execute-button)
hier auch Kanal auswählen, A,R,G,B, Mask (unterer Execute-button)

Oder direkt im Menü entsprechenden Filter auswählen

Lambdaausdrücke:
Oben im Filter eingeben oder aus Combobox auswählen

Menüpunkt Windows->Script: Script ausführen....

Bilder verknüpfen/Contextmenü oder Toolleiste:
Bilder im Fenster aus Childwindowliste auswählen...

EDIT: 17.01.2012

Hier gibt's ab jetzt kleine Tutorials usw. über diese Library:

 http://lowlevelgraphicslibrary.blogspot.com/


[B]EDIT: 22.04.2010
Als Dateianhang am Ende dieses Beitrags verfügbar.

Es wird immer mal wieder von mir ein Testprojekt hochgeladen, aber das wird nicht explizit hier jedesmal vermerkt.


EDIT: Prerelease Versionen gibt es immer - wenn vorhanden - hier:

Anmerkung: Ich behalte mir vor, die Datei umzubenennen oder herauszunehmen.



Der Code kann jetzt hier
heruntergeladen werden (s. Ende dieses Posts).

Achtung: Das Projekt ist noch nicht gegen Fehler getestet.



Zudem hat die Basis Klasse das Interface IFilter bekommen.

Dieses wird beinhalten:

- Steps (Quasi Pixel in X-Richtung und Y-Richtung überspringen)
- Rectangle (Ausschnitt auswählen, auf den der Filter angewendet werden kann)
- einige grundlegende Funktionen wie in der System.Drawing.Bitmaps-Klasse z.B. Height / Width, GetPixel / SetPixel

Was schon drin ist:

Einige Experimentelle Filter:

- Neue Filter, z.B. Background-Estimation
- Farben runden
- Segmentierungen

- Colorspaces, Umrechnungen von RGB in verschiedene Farbräume und zurück u.a.
YUV, YCbCr, HCL, HSV, XYZ, CIELUV, CIELAB usw.

- verschiedene Kantenfilter und ein neuer Konturfilter
- verschiedene rudimentäre Segmentierungsfilter.

- Viele statische RGB-Funktionen unter ColorFunctions wie z.B. Summe der Channels,
MaxChannel, MinChannel, Channels vertauschen per String z.B. mach BGG oder RBG oder BGR aus Original RGB, Channel-Ratio,
usw. alle diese Funktionen sind in ColorFunctions ausprogrammiert.

- BitmapFunctions-Klasse um ein Bild auf verschiedene Arten z.B. in einen Stream oder Byte-Array und wieder zurück umzuwandeln, zu resizen und zu rotieren.

Einen Filter benutzen:

C#-Code:
Bitmap bitmap = (Bitmap)Image.FromFile("blub.jpg");
IFilter filter = new GrayScale();
filter.Execute(bitmap);

Die erste Zeile lädt das Bild,
die 2. Zeile instantiiert den Filter.
Dann wird der Filter angewendet

Zur Ausführung gibt es 3 Möglichkeiten:


1.) void Execute(bitmapSource);
Führt den Filter aus und bitmapSource enthält die neuen - veränderten - Informationen

2.) Bitmap ExecuteCloned(bitmapSource);
Führt den Filter geclont aus, d.h. bitmapSource wird nicht verändert, und die veränderte Bitmap wird zurückgegeben.


3.) void ExecuteMasked(bitmapSource, bitmapMask);
Führt den Filter aus und er wird nur an den Stellen angewendet in dem im Maskenbild weiße Pixel sind.

EDIT:

Als nächstes gibt es dann noch die Möglichkeiten:

4.) ExecuteChannelled

Für jeden Kanal kann angegegeben werden, ob das Ergebnis übernommen wird.

5.) ExecuteMaskedChannelled

Für jeden Kanal kann in Bezug auf die Maske angegeben werden, ob das Ergebnis übernommen wird.

EDIT: 4. und 5 sind jetzt implementiert.


Abkürzung des obigen Codes:

C#-Code:
new GrayScale().Execute(bitmapSource); //Bild in Grau umwandeln.

Es gibt bisher ( mind.) folgende

Filterkategorien:

- Farb-filter
- Konvolutions-Filter
- Morphologie-Filter
- Histogramm-Filter
- Kanten-Filter
- Ecken-Filter
- Frequenz-Filter
- Binarisierungs-Filter (Thresholding)
- Kontur-Filter
- Korrektur-Filter
- Korrelations-Filter
- Deplatzierungs-Filter
- Segmentierungs-Filter
- Makro-Filter
- Textur-Filter
- Mathematische Filter (algebraisch, logisch)

Über ein UnsafeBitmap Objekt kann auf einfache und schnelle Weise auf ein Bitmap zugegriffen und es verändert werden:

C#-Code:
UnsafeBitmap bitmap = new UnsafeBitmap(_bitmapSource);
//hier die Veränderungen durchführen
bitmap.Dispose(); //Und dann unbedingt Dispose aufrufen, um den Lock wieder freizugeben.

UnsafeBitmap bekommt als Eingang die originale Bitmap übergeben.
Dann wird intern alles durchgeführt um Unsafe auf die Bitmap zugreifen zu können.
Von außen sieht es aber aus, als würden wir ganz normal zugreifen.

C#-Code:
            List<Color> m_aColor = new List<Color>();
            m_aColor.Add(Color.FromArgb(255,255,255));

            UnsafeBitmap bitmap = new UnsafeBitmap(_bitmap);
            for (int y = 0; y < bitmap.Height; y++)
            {
                for (int x = 0; x < bitmap.Width; x++)
                {
                    Color color = bitmap.GetPixel(x, y);
                    if (!m_aColor.Contains(color))
                    {
                        bitmap.SetPixel(x, y, m_ColorToReplaceWith);
                    }
                }
            }
            bitmap.Dispose();

ImageRecognition2.rar (3 MB, 42 mal heruntergeladen)


Hinweise:

Was tut sich aktuell?

EDIT: 15.03.2012

Aktuell geht es um alles fürs Vermessen und die Erkennung von Bildern, was eingebaut wird.

- Neuronale Netzwerke
- Snakes / Active Contours

3D:

- Parität / Depthmap
- Stereo: Anaglyph / Interlaced / 3d-Modellschätzung
maxE
Ganz nett, aber man könnte die Lib noch etwas mehr in Richtung OO bringen. Alle Filter sind einfache statische Funktionen. Kann es sein, dass du die aus einer ehemaligen C Library konvertiert hast?
Die Filter könnte man übrigens prima als Plugin in Paint.NET integrieren Augenzwinkern  http://www.eecs.wsu.edu/paint.net/
Quallo
Klingt nach einer Menge Arbeit! Super das du das beisteuerst!
shady
irgendwie mekkert #Develop rum, wenn ich versuche den kram zu Kompilieren:

Zitat:
PFAD\cImageFilters.cs(35,4): error CS0227: Nicht gesicherter Code wird nur angezeigt, wenn mit '/unsafe' kompiliert wird

Das kommt überall da vor wo mit unsafe {} gearbeitet wurde.
Beim Kompilieren wird nur die .manifest Datei erstellt.
Wie kann ich das Lösen?
S.H.-Teichhof
Du musst in den Projekt Einstellungen Unsafe Code zulassen
shady
ok, sorry, da hab ich ja auch schon geguckt, ich hab die Option nur übersehen... großes Grinsen
tom-essen
Hallo!

Die Komponente gefällt mir sehr gut, Kompliment!
Kurze Frage von einem Nicht-Experten in Sachen Bildbearbeitung:
Gibt es bzgl. der abgefragten Werte z.B. für Helligkeit, Kontrast, Gamma, ... bestimmte Grenzwerte?

EDIT: OK, lässt sich im Quellcode ablesen (0..255).
tom-essen
Hallo!

Nächste Frage:
Wo ist der Unterschied zwischen cGraphics.cs und cImageFilters.cs (ist eine davon schneller oder genauer)?
ErfinderDesRades
Ist das Beispielprojekt [im neuen Download] iwie flötengegangen?
Bei mir findet sich nur ein Project, und zwar ganz ohne Property-Ordner - wo issn nun niedergelegt, dasses eine Dll ist, weil kommt beim Start schon die Fehlermeldung "Klassenbibliotheks-Projekt kann nicht StartProjekt sein"

Nee, flötengegangen auch nicht, verschiedene Forms sind ja noch vorhanden.
Also iwie ein unvollständiger Upload?
dr4g0n76
@ErfinderDesRades:

EDIT 18.12.2009: Das komplette Projekt kann im 1. Thread heruntergeladen werden.
ErfinderDesRades
Ohne Beispielprojekt findich schade, weil willichmal einen Blick reinwerfen, mussich erstmal iwas proggen, dassich ühaupt was zu sehen kriege.
Habich jetzt ja gemacht, und noch folgendes gefunden:

CGraphics scheint versehentlich dringeblieben, weil die Arbeit scheint ja CImageFilters zu machen.
Von den Forms ist nur FormMain im Designer darstellbar, allen anderen melden: "Method 'System.Windows.Forms.Form.CenterToParent' not found."
Bei vielen Filtern kommt ein Eingabefenster "Value eingeben", da kann man dann einen Value eingeben - nirgends ein Hinweis, was der Value bewirkt.

Und dass das Projekt keine Properties hat, scheint mir, wie gesagt, an einem fehlerhaften Upload zu liegen, odr?
dr4g0n76
EDIT 18.12.2009:

Das Projekt wird immer hier im 1. Post dieses Threads hochgeladen.
Es ist aber immer noch kein endgültiges Release angesagt.

Ich stelle einfach hier die Prerelease-Versionen zur Verfügung.
dr4g0n76
Preview:

Wie im angehängten Bild zu sehen, können beim nächsten Upload auch farbige Blobs anhand der Rechtecke ermittelt werden.

Bildanalyse:

Mit einem "JOIN" können Rechtecke ähnlicher Farben zu größeren Rechtecken verschmolzen werden.
dr4g0n76
Hier noch zum Vergleich das Originalbild:
dr4g0n76
Hier gibt's jetzt die Preview Applikation.

Der Code ist noch nicht gecleant und viele Filter sind noch mit Bitmap.SetPixel GetPixel implementiert und deswegen langsam.

Es ist eben noch ein Entwicklungsprojekt. Aber solange kann jeder ja mal damit rumspielen.

Fehler zu monieren hat momentan keinen Sinn. Die werden erst wichtig, wenn die neue Version komplett veröffentlicht wird.


Z.B. wird die Klasse ImageFilters noch in LowLevelGraphicsLibrary wandern, ebenso wie die Blobs usw.

EDIT: Graue Funktionen sind momentan nicht aktiviert/implementiert...

EDIT: Download s. oberster Post.
dr4g0n76
Hier ein Screenshot dazu:

Screenshot1.jpg
dr4g0n76
[EDIT] 18.12.2009:

- Viele neue Filter, z.B. Segmentierung
- Color-Blob-Extraktor mit neuem Verfahren
- ColorSpaces, Umrechnung von RGB in andere Farbräume...
- RGB-Funktionen (z.B. Abfrage auf RGB-Range, Maxchannel, Minchannel usw.)

Einfach dazu das Projekt im ersten Post dieses Threads herunterladen.
MagicAndre1981
Ich muss dir ein großes Kompliment machen, die Bibliothek ist einfach genial :)
dr4g0n76
@MagicAndre1981: Dankeschön. Das ist ein super Kompliment und erfreut mich ungemein. Läuft runter wie Öl. *verneig* :-)
dr4g0n76
Habe heute ein erstes Prerelease veröffentlicht. Damit man sich den Code schon mal anschauen kann. Und nein, der Code bleibt nicht so. An vielen Stellen wird es noch Änderungen und Optimierungen geben.

Die Syntax der Filter bleibt so.

Es wird noch ein ExecuteCloned hinzukommen, bei dem man das bearbeitete Bitmap als Ergebnis erhalten wird und das Original-Bild bleibt dabei wie es ist.