QImage konvertieren / Dithering-Threshold

Alles rund um die Programmierung mit Qt
Antworten
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

QImage konvertieren / Dithering-Threshold

Beitrag 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:
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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;
}
}
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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?
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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
lepsai
Beiträge: 573
Registriert: 14. September 2004 21:33
Wohnort: Berlin
Kontaktdaten:

Beitrag 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...
para
Beiträge: 21
Registriert: 19. Oktober 2004 20:03

Beitrag 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
Antworten