Amrius
Anmeldungsdatum: 9. Februar 2006
Beiträge: 94
|
Hallo! Nachdem ich jetzt schon sehr lange danach gesucht und keine vernünftige Lösung gefunden habe versuche ich es einmal hier.
Kennt jemand ein Programm, mit dem ich sehr viele Fotos nach ihrem (überwiegenden) Farbton sortieren kann? Ich möchte einfach die Fotos aus verschiedenen Ordner laden und dann auf einen Blick sehen, welche Farben diese Fotos haben.
Im Prinzip ist das Programm ImageSorter genau das was ich suche- das läuft auch mit wine, schafft aber nicht mehr als ca. 4000 Fotos und stürzt dann ab (auch unter Windows)☹
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Hey, ich denke, mit bekommst du alles, was du brauchst, das kannst du dann in einem Skript nach deinen Vorstellungen zur Sortierung verwenden. Grüße Frink
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Um das vielleicht noch etwas detaillierter auszuführen; Ich weiß jetzt nicht sicher, ob dieser Vorschlag den gewünschten Effekt hat, aber mit | identify -verbose bild | grep Red -A 4 | grep Mean | grep -oR "[0-9]*\.[0-9]*" | head -n 1
|
bekommst du den Mittelwert vom Rot-Channel von "bild", ensprechend von grün und und blau. Dann fragst du welcher Wert für das Bild am größten, zweitgrößten, drittgrößten ist, dann hast du insgesamt 6 Listen mit Dateien, für die die Reihenfolge "(stärkster,zweitstärkster,drittstärkster)" jeweils gleich ist, diese sortierst du dann intern nach den Werten dieser Tripel. Ich könnte mir vorstellen, dass das schon den Effekt hat, den du dir wünschst, aber getestet habe ich es nicht. Grüße Frink
|
aasche
Anmeldungsdatum: 30. Januar 2006
Beiträge: 14259
|
Ich meine mich zu erinnern, dass Darktable irgendwie nach Farben sortieren kann. Kann aber sein, dass Farblabels zuerst manuell vergeben werden muessen.
|
Amrius
(Themenstarter)
Anmeldungsdatum: 9. Februar 2006
Beiträge: 94
|
@Prof. Frink: Danke für den Vorschlag! Aber ich hätte es schon gerne grafisch, weil ich mir einfach einmal einen Überblick verschaffen möchte, in welchen Farbtönen ich Fotos habe...
@aasche: Ich habe das ausprobiert, aber es ist leider so wie du vermutet hast: Ich muss den Fotos erst einmal "Farbmarkierungen" vergeben und kann dann nach diesen Markierungen filtern.
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Amrius schrieb: @Prof. Frink: Danke für den Vorschlag! Aber ich hätte es schon gerne grafisch, weil ich mir einfach einmal einen Überblick verschaffen möchte, in welchen Farbtönen ich Fotos habe...
Na ja, wenn du die Daten erstmal erzeugt hast, brauchst du nur noch ein Programm, das in der Lage ist, die Bilder, nach diesen Daten zu sortiert, anzuzeigen (zum Beispiel könnte man die Daten in Tags schreiben, oder Links auf die Dateien erzeugen, die so heißen, dass sie in alphabetischer Sortierung die gewünschte Übersicht ergeben, etc. etc., da müsstest du mal gucken, wie man das mit deinem Standard-Fotoverwaltungsprogramm am besten realisiert.). EDIT:
Amrius schrieb: Ich habe das ausprobiert, aber es ist leider so wie du vermutet hast: Ich muss den Fotos erst einmal "Farbmarkierungen" vergeben und kann dann nach diesen Markierungen filtern.
Wenn die Vergebung dieser Farbmarkierung irgendwie automatisiert zugänglich ist, das heißt, dass man die Daten mit einem Skript übergeben kann, dann kannst du ja meinen Vorschlag mit dem von aasche kombinieren und bist fertig.
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Prof. Frink schrieb: Wenn die Vergebung dieser Farbmarkierung irgendwie automatisiert zugänglich ist, das heißt, dass man die Daten mit einem Skript übergeben kann, dann kannst du ja meinen Vorschlag mit dem von aasche kombinieren und bist fertig.
Und ja das geht; Darktable legt über jede geladene Bilddatei eine Datei Dateiname.typ.xmp an, in der der Abschnitt <darktable:colorlabels> auftaucht, zum Beispiel so: <darktable:colorlabels>
<rdf:Seq>
<rdf:li>0</rdf:li>
<rdf:li>3</rdf:li>
</rdf:Seq>
</darktable:colorlabels> in diesem Beispiel habe ich Markierung 0 (rot) und 3 (blau) gesetzt. Jetzt musst du nur überlegen ob dir diese 6 Schalter zur Sortierung ausreichen, das ist immerhin schon ein großer Informationsverlust.
|
diesch
Anmeldungsdatum: 18. Februar 2009
Beiträge: 5072
Wohnort: Brandenburg an der Havel
|
Was stellst du dir denn unter dem Farbton eines Bildes vor? Welchen Farbton hat z.B. ein Bild, das zu gleichen Teilen blau, rot und gelb ist?
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Noch mal zur Sortierung nach Farbtönen (das klingt jetzt vielleicht abstrakt, ist aber ganz einfach): Meinen ersten Vorschlag würde ich wieder verwerfen und das ganze systematischer angehen: Bei dem Prozess handelt es sich eigentlich um einfache geometrische Aufgaben im RGB-Farbraum: Willst du zum Beispiel von hell nach dunkel sortieren, definierst du dir die Hauptdiagonale RGB(a)=(a,a,a), a in [0,255], wobei 0 schwarz bedeutet und 255 weiß, dann bestimmst du die Projektionen a_i deiner wie oben ermittelten Punkte (r,g,b) auf diese Gerade und sortierst die Bilder nach a_i.
Bei einer solchen linearen Anordnung gehen natürlich viele Informationen verloren, wenn man überhaupt keinen Verlust will, muss man halt bei der 3d-Darstellung bleiben, aber das ist dann auch wieder unübersichtlich. Ein Zwischending ist die Projektion auf eine Ebene, dann kann man die Bilder später in einem Rechteck sortiert angezeigt bekommen, dabei kann man eine beliebige Ebene im 3d-Farbraum auswählen, bestimmt wieder die Projektionen (a_i,b_i) und ordnet die Bilder in einem Rechteck nach diesen Koordinaten an.
Mit den "Farbmarkierungen" in Darktable ist die Sitution noch schlechter als eine Gerade, man würde also sich eine Gerade in den Farbraum legen, die Projektionen bestimmen und dann auf der Geraden 6 Bereiche definieren und die Markierungen danach vergeben, in welchem Bereich die Projektion liegt. Die Frage ist nur, ob dir das reicht. EDIT:
Das sollte auch die Frage von diesch beantworten: diesch schrieb: Was stellst du dir denn unter dem Farbton eines Bildes vor? Welchen Farbton hat z.B. ein Bild, das zu gleichen Teilen blau, rot und gelb ist?
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Irgendwie lässt es mir ja keine Ruhe ☺. Also ich würde es jetzt so machen:
Schreibe ein Skript in der Form skript ordner "r1,g1,b1" "r2,g2,b2", das einen Ordner ordner übergeben bekommt, sowie einen Start "r1,g1,b1" und Endpunkt "r2,g2,b2", die die Gerade im RGB-Raum definieren
dann durchsucht das Skript rekursiv ordner nach Bilddateien (Dateiendungen), bestimmt mit identify den RGB-Mittelwert (r0,g0,b0), berechnet die Projektion auf gerade(a)=(r1-r2,g1-g2,b1-b2)*a+(r2,g2,b2), a von 0 bis 1 also das a, für das der Abstand
d[(r0,g0,b0),gerade(a)]= \[Sqrt]((-b0 + a (b1 - b2) + b2)^2 + (-g0 + a (g1 - g2) +
g2)^2 + (-r0 + a (r1 - r2) + r2)^2)
minimal wird, erstelle einen Ordner r1,g1,b1_r2,g2,b2_ordner erzeuge eine Verlinkung von der betrachteten Datei auf ./r1,g1,b1_r2,g2,b2_ordner/a_bildname, lade den Ordner in Darktable und wähle "nach Namen sortieren", fertig.
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Da es ja nicht so lange dauert, habe ich das Skript gleich auch noch geschrieben; ich hoffe, du benutzt es auch ☺. Funktioniert ganz gut, dauert nur recht lange, da identify so lahm ist. 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 | #!/bin/bash
#Aufruf: bash skriptname "Pfad zum Ordner" r1 g1 b1 r2 g2 b2
find "$1" -iname "*.jpg" > files.txt
#Start- und Endpunkte lesen
r1=$2
g1=$3
b1=$4
r2=$5
g2=$6
b2=$7
#Ordner erzeugen
base=$(basename $1)
folder=$(echo "${r1}-${g1}-${b1}_${r2}-${g2}-${b2}-$base")
if [[ ! -d $folder ]];then
mkdir $folder
fi
while read file; do
#Mittelwert lesen
#(r0,g0,b0) einlesen
identify -verbose "$file" | grep -A 15 "Channel Statistics:" > aux.txt
r0=$(grep -A 3 "Red" aux.txt | grep "Mean" | grep -oR "[0-9]*\.[0-9]*" | head -n 1)
g0=$(grep -A 3 "Green" aux.txt | grep "Mean" | grep -oR "[0-9]*\.[0-9]*" | head -n 1)
b0=$(grep -A 3 "Blue" aux.txt | grep "Mean" | grep -oR "[0-9]*\.[0-9]*" | head -n 1)
#Projektion berechnen
value=$(bc <<EOF
define phi(r0,g0,b0,r1,g1,b1,r2,g2,b2) {
a=0
old=sqrt(((-b0 + b2)^2 + (-g0 + g2)^2 + (-r0 + r2)^2))
while(a<1){
d=sqrt(((-b0 + a*(b1 - b2) + b2)^2 + (-g0 + a*(g1 - g2) +g2)^2 + (-r0 + a*(r1 - r2) + r2)^2))
if(d<old){min=1000*a}
a+=0.001
old=d
}
return min
}
phi($r0,$g0,$b0,$r1,$g1,$b1,$r2,$g2,$b2)
EOF
)
#Ein bisschen was zum Gucken, was so passiert:
echo -e "${value%.000} \t $file"
#Verlinkung erzeugen
base=$(basename "$file")
ln -s "$file" "./$folder/${value%.000}_${base}"
done < files.txt
#Hilfsdateien löschen
rm files.txt aux.txt
|
... das einfach in einer Datei, zum Beispiel rgb speichern, dann ausführen um das Skript ausführbar zu machen, dann entweder in einen Systempfad verschieben, oder zum Beispiel ./rgb "~/Bilder/Ordner 1" 0 0 0 255 255 255 ausführen ("./" entfällt, wenn das Skript über $PATH gefunden wird), um von hell, nach dunkel zu sortieren, um zum Beispiel nach Blaustufen zu sortieren lauten die sechs Zahlen: 0 0 0 0 0 255 oder um von rot nach blau zu sortieren 255 0 0 0 0 255 usw. Die ersten drei Zahlen sind der Startpunkt im RGB-Raum, die letzten der Endpunkt, dass Skript ordnet dann jeder Datei einen Wert zwischen 0 und 1000 auf dieser Geraden zu und erstellt im lokalen Verzeichnis einen Ordner 255-0-0_0-0-255_alterordner in diesem liegen dann symbolische Verlinkungen auf die gelesenen Dateien, deren Name mit der berechneten Zahl anfängt, also zum Beispiel 445_moto_0341.jpg 555_moto_0348.jpg 637_moto_0344.jpg 659_moto_0350.jpg
536_moto_0345.jpg 555_moto_0356.jpg 644_moto_0346.jpg 674_moto_0353.jpg
545_moto_0342.jpg 624_moto_0347.jpg 645_moto_0354.jpg 723_moto_0355.jpg
550_moto_0357.jpg 632_moto_0343.jpg 647_moto_0349.jpg Diesen Ordner lädst du in Dartable und wählst nach "Dateinamen sortieren".
Wenn du immer nach derselben Geraden sortieren willst, kannst du am Anfang des Skriptes
r1=$2
g1=$3
b1=$4
r2=$5
g2=$6
b2=$7
durch etwa
r1=0
g1=0
b1=0
r2=255
g2=255
b2=255
oder die Kombination deiner Wahl ersetzen, dann vereinfacht sich der Aufruf zu Wenn du nicht .jpg Dateien behandeln möchtest, sondern etwa .png ersetzt du das jpg in der Zeile | find "$1" -iname "*.jpg" > files.txt
|
halt durch png. Auf meinem alten Rechner hier, läuft das Skript recht langsam, da identify recht lahm ist, aber die Sortierung funktioniert gut und man muss es für jede Gerade pro Ordner ja nur einmal ausführen. Viel Spaß Frink
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Ich sehe gerade, dass in dieser Konfiguration noch viele Dateien, denselben Wert zugeordnet bekommen, um genauer zu werden, zum Beispiel bis auf 100 000 Werte (dauert auch nicht viel länger) die entsprechenden Zeilen durch folgende ersetzen: | if(d<old){min=100000*a}
a+=0.00001
|
und | echo -e "${value%.00000} \t $file"
|
sowie | ln -s "$file" "./$folder/${value%.00000}_${base}"
|
Peace.
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
Habe es gerade noch mal auf nem anderen Rechner probiert, aber da kamen Fehler, wie (standard_in) 13: syntax error. Das liegt an identify, das Skript oben wurde mit Version ("identify -version") "GraphicsMagick 1.3.12 2010-03-08" erstellt und auf dem neuen Rechner läuft anscheinend "Version: ImageMagick 6.6.9-7 2012-08-17", was mich sehr wundert, denn beides ist Ubuntu 12.04 nur einmal 64, dann 32 bit.
Jedenfalls sieht die Ausgabe unter letzterer Version etwas anders aus, sodass, die entspechenden Zeilen nach | identify -verbose "$file" | grep -A 20 "Channel statistics:" > aux.txt
r0=$(grep -A 3 "Red" aux.txt | grep "mean" | grep -oR "[0-9]*\.[0-9]*" | head -n 1)
g0=$(grep -A 3 "Green" aux.txt | grep "mean" | grep -oR "[0-9]*\.[0-9]*" | head -n 1)
b0=$(grep -A 3 "Blue" aux.txt | grep "mean" | grep -oR "[0-9]*\.[0-9]*" | head -n 1)
|
geändert werden mussten. Bevor man das Skript erstmalig startet, sollte man mit einer Testdatei test.jpg überprüfen ob man mit | identify -verbose "test.jpg" | grep -A 15 "Channel Statistics:" | grep -A 3 "Blue" | grep "Mean" | grep -oR "[0-9]*\.[0-9]*" | head -n 1
|
eine Ausgabe (eine Zahl) bekommt, wenn nicht kann man das Skript so nicht verwenden. Auf meinem 64-bit System mussten die Änderung, wie -A 20 statt 15 und "mean" statt "Mean" durchgeführt werden, wenn man diese Variante bentutzt, sollte man mit
| identify -verbose "test.jpg" | grep -A 20 "Channel statistics:" | grep -A 3 Blue | grep mean | grep -oR "[0-9]*\.[0-9]*" | head -n 1
|
eine Ausgabe bekommen.
Auf jeden Fall Versionen vergleichen, mit testfile probieren, beim ersten Skript-Lauf "Strg+C" bereithalten, nicht gleich einen riesigen Ordner auswählen und gegebenenfalls die Verarbeitung der identify-Ausgabe an die eigene anpassen. EDIT: Im Anhang noch ein Beispiel, in dem nach Helligkeit (0 0 0 255 255 255) sortiert wurde und der Hinweis, dass relative Pfade derzeit nicht funktionieren, weil die Links dann falsch gesetzt werden.
- Bilder
|
aasche
Anmeldungsdatum: 30. Januar 2006
Beiträge: 14259
|
Waere ein solches Skript nicht etwas fuer einen eigenen Wiki-Artikel?
|
Prof._Frink
Anmeldungsdatum: 29. Mai 2010
Beiträge: 1096
|
aasche schrieb: Waere ein solches Skript nicht etwas fuer einen eigenen Wiki-Artikel?
Jo, eigentlich schon. Wenn da Interesse ist, würde ich wenn ich mit meiner Prüfung durch bin (habe gerade nicht so viel Zeit), das noch mal überarbeiten, Sortierung nach einer Fläche implementieren, schneller machen (Vielleicht auch mit C-Code ?), für die Verwendung mit mehr Programmen optimieren usw. und dann könnte ich einen Artikel darüber schreiben. Grüße Frink
|