Seite 1 von 1

QImage konvertieren / Dithering-Threshold

Verfasst: 31. Oktober 2004 12:20
von para
Hallo zusammen,
kann man bei der Bittiefenänderung eines Images eigentlich den Dithering-Threshold beinflussen...?

Code: Alles auswählen

myImage.convertDepth(1,Qt::MonoOnly|Qt::ThresholdDither);
In diesem Beispiel wird ein 32bit Image in ein 1bit Schwarzweißbild konvertiert. Wie kann ich die Grenze (Threshold) beeinflussen, ab der ein Pixel entweder schwarz oder weiß dargestellt wird...?

Danke, Para

PS: Dieses Mal hab ich keine Text überlesen :wink:

Verfasst: 1. November 2004 16:15
von lepsai
Wenn du unbedingt eine feine Binarisierung erreichen möchtest, könntest du dein 32-Bit Bild in ein Grauwertbild konvertieren und anschließend per Hand binarisieren:

Code: Alles auswählen

QImage img = img32.convertDepth(8);

for(int y = 0; y < img.height(); y++)
{

uchar * pImgLine = img.scanLine(y);

for(int x = 0; x < img.width(); x++)
{
*pImgLine++ = *pImgLine > threshold ? 255 : 0;
}
}

Verfasst: 1. November 2004 19:30
von para
Das ist doch schonmal was!
Gibt's keine Methode nebst Parameter für so etwas :wink: ? Falls jemandem etwas dazu einfällt bitte posten...

Wichtig?
You cannot use the uchar* pointer directly, because the pixel format depends on the byte order on the underlying platform. Hint: use qRed(), qGreen() and qBlue(), etc. (qcolor.h) to access the pixels.
Dank dir, Para

Verfasst: 1. November 2004 20:26
von para
Eine Frage noch: wie konvertiere ich das Bild in grayscale? Seine Tiefe nur auf 8bit reduzieren ändert ja nichts am Farbverhalten... Muss hier extra noch mit image.setColor() eine eigene Colortable bauen, oder geht das einfacher? Ich habe bislang keine Methode dafür gefunden...

EDIT:
In KImageEffect::toGray() findet sich ein Ansatz. Geht wohl wirklich nur manuell.

Para

PS: Also das API ist an machen Stellen echt noch verbesserungsfähig, oder?

Verfasst: 2. November 2004 09:52
von lepsai
Konvertierung zu einem Grauwertbild läuft so:

img = convertDepth(8);
img.setNumColors(256);

for(int i = 0; i < 256; ++i)
img.setColor(i, qRgb(i,i,i));

und danach kannste ruhig direkt auf den uchar* pointer zugreifen. Bei mir läuft es unter xp ohne Probleme. Es ist auch die einzige Möglichkeit das Ganze halbwegs effizient zu machen.

Eine direkte Konvertierung seitens Qt ist nicht wirklich möglich, da es überhaupt nicht klar ist, welche Farbtabelle der Benutzer nun haben möchte.

Viel Erfolg

Verfasst: 2. November 2004 23:48
von para
Ich denke so wirst du es nicht schaffen, weil du nicht davon ausgehen kannst, dass die Colortable in aufsteigender Form sortiert sein darf... Schließlich kennst du die Indizes der einzelnen Pixel nicht!

Ich habe mittlerweile ein Lösung gebaut, die direkt auf die Colortable des betreffenden QImages zugreift und jeden einzelnen Eintrag mit qGray() in seinen korrespondierenden Grauwert umwandelt. So klappts bestens!

Der Vergleich mit dem Threshold-Wert zur Schwarz/Weiß Entscheidung ist dann auch leicht qGray(img.pixel(x,y)) realisiert - für RGB gelten ja jeweils die gleichen Werte :wink:

Gruß, Para

Verfasst: 2. November 2004 23:57
von lepsai
Hmm, eine Farbtabelle gibt es aber bei den 32-Bit Bildern nicht... Das, was du meinst ist wahrscheinlich die Konvertierung von indizierten Bildern...

Dadurch dass pixel() Aurufe zu teuer sind, wird deine Konvertierung bei größeren Bildern viel Zeit in Anspruch nehmen...

Verfasst: 3. November 2004 08:04
von para
lepsai hat geschrieben:Hmm, eine Farbtabelle gibt es aber bei den 32-Bit Bildern nicht... Das, was du meinst ist wahrscheinlich die Konvertierung von indizierten Bildern...
Hm, wir reden hier aber doch von bereits konvertierten 8bit-Images... :roll:
Dadurch dass pixel() Aurufe zu teuer sind, wird deine Konvertierung bei größeren Bildern viel Zeit in Anspruch nehmen...
Das mag sein, in meinem Fall ist das aber ok. Die Thresholdänderung läuft mit einem Slider (on-the-fly) äußerst fix.

Ciao, Para