Jaký je rozdíl mezi černobílým obrázkem a barevným obrázkem?
Jsou uvedeny dva obrázky. Z lidského hlediska je jedno barevné a druhé černobílé. Musíte je rozlišit na základě barev pomocí PHP/GD2.
Jediná funkce určování barev, kterou jsem našel, se jmenuje imageistruecolor, ale problém je v tom, že oba obrázky mají plnobarevnou paletu a výsledek funkce je stejný – srovnání se nezdaří.
Našel jsem návrh procházet všechny pixely obrázku a určit barvu každého z nich pomocí ImageColorAt. Toto je pravděpodobně možnost, ale nechci (pokud je obrázek velký, procházení zabere spoustu času; pokud jej nejprve zmenšíte, budete plýtvat prostředky na převod neefektivně).
Možná jsem něco přehlédl a existují „zelená“ řešení?
- Otázka byla položena před více než třemi lety
- Zobrazení 4513
Komentář
Řešení otázky 0
Odpovědi na otázku 11
Alex_EXEcuter @Alex_EXEcuter
Změňte jeho velikost na jeden pixel a uvidíte jeho barvu.
Pokud si to představuji správně, tento pixel bude mít průměrnou barvu celého obrázku.
Jsou soubory v různých formátech nebo v konkrétním formátu?
Odpověď napsaná před více než třemi lety
Jako 5 2 komentáře
ChemAli @ChemAli Autor otázky
Soubory jsou již načteny do prostoru PHP a jsou k dispozici jako zdroje.
Alex_EXEcuter @Alex_EXEcuter
Habr, divím se ti. Hlasovali proti komentáři (dobře), odhlasovali ho do karmy. Proč? Za to, že ztrácíte čas a nabízíte řešení? To mě netrápí, ale opravdu mě to překvapuje.
Strávil jsem další půl hodiny a popsal to podrobněji:
al.od.ua/is_grayscale.php
Jsou zde popsány tři metody měření, změna velikosti (jak jsem popsal já), testování náhodných 10 pixelů (jak bylo navrženo výše a testování všech pixelů, jak chtěl autor.
Test byl proveden na obrázcích 3648×2736 a 200×150. Podrobné výsledky na odkazu, stručně:
kontrola náhodných pixelů je 2-5krát rychlejší (v závislosti na velikosti), změna velikosti je asi stokrát rychlejší než kontrola všech pixelů na černobílých obrázcích, protože v případě barevného obrazu se měření zastaví po prvním měření.
To znamená, že pokud autorovi nevyhovuje měření náhodných pixelů, je změna velikosti velmi dobrým řešením. Jaké jsou tedy tyto nevýhody?

Upřesněte prosím, zda potřebujete černobílý obrázek, monochromatický nebo vizuálně působící černobílý/jednobarevný obrázek. A to v konkrétním formátu nebo libovolném. Protože ve formátech se ztrátou kvality při kompresi (například JPEG) nebude černobílý obraz, i když to tak na první pohled vypadá
,
a barva může vizuálně vypadat monochromaticky.
Iterování přes pixely rozhodně nebude fungovat
Odpověď napsaná před více než třemi lety
Jako 5 1 komentář
ChemAli @ChemAli Autor otázky
Vizuálně černobílé/jednobarevné. Ve skutečnosti je to pravá barva.
Rozostřte s monstrózním poloměrem a podívejte se na jakýkoli pixel.
Odpověď napsaná před více než třemi lety
Jako 4 1 komentář
IMHO rozmazání bude trvat déle než procházení každým pixelem :)
Co když obrázek rozdělíte na čtverce a z každého vzorkujete n pixelů? Čím více pixelů zkontrolujete, tím přesnější bude výsledek.
Odpověď napsaná před více než třemi lety
Jako 3 3 komentáře
ChemAli @ChemAli Autor otázky
Ideologicky se tato metoda neliší od přímého počítání pixelů. Navíc neexistuje žádná záruka, že po takové selektivní kontrole dojde ke správnému rozhodnutí o barvě: úplnou náhodou můžete například trefit pouze bílé pixely a myslet si, že obraz je černobílý.
Chcete-li to provést, musíte testem určit požadovaný počet pixelů. Jednoduchým rozdělením obrázku na čtverce jej zachytíte prakticky celý. Myslím, že tato metoda je optimální pro velké obrázky, ale u malých ji můžete procházet pixel po pixelu. Hodně stále záleží na specifikách obrázků, protože možná některá část obrázku nemusí být vůbec zaškrtnuta (např. na určitém místě je neprůhledné logo).
ChemAli @ChemAli Autor otázky
Obrázky – fotografie a koláže, ilustrace do novin, bannery.
Jako možnost můžete použít přibližnou „metodu Monte Carlo“: vzít n náhodných pixelů a zkontrolovat rovnost hodnot všech barevných kanálů. Čím větší je počet vzorků, tím větší je pravděpodobnost, že obrázek bude v odstínech šedé.
Přirozeně, že při prvním barevném pixelu vrátí negativní výsledek.
Výsledek nebude 100% přesný, ale relativně rychlý.
Odpověď napsaná před více než třemi lety
Jako 2 1 komentář
Jejda, už jsem navrhl, když jsem psal (

Michail Davydov @azproduction
1. Algoritmus pouze pro stupně šedi.
1.1. Máme vzorec pro získání pravděpodobnosti, že pixel je černobílý Sij=(Rij+Gij+Bij)/3; Pij = 1 – (|Sij-Rij| + |Sij-Gij| + |Sij-Bij|)/765;
1.2. Nastavíme konečnou pravděpodobnost T = 1. Začneme skenovat obraz podél mřížky s krokem 1-50 pixelů nebo náhodně několik pixelů; Čím více skenujeme, tím je naše pravděpodobnost pravděpodobnější. Pro každý z naskenovaných pixelů najdeme Pij; T = T* Pij; Pokud konečná pravděpodobnost klesne pod 0.9, pak přestaneme skenovat a řekneme, že karta není černobílá, pokud dojde na konec, pak říkáme, že je černobílá;
2. Algoritmus pro získání palety.
2.1. Procházíme obrázek a shromažďujeme všechny barvy, pokud je více než 500 barev, obrázek není černobílý, pokud je méně, zjistíme pravděpodobnost, že barvy spolu souvisí v tónu, na základě pravděpodobnosti, kterou říkáme; obraz je černobílý nebo sépiový atd.
Odpověď napsaná před více než třemi lety
Komentář
Like 2 Komentáře
Je to trochu nejasné: „černá a bílá“ to znamená bitmapu (se dvěma barvami) nebo odstíny šedé?
Odpověď napsaná před více než třemi lety
Jako 1 4 komentáře
ChemAli @ChemAli Autor otázky
Pak, pokud nechcete kódovat mnoho, jednoduše vytvořte 256barevný TrueColor obrázek (imagetruecolortopalette). Dále získáte řadu barev (imagecolorsforindex) a projdete ji hledáním jiných než šedých odstínů.
ChemAli @ChemAli Autor otázky
Mohl byste vysvětlit kouzlo imagecolorsforindex? Z popisu vůbec nechápu, co to dává. Dostanu pole náhodně:
imagetruecolortopalette($remoteImage, false, 255); $colors = imagecolorsforindex($remoteImage, 0); var_dump($colors); array(4) < ["red"]=>int(20) ["green"]=> int(14) ["modrá"]=> int(12) ["alpha"]=> int(0) >