"Zjemnění" obrázku – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

"Zjemnění" obrázku – C / C++ – Fórum – Programujte.com"Zjemnění" obrázku – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
craNich0
Duch
19. 7. 2016   #1
-
0
-

Zdravím.

Potřeboval bych radu ohledně naprogramování jednoho algoritmu.

Vstupem je takovýto obrázek (v reálu bude samozřejmě mnohem složitější atd.): 

Připojen obrázek.

Z tohoto obrázku potřebuji vygenerovat nový obrázek, kde:

- každá šeď (zde jen 1) je rozdělena na určitý počet šedí n (zde n = 4, standardně n = 8) ve formě následujícího obrázku (něco ve smyslu výškové mapy)

- velikost výstupního obrázku je pak rovna velikost původnímu obrázku * n.

Připojen obrázek.

Obrázku jsou jen načrtnuty, jak by to mělo zhruba vypadat.

S podobným algoritmem, který dokáže tímto stylem zjemnit/rozdělit danou oblast jsem se setkal v corelu/photoshopu. Každopádně ne tak, jak úplně chci. 

Díky za jakkoukoliv radu.

Nahlásit jako SPAM
IP: 2001:67c:1222:1000:c194:6...–
Reklama
Reklama
peter
~ Anonymní uživatel
2551 příspěvků
19. 7. 2016   #2
-
0
-

V Gimpu se to jmenuje bud relief (udela z okraju relief) nebo vybarveni prechodem. A nebo mozna myslis gausovo rozmazavani.
Zvoli se vybarvovani prechodem (gradientem), typ Formatovany (uhlovy, kulovy, dulkovy) a klikne se na oblast, kterou chces vybarvit.
Pro gausovo rozmazavani okraju si zas vyberes objekt hulkou, podobne barvy nebo jinak ohranicis. Zvolis v nastrojich, aby z ohraniceni vybral okraj treba jen 3px na kazdou stranu. a nechas vybranou oblast gausove rozmazat.

Jo, ale podle obrazku to vypada spis na vytvoreni z 2d objektu 3d, cili vybarveni prechodem barev. Kdyby se to melo programovat, tak prvni algoritmus zjisti okraje objektu a vnitrni bod. Druhy smerem dovnitr meni odstin barvy a obtahuje okraj.

https://docs.gimp.org/en/gimp-concepts-gradients.html
Ke konci stranky ukazka. Figure 7.26. Gradient. Tam to resi konkretnim gradientem barev

Nahlásit jako SPAM
IP: 2001:718:2601:26c:b536:f1...–
craNich0
Duch
19. 7. 2016   #3
-
0
-

No potrebuju naprogramovat algoritmus, ne pres graficky program. 

Okraje objektu zjistim, ale co dal ? Vnitrnich bodu musi byt vice, resp. hadam ze spis cela krivka. Ale jak ji zjistit?

Nahlásit jako SPAM
IP: 2001:67c:1222:1000:c194:6...–
Matěj
~ Anonymní uživatel
18 příspěvků
19. 7. 2016   #4
-
0
-

Nechceš použít Distance transform? Podle příspěvku to vypadá, že by se zadání tím dalo vyřešit.

https://en.wikipedia.org/wiki/Distance_transform

Nahlásit jako SPAM
IP: 89.176.156.–
ondrej39+1
Věrný člen
19. 7. 2016   #5
-
0
-
Nahlásit jako SPAM
IP: 79.141.243.–
Inject all the dependencies!
peter
~ Anonymní uživatel
2551 příspěvků
20. 7. 2016   #6
-
0
-

No, vybarvovani prechodem.
Urcis si posloupnost barev pro kazdou vrstvu a okreslujes okraje objektu.
"Okraje objektu zjistim" Kolem nich pak obkreslujes jednotlive barvy. Kdyz umi zjistit okraj, tak urcite umis vedle nej vest 1px caru okolo (nebo je to tez 1px vnitrni okraj toho puvodniho okraje). Jestli ti to pomuze, tak si udelej seznam vsech bodu a cyklem pokracuj, dokud v seznamu nejaky zbyde.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:f91e:24...–
BDS+2
Věrný člen
20. 7. 2016   #7
-
0
-

#1 craNich
prošel bych obrázek pixel po pixelu a všechny okolní pixely aktuálního, které nejsou bílé bych ztmavil o jeden díl, a pokud v okolí pixelu nebude žádný světlejší, tak bych aktuální pixel ztmavil o další díl (případně pokud v okolí narazím na světlejší o dva díly, tak aktuální pixel zesvětlím o jedendíl)..

Nahlásit jako SPAM
IP: 185.69.69.–
Visual Studio C/C#/C++
(pouze samouk)
peter
~ Anonymní uživatel
2551 příspěvků
21. 7. 2016   #8
-
0
-

Mno, stejne, pro vybarveni musis tuknout doprostred obrazku. Takze vis, jakou barvu budes prebarvovat. (nebo, v pripade gimpu lze zvolit interval, odstin barva+-cislo). Pri obkreslovani okraje pak jen pocitas vzdalenost od okraje a podle toho zvolis barvu, kterou tam das.

Nebo muzes jit klasicky flood-fill bod po bodu a pro kazdy si zjistit vzdalenost od okraje. Pro vybarveni pak pouzit nejnizsi cislo.
bod 

...
.o.
...

Jsou vsechny tecky ve vzdalenosti +1 od bodu sede? Ano, pak barva+1 a hledej vzdalenost +2, zda jsou vsechny sede. Kdyz ne, vybarvi barvou+1, kdyz ano, pak pridej barva+2 a opet hledej 3...
Coz nejspis bude sice pomalejsi nez obkreslovani okraje, ale taky to jde.

Hlavne bys mel pracovat ve druhe vrstve a neprebarvovat hned obrazek.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:e154:91...–
craNich0
Duch
21. 7. 2016   #9
-
0
-

Diky vsem za rady, nejak si to behem dne poradne projdu a uvidim.

Jen jsem pravdepodobne nedal uplne ten nejlepsi priklad, kde nemusi byt pravdepodobne nektere potrebne detaily videt. Viz situace s obkreslovanim okraje, co jsem tak zbezne cetl - zda se mi, ze nevede uplne k pozadovanemu vysledku, preci jen tloustka daneho levelu (sedi) od okraje je a musi byt promenna - viz. nejsvetlejsi barva output img z cerne u input img - horni (tlusta) x dolni (tenka) oblast. 

Pravdepodobne to nebude tak jednoduchy, obzvlast s vnitrnima vrstvama (viz cerna vrstva input img). Kterou bych na zacatek klidne i ozelil a stacilo by mi vyresit ty dalsi vnejsi vrstvy. Kde i tady plati, ze sirka vrstvy neni konstantni. Na druhou stranu zde plati, ze v kazde oblasti je plny pocet levelu (sedi) - jen se meni jejich sirka dle vzdalenosti od protilehleho okraje. Ikdyz kdyz se nad tim tak zamyslim, tak i u tech vnitrnich se da rict, ze je zde plny pocet levelu (sedi), jen u poslednich dvou (viz obrazek) je jejich tloustka v nekterych mistech nulova.

Lepsi priklad:

Input image (2 vrstvy, v realu by to slo dal a dal. Do tvaru nejakeho realneho objektu apod.):

Pozadovany output image (zde rozdelen na 5 levelu - sedi, v realu by jich bylo nejspise jiz zminovanych 8):

Připojen obrázek.

Připojen obrázek.

Nahlásit jako SPAM
IP: 2001:67c:1222:1000:3c10:2...–
peter
~ Anonymní uživatel
2551 příspěvků
21. 7. 2016   #10
-
0
-

Tezko posoudit.

Na obrazku zuzuje oblast. Otazkou je, podle jakeho pravidla. Kdyz oblast presahne min-sirku, tak tam misto 1 da 2 uzsi?

Nebo se jedna o jakysi objekt, ktery nekdo deformoval a deformaci samozrejme deformujes vse. V tom pripade by sis vzal asi kruhovy objekt, vybarvil gradientem rovnomerne. Zjistil podle okraju, kterymi smery ho deformoval na tuhle sisku (treba shoda tak 90% a 3 mozne smery deformace). A zdeformoval. Pri deformaci ti to pak takhle pekne sesklada.
Ale myslim si, ze jednodussi by byla ta moznost s vybarvovanim.

Pokud to mas zadani od nekoho, tak mu zkus popsat svuj postup a v cem se to bude lisit od zadani. Kdyz to schvali, dal nemusis resit. Jinak by musel rici, jak si to presne predstavuje.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:e154:91...–
craNich0
Duch
21. 7. 2016   #11
-
0
-

Jde o neco do prace (obor elektronova litografie). Zadani vicemene neni. 

Jde o to, ze mam obrazek jakozto vpodstate vyskovou mapu nejakeho objektu. 1 sed = 1 plocha (dale uz jen level)

Cilem je zjemnit rozliseni (ci jak to nazvat), kde dojde k:

- zvetseni velikosti obrazku na osminasobek, tedy kazdy level bude osmkrat vetsi (v x, y, ne plosne samozrejme)

- kazdy tento zvetseny level bude rozdelen do osmi pod-levelu zachovavajici smer vyskove mapy. Resp. kazdy level bude nahrazen 8-levelovym schodem.

Tj. nejake extra pravidla nejsou. Akorat kazda sed (level) by tedy mela byt vzdy rozdelena na 8 pod-levelu, nejak logicky. 

Nahlásit jako SPAM
IP: 2001:67c:1222:1000:3c10:2...–
peter
~ Anonymní uživatel
2551 příspěvků
21. 7. 2016   #12
-
0
-

Jeste by to slo prevest na vektorovy 2d nebo 3d obrazek. Asi to vykreslit do 3d pomoci bezierovych krivek nebo tak.

Nahlásit jako SPAM
IP: 2001:718:2601:26c:e154:91...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 57 hostů

Podobná vlákna

Změna obrázku — založil Markéta

Upload obrázků — založil Václav Žitek

Vložení obrázku — založil Martin

Náhled obrázku — založil Borek

Dělení obrázku — založil Dex

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý