Script zur Pixelanalyse läuft und läuft nicht...

Matop

Mitglied
Registriert
14.05.09
Beiträge
6
Hallo,
ich habe ein JScript gebastelt, welches alle Pixel eines Bildes in seine RGB Anteile zerlegt (FF_GetPixel) und dann bestimmte Berechnungen damit ausführt. Momentan bewertet es die Rotanteile im Bild. Es soll vielleicht zur Auswertung wissenschaftl. Bilder dienen. Könnte vielleicht auch effizienter programmiert werden. Mein Problem. Im Prinzip funktioniert es (bei manchen Bildern), bei anderen nicht. Ich füge diverse Testbilder an und natürlich den Scriptcode. Wer kommt drauf, was hier falsch läuft bzw. nicht läuft??
Zur Erklärung: es wird in jedem Pixel RGB bewertet, momentan falls R größer als G und auch B, dann Aufsummierung der R-Werte etc. Nur bei Testbild_L.jpg funktioniert es (die grünen und grauen Bildanteile entsprechen nicht den definierten Kriterien und werden nicht gezählt). Lässt man aber das vom Script erzeugte Bild "Testbild_L_redcount.jpg" nochmal über das Script laufen, dann läuft es wieder nicht. Auch die anderen Testbilder funktionieren NICHT, obwohl sie Rotanteile enthalten. Also ich hab keine Ahnung mehr, was hier los ist!!

Code:
// FFSubmenu=Science
// FFName=Pixelscan

main();
function main()

{
var msg1 = "Dieses Skript ist lauffähig ab Version 2.90(?)";
var msg2 = "Kein Bild geladen!";
var msg3 = "Rot: ";
var msg4 = "Gruen: ";
var msg5 = "Blau: ";
var msg6 = "Rotwert korr.: ";
var msg7 = "Gesamtpixel Anzahl: ";
var msg8 = "Rotpixel Anzahl: ";
var msg9 = "Rotpixel %: ";
var msg10 = "beliebiger Kommentar";
var msg_var = "RotSumAlle bei 36340 ist: ";
var msg_var2 = "RotSumAlle komplett ist: ";
var msg_var3 = "RotSumAlle laufend ist: ";

var fso = new ActiveXObject("Scripting.FileSystemObject"); 

// wichtige Definitionen
var JPGNamenszusatz = "_redcount";
var referenzpixelsumme = 250000; // Bild von 500x500 px
var schriftart = "Arial";
var bilderanzahl = FF_GetImageCount();

// FixFoto-Version überprüfen
var Version = eval(FF_GetMajor()+"."+FF_GetMinor());
if((Version<2.90) || (Version==2.90 && FF_GetBuild() < 20))
	{
    FF_MessageBox(msg1,0);
    return;
	}

//Bild geladen? Falls nicht, abbrechen.
if(FF_GetImageWidth()== 0)
	{
    FF_MessageBox(msg2,0);
    return;
	}

// ************************************************************************

for(var i = 0; i < bilderanzahl; i++) // Schleife über alle markierten Bilder  
{
   var path = FF_GetImageName(i);
   var splitPath = SplitPath(path);

FF_LoadImage(path);
var width = FF_GetImageWidth();
var height = FF_GetImageHeight();
var pixelsumme = width * height;
var korrekturfaktor = referenzpixelsumme / pixelsumme; 

var KoordinateX = 1;
var KoordinateY = 1;
var RotSumAlle = 0;
var GruenSumAlle = 0;
var BlauSumAlle = 0;
var RotWert = 0;
var RotPixelGezaehlt = 0;
var RotPixelProzent = 0;

for(var j = 0; j < pixelsumme; j++) //Aufsummierung aller Rotanteile
{
//if (j == 0) RotSumAlle = 0; // folgende if-Anweisungen nur testweise
if (j == 0) GruenSumAlle = 0;
if (j == 0) BlauSumAlle = 0;
if (j == 0) RotWert = 0;
var RGBAnKoordinate = FF_GetPixel(KoordinateX,KoordinateY); // liefert COLORREF im Pixel
var BlauAnKoordinate = (RGBAnKoordinate >>> 16) & 255;
var GruenAnKoordinate = (RGBAnKoordinate >>> 8) & 255;
var RotAnKoordinate = RGBAnKoordinate & 255;
// COLORREF ist zerlegt

// Bedingungen, ob ein Pixel gezaehlt und aufsummiert wird oder nicht!
if ( (RotAnKoordinate > GruenAnKoordinate) && (RotAnKoordinate > BlauAnKoordinate) ) // sollte eigentlich funktionieren
{
RotSumAlle = RotSumAlle + RotAnKoordinate;
RotPixelGezaehlt = RotPixelGezaehlt + 1;
}


if (KoordinateX < width) KoordinateX = KoordinateX + 1;
if (KoordinateX == width) KoordinateX = 1;
if (KoordinateX == width) KoordinateY = KoordinateY + 1;

// Test mit Testbild_J.jpg:
if (j == 10019) var mitteilung1 = msg3 + RotAnKoordinate + "\n" + msg4 + GruenAnKoordinate + "\n" + msg5 + BlauAnKoordinate;
if (j == 22770) var mitteilung2 = msg3 + RotAnKoordinate + "\n" + msg4 + GruenAnKoordinate + "\n" + msg5 + BlauAnKoordinate;
if (j == 36330) var mitteilung3 = msg3 + RotAnKoordinate + "\n" + msg4 + GruenAnKoordinate + "\n" + msg5 + BlauAnKoordinate;
// Test mit Testbild_K.jpg:
if (j == 15709) var mitteilung4 = msg3 + RotAnKoordinate + "\n" + msg4 + GruenAnKoordinate + "\n" + msg5 + BlauAnKoordinate;
if (j == 36340) var mitteilung5 = msg_var + RotSumAlle;
//var mitteilung6 = msg_var3 + RotSumAlle; // nur aktivieren bei kleinen Testbildern 15x3 Pixel!!!
var mitteilung7 = msg_var2 + RotSumAlle;

if (j == 10019) { FF_MessageBox(mitteilung1,0); }
if (j == 22770) { FF_MessageBox(mitteilung2,0); }
if (j == 36330) { FF_MessageBox(mitteilung3,0); }
if (j == 15709) { FF_MessageBox(mitteilung4,0); } // bei Testbild_K.jpg
if (j == 36340) { FF_MessageBox(mitteilung5,0); }
//FF_MessageBox(mitteilung6,0); // nur aktivieren bei kleinen Testbildern 15x3 Pixel!!!

} // for-Schleife Aufsummierung Klammer zu

RotWert = RotSumAlle * korrekturfaktor;
RotWert = Math.round(RotWert*1)/1;

RotPixelProzent = (RotPixelGezaehlt / pixelsumme) * 100;
RotPixelProzent = Math.round(RotPixelProzent*100)/100;

// oben hellblauen Streifen ans Bild setzen fuer Text
FF_ExtendCanvas (0, 0, 108, 0, 166, 210, 255)

var TextAufBild1 = msg6 + RotWert;
var TextAufBild2 = msg7 + pixelsumme;
var TextAufBild3 = msg8 + RotPixelGezaehlt;
var TextAufBild4 = msg9 + RotPixelProzent;
var TextAufBild5 = msg10;
FF_DrawText(TextAufBild1, 10, 5, 20, 0, 400, false, false, schriftart, 0)
FF_DrawText(TextAufBild2, 10, 23, 20, 0, 400, false, false, schriftart, 0)
FF_DrawText(TextAufBild3, 10, 43, 20, 0, 400, false, false, schriftart, 0)
FF_DrawText(TextAufBild4, 10, 63, 20, 0, 400, false, false, schriftart, 0)
FF_DrawText(TextAufBild5, 10, 83, 20, 0, 400, false, false, schriftart, 0)

// hier entsteht der neue Dateiname für das JPG
var outName = splitPath.dir + splitPath.file + JPGNamenszusatz + ".jpg"; 
// jetzt wird das JPG gespeichert, Qualitaet 100
FF_SaveImage(outName, 100);

FF_MessageBox(mitteilung7,0);

} // for-Schleife über alle markierten Bilder Klammer zu							
} // function main Klammer zu

// *********************************************************************
// Zerteilt einen Bild-Dateinamen in seine Pfadbestandteile
function SplitPath(path) {
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var    result = new Object();
    result.dir = fso.GetParentFolderName(path) + "\\";
    result.file = fso.GetBaseName(path);
    result.ext = "." + fso.GetExtensionName(path);
    return result;
    }
// **********************************************************************
 

Anhänge

  • Testbild_J.webp
    Testbild_J.webp
    1,3 KB · Aufrufe: 540
  • Testbild_J_redcount.webp
    Testbild_J_redcount.webp
    6,6 KB · Aufrufe: 572
  • Testbild_K.webp
    Testbild_K.webp
    470 Bytes · Aufrufe: 545
  • Testbild_L.webp
    Testbild_L.webp
    460 Bytes · Aufrufe: 497
  • Testbild_L_redcount.webp
    Testbild_L_redcount.webp
    6,8 KB · Aufrufe: 572
AW: Script zur Pixelanalyse läuft und läuft nicht...

Zuerst einmal ist deine Kordinatenberechnung etwas ungewöhlich.....

Code:
if (KoordinateX < width) KoordinateX = KoordinateX + 1;
if (KoordinateX == width) KoordinateX = 1;
if (KoordinateX == width) KoordinateY = KoordinateY + 1;

denn deine drittes IF wird niemals wahr! da X schon vorher auf 1 zurückgesetzt wird.

Ich würde es eher so machen....
Code:
if (KoordinateX < width) 
       KoordinateX++
else { koordinateX = 1;   KoordinateY++; }

Probiere mal damit weiter.
 
AW: Script zur Pixelanalyse läuft und läuft nicht...

Oh Mann, das ist peinlich. Ich war so glücklich, dass es schon funktionierte, dass ich diesen Teil des Skriptes bei der Fehlersuche immer ausgeblendet hatte. Klar, dass es so nicht funktionieren kann. Es wird immer nur die erste Zeile gescannt und zwar so lange, bis j=pixelsumme! Da hab ich mir ja ein Ei gelegt. Bei meinen Testbildern war ich natürlich der Meinung, dass alle Pixel gescannt werden, aber das war natürlich ein Trugschluss. Und bei symmetrischen Bildern wie eben Testbild_L.jpg kommen sogar die richtigen Werte raus!

Wie immer ist derjenige im Vorteil der programmieren kann ... ;-)

Danke für die Hilfe!
 
Zurück
Oben