• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Mit ImageMagik Bild selektiv verändern

petit

Newbie
Hi zusammen,
ich arbeite schon länger mit ImageMagik, um Bilder in Batch-Programmen zu konvertieren.
Nun habe ich da Problem, dass Farbänderungen nur anhand der ganzen Bildinformation vorgenommen werden können.
Ich möchte das aber selektiv machen (Mittelbetont)
Beispiel: Ich habe ein Farb-Negativ (aus einem alten Foto-Negativstreifen) mit Bildrahmen und Perforation abfotografiert.
Dieses wandle ich nun um mit :

convert negativ.jpg -negate -channel all -normalize positiv.jpg

Das Ergebnis ist aber unbrauchbar, wenn ich Bildrahmen und Perforation als Vorlage habe.
Wenn ich das Bild vorher zuschneide, bekomme ich ein farblich sehr gutes und brauchbares Ergebnis.

Könnte ich nun eingrenzen, dass die Fuktionen nur auf den Bildmittelteil ansprechen, dann könnte ich sämtlische Bilder inkl. Rand und Perforation direkt und korrekt konvertieren. Als Endergebnis brauche ich unbedingt das ganze Bild mit Rand !
Geht so eine selektiv e Konvertierung mittels ImageMagik.
Das heisst, es wird vom ImageMagik vorab nur der Mittelteil des Bildes 'angesehen' und anhand dieser Werte wird dann das ganz Bild entsprechend konvertiert.

thanks for help :)
Pet
 

leanUX

Member
Hi petit,

man convert
spukt u.a. aus:
Code:
-region geometry     apply options to a portion of the imag

Z.B. bei einem Bild mit 1024x748 Pixeln z.B. würde der folgende Befehl

Code:
convert negativ.jpg -region 824x548+100+100 -negate -channel all -normalize positiv.jpg
die Aktion nur auf den Innenbereich anwenden, d.h. in diesem Beispiel würde ein Rand von 100 Pixeln unberücksichtigt bleiben. Wendet man die Operation nochmal auf neue Datei positiv.jpg an, so sieht das Ergebnis wieder aus wie das Ursprungsbild. Von daher sollte der Befehl hoffentlich das leisten was Du möchtest. Allerdings weiß ich nicht, ob die Breite und die Position des Rands bei Deinen Bildern immer konstant ist.
 
OP
P

petit

Newbie
Vielen Dank für den Tip.

Das Problem mit
convert negativ.jpg -region 824x548+100+100 -negate -channel all -normalize positiv.jpg
ist jedoch das, dass sich dann die Konvertierung nur auf den 'Regions' -Bereich auswirkt.

Ich bekomme einen korrekt korrigierten Bildausschnitt und der Rest bleibt unkorrigiert.

Ich suche aber eine Lösung wie z.B. bei einer Fotokamera.
Da wird meist (mittelbetont) die Belichtung erruiert und danach diese Belichtungs-Werte aufs ganze Bild angewendet.

Wie könnte ich so was umsetzen ? D.h. die Werte des mittleren Feldes nehmen (auslesen) und dann auf das ganze Bild anwenden.

Pet
 

RME

Advanced Hacker
Hallo petit,

Code:
-negate

replace each pixel with its complementary color.

The red, green, and blue intensities of an image are negated. White becomes black, yellow becomes blue, etc. Use +negate to only negate the grayscale pixels of the image.
Mit anderen Worten: dies hat mit

Ich suche aber eine Lösung wie z.B. bei einer Fotokamera.
Da wird meist (mittelbetont) die Belichtung erruiert und danach diese Belichtungs-Werte aufs ganze Bild angewendet.
nichts zu tun.

Gruss,
Roland
 
OP
P

petit

Newbie
Natürlich meine ich nur die 'Messmethode' einer Kamera, da gibts (für Fotografen bekannt) von Mehrfeld- über Selektiv-, Spot- bis eben auch Mittenbetonte Messmöglichkeiten. D.h. es wird vom ganzen Bilde nur ein bestimmter Teil 'angeschaut' und danach die Belichtungswerte auf das ganze Bild angewendet.

Ich hab hier mal meine Examples:

Das Original Negativ mit Rand
a.jpg


mit convert über das ganze Bild (Das möchte ich , jedoch mit korrekten Farben)
b.jpg


mit convert und -region (hier stimmen die Farben, aber leider nur in einem Bereich)
c.jpg


... und hier, wenn ich vorab das Bild zuschneide und dann konvertiere (hier stimmen die Farben auch, aber ich musste das Bild vorab zuschneiden)
d.jpg


Pet
 
A

Anonymous

Gast
Ganz ohne Zuschneiden und einen neuen Rand setzen geht es nicht. Das Problem ist hier die Option -normalize, die sich in diesem Fall hier an den sehr dunklen bis Schwarzen stellen des Randes stößt, und somit keine genauen Werte für die Farbkorrektur bekommt.

Folgendes sind Beispiele die auf dem von dir im Thread zur Verfügung gestellten Negaivbildes beruhen. (negaiv.jpg) Bei dir könnte die Größe der Bilder anders sein.
eine forcierte Verarbeitung mit einem künstlichen Schwazem Rand ergibt wie der Versuch mit dem gesamten Orginalbild sehr starke Farbverschiebungen und einen nicht sichtbaren weißen Bildrand im fertigen Bild
Code:
convert negativ.jpg -crop 700x500+50+16\! -bordercolor black -border 50x16   -negate -channel all -normalize test1.jpg
das selbe dann forciert ausgeführt mit einem künstlich gesetzem grauen Rand ergibt sehr brauchbare Farben, und einen angenehm dunkel blauen Bildrand im fertigen Bild.
Code:
convert negativ.jpg -crop 700x500+50+16\! -bordercolor grey -border 50x16   -negate -channel all -normalize test2.jpg
Die Farbe des Randes muss hier sehr genau ausgesucht werden, (RBG alles im mittleren Bereich) sonst kippt die Farbe des Gesamtbildes gleich böse in irgend eine Richtung.

möglich ist natürlich auch das Bild erst zu schneiden dann komplett zu bearbeiten, und dann einen Rand deiner freien Wahl wieder dazu zu setzen. Das Prinzip ist gleiche nur die Optionen kommen in anderer Reihenfolge, und dadurch wird das Bild anders verarbeitet. Die Farbe des Randes spielt jetzt für die optimale Farbkorrektur keine Rolle mehr, da dieser zu diesem Zeitpunkt weggeschnitten ist und später wieder einer mit definierter Farbe dazugebaut wird.
Code:
convert negativ.jpg -crop 700x500+50+16\! -negate -channel all -normalize -bordercolor grey -border 50x16  test3.jpg

Wenn dir die Farbkorrektur mit -normalize zu streng wird, kannst du das auch mit -contrast-stretch machen, das ist die konfigurierbare Version dieser Option. Folgender Befehl sollte sogut wie identisch mit dem Ergebnis von -normalize sein.
Code:
convert negativ.jpg -crop 700x500+50+16\! -bordercolor grey -border 50x16 -negate -channel RGBA -contrast-stretch 1% test4.jpg

robi
 
OP
P

petit

Newbie
Robi,
Danke für die ausführlichen Infos,
so wie ich das verstehe, kann ImageMagik also keine selektive Beurteilung des Bildes vornehmen.
Ich brauche auch nicht zwingend einen Rand. Es geht darum, dass ich tausende von Vorlagen habe, die ich in einem vernünftigen Schnellverfahren brauchbar umwandeln möchte. Deswegen auch das ImageMagik, welches ich in einem Batch-Script bereits eingebunden habe.
Alle Bilder weisen leider sehr unterschiedlich Ränder auf und so lässt sich kein einheitlicher Rand zum (automatisierten) wegschneiden bestimmen und somit auch kein -region einsetzen.

In dem Fall muss ich also bei der Reproaufnahme den Ausschnitt vordefinieren, was dann die autom. Beschneidung ermöglichen würde.
Schade dass das mit IM nicht geht.....

Pet
 
A

Anonymous

Gast
petit schrieb:
Alle Bilder weisen leider sehr unterschiedlich Ränder auf und so lässt sich kein einheitlicher Rand zum (automatisierten) wegschneiden bestimmen und somit auch kein -region einsetzen.

In dem Fall muss ich also bei der Reproaufnahme den Ausschnitt vordefinieren, was dann die autom. Beschneidung ermöglichen würde.
Schade dass das mit IM nicht geht.....

geht auch, eine solche Befehlskette ist aber nicht in wenigen Minuten entwickelt. Da müsste man gehörig rumprobieren und wohl viel Zeit investieren..
Solange sich der Rand auf jedem Bild eindeutig vom Motiv mittels Filterkette oÄ automatisch bildmathematisch trennen lässt, könnte für jedes Bild eine Negativmaske der genauen Form des Rahmens erstellt werden, welche dann zur Bearbeitung ausgelassen wird, bzw nach der eigentlichen Bildbearbeitung wird der Rahmen entsprechen der Maske auch separat verarbeitet und dann wieder zum fertigen Bild eingemischt oder überlagert. Somit wäre es dann auch egal ob das Bild schief gescannt wurde, oder ob es einen Rahmen mit runden Ecken oder was weiß ich hat. Notfalls muss man über verschiedene Zwischenbilder oder Bildschichten arbeiten.
Ob du das wirklich brauchst ?

Wenn das Problem allerdings nur die unterschiedliche Größen, Formate oder Auflösungen des Rohbildmaterials oder ähnliches betreffen würde, könnte man sowas im Script durchaus schnell selektiv automatisieren.

Mit IM geht erstmal prinzipiell Alles, bevor nicht jemand nach mindestens einem Jahr intensivster Forschungs- und Testarbeit das Gegenteil nachweisen kann. ;) Das Alles auch immer einfach geht, hat ja auch niemand behauptet.

robi
 
OP
P

petit

Newbie
Das Bildmaterial ist tatsächlich sehr unterschiedlich.
Einfach ein klarer schwarzer Rand wäre rechnerisch tatsächlich weg-zu-programmieren.
Es geht aber um sehr alte Instamatic-Filme und die weisen oft sogar Doppelbelichtungen im Randbereich auf. Das lässt sich nicht charakterisieren.

Alleine die Formate habe ich bereits im Script parametrisiert.

ich werde also mit Masken arbeiten, die sind dann fix definiert und lösen dieses Problem auf dem physikalischen Weg. Das Maske wegschneiden kann dann ebenfalls mit Parametern im IM autom. erfolgen.

Das andere wäre einfach eine optimale Lösung gewesen.

PET
 

Forsti

Newbie
Es bleibt dir nix anderes übrig als das Bild vorher zurechtzuschneiden und anschließend den Befehl auszuführen. Siehst du ja selbst. Eine Lösung für die Bearbeitung der Bilder mit Balken lässt sich nur schwer finden.

Kannst ja mal versuchen einen Freelancer zu beauftragen, der dir ein etwas komplizierteres Script schreibt, das den Job erfüllt. Aber das lohnt sich nur, wenn du den Befehl wirklich oft brauchst.
 
Oben