» »

[Python] PIL.Image resize in slaba kvaliteta

[Python] PIL.Image resize in slaba kvaliteta

HotBurek ::

Dobro jutro.

Evo, praktično je že drug dan, gledano od včeraj. Vsekakor pa nov izziv.

V osnovi gre za problem kvalitete pri pomanševanju slike (resize na 16x16), ter nenavadno slabi kvaliteti končne slike.

Naj povem, da sem spodnjo kodo uporabil za več takšnih slik in da je do sedaj tole edini primer, kjer sem opazil tako slabo kvaliteto.

(spodaj v sliki kot 1_favicon_original.png, size 3366)
Izvorna slika:


(spodaj v sliki kot 2_favicon_gthumb_resize.png, size 1481)
1: Če to sliko pomanjšam na 16x16 v programu gThumb, dobim tisto pričakovano kvaliteto.

(spodaj v sliki kot 3_favicon_pithon_pil_resize.png, size 906)
2: Če to sliko pomanjšam z uporabi PIL.Image, je kvaliteta slike nenavadno slaba (glede na vse tisoče in tisoče ostalih slik).

Koda:
import io;
import PIL.Image;

path_to_original = "/var/original.png";

path_to_resized = "/var/resized.png";

image = PIL.Image.open(path_to_original);

image = image.resize((16, 16), PIL.Image.ANTIALIAS);

image.save(path_to_resized, "PNG", quality=95);

image.close();

Če naredi print screen, kjer so vidne vse tri slike v grafičnem prikazovalniku, potem odprem to sliko, jo zoom-in-am, ter ponovno naredim print screen, se vidi razlika v kvaliteti.



Iz dokuemntacije na internetih ne vidim, da bi delal kaj narobe:
https://stackoverflow.com/questions/140...

What to do next?
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window
  • spremenilo: HotBurek ()

DamijanD ::

Meni to zgleda, kot da ima končna slika premalo barv, da bi lahko vse prikazala. Ne obvladam tega v pythonu, ampak a je možno, da ima vhodni png izredno omejeno paleto in, da potem resize dela s tem in je kriza. Poskusi po odpiranju konvertirati sliko v ful RGB (navadni 24bitni BMP) in potem naredi resize.

Smrkc ::

Lahko poskusiš z opencv-jem. Meni konvertira enako kot tvoja gthumb_resize slika.

import cv2
img = cv2.imread('favicon.png', cv2.IMREAD_UNCHANGED)
resized = cv2.resize(img, (16,16), interpolation = cv2.INTER_AREA)
cv2.imshow("resized", resized)
cv2.waitKey(0)

kljuka13 ::

Kot je omenil @DamjanD, je izvirna slika shranjena z indeksirano barvno paleto. Za želeni končni rezultat moraš torej sliko predhodno pretvoriti v barvni model RGB.

rgb_image = image.convert('RGB')
rgb_image_resized = rgb_image.resize((16, 16), PIL.Image.ANTIALIAS);

HotBurek ::

Evo, dobro jutro.


Ja, res je, tale mode P vs. RGB je bil problem in rešitev. Super duper. Hvala za pomoč.

Koda, ki jo trenutno uporabljam:
# documentation
# https://pillow.readthedocs.io/en/stable/handbook/concepts.html#concept-modes
# convert image from P to RGB before resize for better quality of end product
if image.mode == "P":

    image = image.convert("RGB");

In končna slika je takšne kvaliteta, kot "mora" bit.

Sedaj me pa zanima še nekaj. V zgoraj omenjeni dokumentaciji je seznam podprtih mode-ov:
1 (1-bit pixels, black and white, stored with one pixel per byte)
L (8-bit pixels, black and white)
P (8-bit pixels, mapped to any other mode using a color palette)
RGB (3x8-bit pixels, true color)
RGBA (4x8-bit pixels, true color with transparency mask)
CMYK (4x8-bit pixels, color separation)
YCbCr (3x8-bit pixels, color video format)
    Note that this refers to the JPEG, and not the ITU-R BT.2020, standard
LAB (3x8-bit pixels, the L*a*b color space)
HSV (3x8-bit pixels, Hue, Saturation, Value color space)
I (32-bit signed integer pixels)
F (32-bit floating point pixels)

In glede na to, koliko bit-ov uporablja posamezni mode; ali bi bilo smielno popravit zgornji if statement, da bi, v kolikor je mode in (1, L, P), naredil convert na RGB, preden se izvede resize?

Ker prvi trije (1, L, P) uporabljajo manj bitov, kot RGB, vsi nižje (na seznamu) od RGB-ja pa uporabljajo iso ali več bitov.
root@debian:/# iptraf-ng
fatal: This program requires a screen size of at least 80 columns by 24 lines
Please resize your window

Zgodovina sprememb…

  • spremenilo: HotBurek ()

DamijanD ::

Ja bi bilo:
- 1: tukaj imaš samo on/off torej samo popolnoma bela in popolnoma črna. Če hočeš AA resizing, rabiš sivine (torej RGB)
- 8: tukaj imaš 256 nivojev od bele do črne, načeloma tega e rabiš dat v RGB zaradi resizinga (mislim, da ne bi smelo biti razlike med tem in RGB načinom za črno-bele slike)
- P: to je pa že zgoraj obdelani primer, torej rabiš RGB


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Android] pomoč pri postavitvi layouta

Oddelek: Programiranje
122151 (1909) icurk
»

[Android] Splošno

Oddelek: Programiranje
351986 (1116) piki12
»

Problem z digitalnim okvirjem.

Oddelek: Pomoč in nasveti
191727 (1532) Heaven
»

JAVA neujemanje tipov

Oddelek: Programiranje
151973 (1606) l0g1t3ch
»

Nov članek izpod Senitelovih prstov

Oddelek: Novice / Nova vsebina
202080 (2080) BigFoot

Več podobnih tem