2014-12-06 3 views
20

Ich versuche, etwa die Fläche mit Bäumen gegeben ein statisches Kartenbild (linkes Bild) bedeckt zu finden.Wie erkenne ich Bäume in einem Google Maps-Bild mithilfe der Bildverarbeitung?

Die Methode, die ich die beteiligten Tun Pixel gedacht für Pixel Analyse des Bildes zunächst das „grüne“ Pixel herauszufinden (das HSV-Farbschema mit dem Farbtonwert zu extrahieren).

Ich erkennen, dass während der Morgen- oder Abenddämmerung in einigen Bildern, die Bäume haben kein grün in der Tat, und können nur dunkelgrau-ish/schwarz erscheinen. Während diejenigen, die während des Mittags genommen, aufhellen green.So Ich versuchte Bild Schwelle mit und bekam anständige Ergebnisse (rechtes Bild):

Aber ich bin immer noch nicht zufrieden als Schatten von Gebäuden oder dunkle Objekte können mir falsche Positive geben.

Ich mag würde die Erfahrung einiger Entwickler hier auf Stack-Überlauf verwenden, und die Bildbearbeitungswerkzeug und Ansatz würde vorschlagen, geben Sie mir die besten Ergebnisse in einem solchen Szenario?

+0

Die anspruchsvolleren Methoden neigen dazu, einen Infrarotkanal zu verwenden, in dem Biomasse stark emittiert - Google NDVI (Normalisierter Unterschiedsvegetationsindex), aber leider haben Sie nicht diese zur Verfügung. Eine andere Option ist Texturanalyse. –

+0

@MarkSetchell: Sind qualitativ hochwertige Infrarotkarten kostenlos online verfügbar? Ich könnte dann google maps alle zusammen abgraben. –

+2

Google Map Engine unterstützt Baumfilterung (ich erinnere mich). – wf9a5m75

Antwort

17

Das Problem mit -threshold Y% ist dies: es wird alle Pixel, die dunkel genug sind, in schwarz zu übersetzen!

Sollten Sie eine andere dunkle Farbe (dunkelbraun, dunkelblau, dunkelrot, dunkelgrau oder schwarz) in Ihrem Bild haben, werden Sie es fälschlicherweise als "Holz" identifizieren.

Wenn ich Sie richtig verstehe, suchen Sie nur diejenigen Pixel für, die von einer Art von grün oder dunkelgrün.

Dafür würde ich zu Benchmark Ihren eigenen Ansatz mit einem gewissen Variante des folgenden Befehls vorschlagen:

compare        \ 
-size 600x600      \ 
-fuzz 30%       \ 
    http://i.stack.imgur.com/kqMtt.png \ 
    xc:'darkgreen'      \ 
    output-1.png  

Statt ‚dunkelgrün‘ Sie den jeweiligen Farbwert von ‚# 006400‘ verwenden könnten, ist es das gleiche:

compare        \ 
-size 600x600      \ 
-fuzz 30%       \ 
    http://i.stack.imgur.com/kqMtt.png \ 
    xc:'#006400'      \ 
    output-2.png  

Der obige compare Befehl erzeugt eine output-1.png aus den beiden Eingangsbildern mit folgenden Merkmalen:

  1. ein Vergleich des Originalbildes mit einem dynamisch erzeugten (xc:) 600x600 Pixel-Patch mit einheitlicher Farbe "dunkelgrün";
  2. Die Ausgabe zeigt das Originalbild als blassen Hintergrund;
  3. Die Ausgabe zeigt rote Pixel, wobei die entsprechenden Pixel des Originalbildes nach einem 'Fuzz - Faktor' von 30% vom Farbwert 'dunkelgrün' abweichen (wobei '0%' genau entspricht Farbwert);
  4. der Ausgabe zeigt, weiß/halbtransparenten Pixel, wo die jeweiligen Pixel des Originalbildes auf die Farbe ähnlich ‚dunkelgrün‘ (innerhalb eines Fuzz-Faktor von 30%).Hier

ist das Ergebnis in einer Side-by-Side-Vergleich:

Side by side comparison of original image with resulting image. The original image serves as a pale background. Red pixels show up where the original image is NOT 'darkgreen' within 30% fuzz factor.

Sie natürlich mit dem Flaum Faktor sowie mit der genauen Definition des Begriffs ‚dunkelgrün‘ Farbe spielen Wert. Hier ist das Ergebnis für -fuzz 25%:

Side by side comparison of original image with resulting image. The original image serves as a pale background. Red pixels show up where the original image is NOT 'darkgreen' within 25% fuzz factor.

Wenn Sie den Vergleich der Farben invers zeigen (rote Pixel gezeigt, wo das Originalbild hatte grünliche Farben, transparent/weiß sind, wo Pixel waren nicht-grün) die umgekehrte Farbe ‚dunkelgrün‘, wie ein Vergleich Patch zu verwenden (das ist eine Art von rosa, BTW), und ein anderer Fuzz Faktor:

compare        \ 
-size 600x600      \ 
-fuzz 70%       \ 
    http://i.stack.imgur.com/kqMtt.png \ 
    xc:'#ff9bff'      \ 
    output-3.png  

Das Ergebnis ist jetzt:

Side by side comparison of original image with resulting image. The original image serves as a pale background. Red pixels show up where the original image is not 'light-pink' (or IS 'darkgreen') within 25% fuzz factor.

Wenn Sie die Ausgabe auf NICHT das Originalbild als blassen Hintergrund zeigen, dann -compose src auf Ihren Befehl (e):

compare        \ 
-size 600x600      \ 
-fuzz 70%       \ 
    http://i.stack.imgur.com/kqMtt.png \ 
    xc:'#ff9bff'      \ 
-compose src      \ 
    output-4.png  

Side by side comparison of original image with resulting image. The original image serves no longer as the pale background picture. Red pixels show up where the original image is not 'light-pink' (or IS 'darkgreen') within 25% fuzz factor. White pixels are the ones which were non-greenish in the original image.

Sie können auch Ändere die Farbe Rot, die die "Delta" -Pixel in eine andere Farbe hebt. So verwenden Sie Schwarz:

compare        \ 
-highlight-color black    \ 
-size 600x600      \ 
-fuzz 60%       \ 
    http://i.stack.imgur.com/kqMtt.png \ 
    xc:'#ff9bff'      \ 
-compose src      \ 
    output-5.png  

Sie könnten jetzt das Ergebnis des letzten Befehls als "Maske" verwenden. Überlagern Sie diese Maske mit dem Originalbild und erstellen Sie sie so, dass die "Nur-Baum" -Teile des Bildes im Ergebnis erscheinen und alle anderen Teile entfernt werden.

+0

Danke für das Posten in so einer detaillierten Antwort! Ich hatte vor, Image Magick für die obige Aufgabe zu verwenden. Können Sie mir bitte sagen, mit welchem ​​Tool/welcher Sprache Sie den obigen Code geschrieben haben? –

+0

@ user3210476: Es gibt keine spezielle "Sprache", um obigen Code zu schreiben. Ich habe nur das ImageMagick-Kommandozeilenwerkzeug 'compare' und einige der dafür verfügbaren Optionen verwendet. Dieser Befehl kann innerhalb von 'Terminal.app' auf einem Mac OSX ausgeführt werden, in einer Terminal-Anwendung unter Linux oder Unix und in einem' DOS-Box'-Fenster ('cmd.exe') unter Windows .... –

+0

Ich plante es geben Sie mehr als nur eine positive Bewertung, hehe! Ich glaube, ich habe dank Ihrer Antwort das Werkzeug gefunden, nach dem ich gesucht habe. [paintopaqueimage] (http://php.net/manual/en/imagick.paintopaeimage.php) in Image Magick PHP –

Verwandte Themen