Forum » Programiranje » [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:
Č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?
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
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:
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:
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.
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
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
- 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 ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [Android] pomoč pri postavitvi layoutaOddelek: Programiranje | 2202 (1960) | icurk |
» | [Android] SplošnoOddelek: Programiranje | 1998 (1128) | piki12 |
» | Problem z digitalnim okvirjem.Oddelek: Pomoč in nasveti | 1748 (1553) | Heaven |
» | JAVA neujemanje tipovOddelek: Programiranje | 1983 (1616) | l0g1t3ch |
» | Nov članek izpod Senitelovih prstovOddelek: Novice / Nova vsebina | 2104 (2104) | BigFoot |