Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Soutěž: Machr na algoritmy - Oprava obrázku

Soutěž již skončila

Zadání

V tomto machrovi budete opravovat díry v obrázcích. A to tak, že načtete zadaný obrázek a všechny chybějící (průhledné) pixely nahradíte nějakou barvou tak, aby zapadaly do zbytku obrázku. Tyto průhledné pixely mohou být ve skupinkách, vyzkouším vaše výtvory i na obrázku, ve kterém bude chybět více než polovina, abych viděl, jak se program zachová. Pixely mohou samozřejmě chybět i na okraji obrázku.

Povolené jazyky: C, C++, C#, Visual Basic, Java, JavaScript, PHP
Pokud budete chtít použít jiný, zeptejte se v komentářích.

Hodnotit budu:

  • Kód - max. 30 bodů
  • Výsledné obrázky ("kvalitu" oprav) - max. 30 bodů
  • Časovou náročnost algoritmu - max. 30 bodů
  • Komentovanost kódu - max. 10 bodů

Výhra

Vítěz dostane placku Machr a ocenění do portfolia.

Výhra

Výsledky

Jméno bodů Řešení ( Stáhnout vše )
Milan Suchomel 70 Stáhnout řešení
Martin Skalík 55 Stáhnout řešení
Michael Škrášek 54 Stáhnout řešení
Bohumír záviš 38 Stáhnout řešení
Tomáš Brůna 34 Stáhnout řešení
Aktivity
Avatar
Zdeněk Pavlátka:7.4.2016 21:27

Tentokrát budete záplatovat díry v obrázcích.

Soutěž končí 17. dubna 12:00, tak se nezapomeň zapojit! :)

Odpovědět
7.4.2016 21:27
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Martin Skalík
Tvůrce
Avatar
Martin Skalík:8.4.2016 15:31

Může být ta aplikace v konzoli?

 
Nahoru Odpovědět
8.4.2016 15:31
Avatar
Nahoru Odpovědět
8.4.2016 16:56
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Tomáš Brůna
Tvůrce
Avatar
Tomáš Brůna:9.4.2016 20:52

můžeš sem dát prosím nějaký "testovací" obrázek? :)

Nahoru Odpovědět
9.4.2016 20:52
Vi veri universum vivus vici
Avatar
Zdeněk Pavlátka:9.4.2016 21:32

Např. https://dl.dropboxusercontent.com/…testImg1.png

Editováno 9.4.2016 21:34
Nahoru Odpovědět
9.4.2016 21:32
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na Zdeněk Pavlátka
Tomáš Brůna:9.4.2016 21:48

ok, diky.
A chybějící pixely jsou bílé (255, 255, 255) nebo jsou průhledné ?

Nahoru Odpovědět
9.4.2016 21:48
Vi veri universum vivus vici
Avatar
Odpovídá na Tomáš Brůna
Zdeněk Pavlátka:9.4.2016 21:57

průhledné a černé (0, 0, 0, 0)

Nahoru Odpovědět
9.4.2016 21:57
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Tomáš Brůna
Tvůrce
Avatar
Nahoru Odpovědět
9.4.2016 22:16
Vi veri universum vivus vici
Avatar
Odpovídá na Zdeněk Pavlátka
Matúš Petrofčík:9.4.2016 23:50

Len taká otázočka: Nemali by byť chýbajúce pixely len priehľadné? To by na tvojom obrázku bolo chybné aj to všetko čierne po krajoch.

Nahoru Odpovědět
9.4.2016 23:50
obsah kocky = r^2 ... a preto vlak drnká
Avatar
Odpovídá na Matúš Petrofčík
Zdeněk Pavlátka:10.4.2016 8:50

průhledné a černé => obojí najednou... proto jsem tam psal to (0, 0, 0, 0)

Nahoru Odpovědět
10.4.2016 8:50
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Tukmak
Člen
Avatar
Tukmak:10.4.2016 23:18

Je možné použít python?

 
Nahoru Odpovědět
10.4.2016 23:18
Avatar
Nahoru Odpovědět
11.4.2016 6:03
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Michael Škrášek:11.4.2016 20:18

Zajímaví machr, zapojuju se, už jen udělat rozumné míchání barev a je hotovo :)

Nahoru Odpovědět
11.4.2016 20:18
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Odpovídá na Zdeněk Pavlátka
Vojtěch Pospíchal:14.4.2016 17:46

Obrázek který si sem dal jako příklad, ale nemá vadné pixely průhledné a černé (0;0;0;0) Má je průhledné a bílé (0,255,255,255). Pokud to tedy není defekt stažení z Chromu na Windows.

Editováno 14.4.2016 17:47
 
Nahoru Odpovědět
14.4.2016 17:46
Avatar
Odpovídá na Vojtěch Pospíchal
Zdeněk Pavlátka:14.4.2016 19:06

chybička... obrázek jsem upravil, nepočítal jsem s tím, že paint.net gumováním mění vše na bílou...

Nahoru Odpovědět
14.4.2016 19:06
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Vojtěch Pospíchal:14.4.2016 19:42

Můžeš tedy prosím poskytnout nový obrázek, abych mohl upravit svoje řešení? :)

 
Nahoru Odpovědět
14.4.2016 19:42
Avatar
Odpovídá na Vojtěch Pospíchal
Michael Škrášek:14.4.2016 20:40

Když jsem stáhl obrázek, měl jsem chybné pixely černé ...

Nahoru Odpovědět
14.4.2016 20:40
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Michael Škrášek:14.4.2016 21:00

I přesto, že mi GIMP ukazuje průhledné bílé .... moje aplikace mi ukazuje průhledné černé a funguje :-?

Nahoru Odpovědět
14.4.2016 21:00
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Tomáš Brůna
Tvůrce
Avatar
Tomáš Brůna:14.4.2016 21:44

tak hotovo, není to úplně nejlepší ale už jsem nepřišel na jiné funkční řešení :)

Nahoru Odpovědět
14.4.2016 21:44
Vi veri universum vivus vici
Avatar
Zdeněk Pavlátka:24.4.2016 21:47

Díky všem za účast, zde jsou výsledky:

Michael Škrášek - 54 bodů
Kód (20 bodů)

  • pozn. kód
FillRectangle(new SolidBrush(new_color), x, y, 1, 1);

vybarví čtverec 2 × 2, ne jeden pixel

  • neustále volat Color.FromArgb(0, 0, 0, 0) je trochu zbytečné - lepší je tuto metodu zavolat jednou na začátku a barvu si uložit (nebo používat Color.Transparent, což je totéž)
  • tělo metody compare_color (19 řádků) se dá zkrátit na jeden řádek ;)
return c1.A == 0 && c1.R == 0 && c1.G == 0 && c1.B == 0;

Kvalita oprav obrázků (10 bodů)

  • zajímavé, ale poněkud divné

Časová náročnost algoritmu (15 bodů)

  • GetPixel a SetPixel jsou velmi pomalé
  • když procházíš obrázek, procházíš a kontroluješ i pixely, které už jsi zpracoval vlnou

Komentovanost kódu (9 bodů)

  • lepší než komentáře vedle hlavičky metody jsou dokumentační komentáře - píší se pomocí tří lomítek (///) před metodu / třídu a jejich obsah se pak dokonce zobrazuje v našeptávači, ukázku můžeš vidět např. zde: https://msdn.microsoft.com/…04awywx.aspx

Poznámky

  • při každém ukládání / načítání vytváříš nový SaveFileDialog / OpenFileDialog , lepší je vytvořit si je jednou při spuštění (ideálně je vytvořit jako komponenty formuláře - najdeš je v toolboxu)
  • u obrázku s většími dírami se program zasekl a Visual Studio ho po minutě ukončilo s tím, že neodpovídá

Milan Suchomel - 75 bodů
Kód (25 bodů)

Kvalita oprav obrázků (30 bodů) -> placka

  • není to vůbec špatné, u děr s průměrem do cca 32 pixelů většinou dosti přesvědčivé

Časová náročnost algoritmu (15 bodů)

  • oprava obrázku trvá dosti dlouho - metody getRGB a setRGB jsou velmi pomalé

Komentovanost kódu (10 bodů)

  • nejlépe komentovaný kód ze všech 5 výtvorů

Poznámky

  • u větších děr obrázek neopraví kvůli přetečení zásobníku -> -5 bodů
  • při každém ukládání / načítání vytváříš nový JFileChooser, lepší je vytvořit si při spuštění aplikace jen jeden (nebo jeden pro ukládání a druhý pro načítání), aby se uchovávala poslední složka, ze které se načítal (/kam se ukládal) obrázek

Tomáš Brůna - 34 bodů
Kód (15 bodů)

  • ten try catch uvnitř cyklu je dosti zbytečný, šlo by to vyřešit krátkou podmínkou
  • proč ten obrázek znovu načítáš do náhledu ze souboru, když ho máš v proměnné?

Kvalita oprav obrázků (0 bodů)

  • tvoje metoda je možná přijatelná pro díry o velikosti 1 pixelu (i když i tam by asi byl lepší průměr okolních pixelů), pro cokoli většího vypadá katastrofálně

Časová náročnost algoritmu (20 bodů)

  • jeden průchod pixely - rychleji to asi ani nejde
  • GetPixel a SetPixel jsou velmi pomalé...

Komentovanost kódu (9 bodů)

  • komentáře tam jsou, i když nebylo moc co komentovat

Poznámky

  • sice se pokoušíš měnit okno podle velikosti obrázku, ale chová se to naprosto nesmyslně - s obrázkem 512 × 512 se mi okno nevešlo na obrazovku, ale obrázek byl úplně nahoře a polovina z něj byla mimo okno (šířka okna je podle kódu 4 * šířka obrázku... už tady mi něco nesedí)
  • aplikace spadne, pokud je chybějící pixel u levého okraje -> -10 bodů

Martin Skalík - 55 bodů
Kód (10 bodů)

  • velmi nepřehledný
  • metodu opravObraz by bylo lepší rozdělit do několika kratších metod
  • jednopísmenné názvy proměnných jsou velmi špatný zvyk (výjimkou jsou proměnné for cyklu), vůbec není poznat, k čemu která z nich je - např. tohle:
int r = 0, l = 0, u = 0, d = 0;

jak z toho mám poznat, k čemu ty proměnné jsou... (po přečtení zbytku kódu jsem odhadl, že to asi bude right, left, up, down)

  • několikrát se opakuje jedna (celkem dlouhá) část kódu

Kvalita oprav obrázků (10 bodů)

  • zajímavé, ale ve výsledku to není nic moc, započítáváš jen horní a levé pixely

Časová náročnost algoritmu (30 bodů) -> placka

  • jediný výtvor, který nepoužívá getPixel a setPixel
  • nejrychlejší výtvor, obrázky zpracuje prakticky okamžitě

Komentovanost kódu (4 bodů)

  • používáš TODO komentáře namísto klasických - TODO má označovat, co je třeba přidat / dokončit, ne vysvětlovat kód
  • moc komentářů tam tedy nemáš

Poznámky

  • nechápu, proč to ukládáš jako Bitmap.Config­.RGB565 a ne jako Bitmap.Config­.ARGB_8888

Bohumír záviš - 38 bodů
Kód (5 bodů)

  • naprosto nepřehledný, formátovaný naprosto náhodně (kdyby to IDE neuměly naformátovat, nevyznám se v tom - nebylo ani poznat kde začíná metoda a kde končí)

Kvalita oprav obrázků (10 bodů)

  • zajímavé, ale ve výsledku to není nic moc, započítáváš jen horní a levé pixely
  • nechápu, k čemu mají být módy horizontální a vertikální, přepíší prakticky celý obrázek na hromadu čar

Časová náročnost algoritmu (20 bodů)

  • metody getRGB a setRGB jsou velmi pomalé, jinak to není špatné

Komentovanost kódu (3 bodů)

  • někde jsou, někde ne a úplně náhodou chybí zrovna u nepřehledné části...

Poznámky

  • nauč se prosím alespoň trochu českou gramatiku, číst ty tvoje návody byla noční můra...
  • aplikace podivným způsobem vypisuje některé barvy v obrázku (0sd0r0g0b0a0­r0g0b0a0dsdfd1335580sd-8569611... apod.) nechápu účel
  • při každém ukládání / načítání vytváříš nový FileChooser, lepší je vytvořit si při spuštění aplikace jen jeden (nebo jeden pro ukládání a druhý pro načítání), aby se uchovávala poslední složka, ze které se načítal (/kam se ukládal) obrázek

Placku tedy získává Milan Suchomel, polemes Gratuluji :)

Editováno 24.4.2016 21:49
Nahoru Odpovědět
24.4.2016 21:47
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Zdeněk Pavlátka:24.4.2016 21:59

Ještě pár obecných poznámek:

  • metody typu GetPixel a GetPixel jsou velmi pomalé, mnohem rychlejší je použít něco jako getPixels na Androidu, LockBits v C# apod.
  • používejte dokumentační komentáře - viz. např.

http://www.tutorialspoint.com/…entation.htm
https://msdn.microsoft.com/…2s063f7.aspx

  • dávejte si pozor na neošetřené výjimky a výtvory pořádně otestujte podle zadání

Níže se můžete podívat, jak si jednotlivé výtvory poradily s velkými dírami v obrázku

Nahoru Odpovědět
24.4.2016 21:59
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Michael Škrášek:24.4.2016 22:13

U těch kódů jsem si to fakt neuvědomil :D, a škoda, že jsem LockBits neznal dřív ...
Komentáře pro sebe fakt nevedu, jen jsem popsal kód :)

Prostě jsem si měl kód zkontrolovat :D, ale s tim SaveFileDialog / OpenFileDialog nevidim důvod v čem by to bylo lepší. Jinak gratulace vítězům.

Nahoru Odpovědět
24.4.2016 22:13
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Odpovídá na Zdeněk Pavlátka
Michael Škrášek:24.4.2016 22:32

A taky by mě zajímal obrázek u kterého moje aplikace spadla :).

Nahoru Odpovědět
24.4.2016 22:32
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Martin Skalík
Tvůrce
Avatar
Martin Skalík:25.4.2016 7:02

Gratuluji Milan Suchomel!

 
Nahoru Odpovědět
25.4.2016 7:02
Avatar
Odpovídá na Michael Škrášek
Zdeněk Pavlátka:25.4.2016 7:58

U toho, co jsem tu ukázal. Aby to Visual Studio neukončilo, přepsal jsem to na LockBits... I tak to bylo pomalé.
A přímo to nespadlo, Visual Studio aplikaci ukončilo že neodpovídá... Takovéhle věci by měly běžet na pozadí.

Nahoru Odpovědět
25.4.2016 7:58
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Milan Suchomel:25.4.2016 14:35

Přetečení jsem si byl vědom :) Jen jsem nevěděl jak to opravit :D Díky moc za skvělého machra.
Martin Skalík, díky :), taky gratuluji k úspěšnému Machrovi.

Editováno 25.4.2016 14:35
 
Nahoru Odpovědět
25.4.2016 14:35
Avatar
Odpovídá na Zdeněk Pavlátka
Michael Škrášek:25.4.2016 15:38

Mně to nepadá ... a mám to ihned opravené :-?

Nahoru Odpovědět
25.4.2016 15:38
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Odpovídá na Michael Škrášek
Zdeněk Pavlátka:25.4.2016 16:55

ne ten první testovací, tyhle:

Nahoru Odpovědět
25.4.2016 16:55
Kolik jazyků umíš, tolikrát jsi programátor.
Avatar
Odpovídá na Zdeněk Pavlátka
Michael Škrášek:25.4.2016 19:24

Ani u těchto dvou mně to nespadlo. u toho prvního to už nebylo tak rychlé, ale i tak jsem čekal asi 3s.

Nahoru Odpovědět
25.4.2016 19:24
"I choose a lazy person to do a hard job. Because that person will find an easy way to do it. " Bill Gates
Avatar
Odpovídá na Michael Škrášek
Zdeněk Pavlátka:25.4.2016 20:09

Tak to máš asi o hodně výkonnější počítač než já, pokud pro tebe "nebylo tak rychlé" je 3s a přitom používáš GetPixel a SetPixel. Na takové časy jsem se dostal až po přepsání na LockBits...

Nahoru Odpovědět
25.4.2016 20:09
Kolik jazyků umíš, tolikrát jsi programátor.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 30 zpráv z 30.