ç»åã³ã³ãã³ããèæ
®ããLiquid Resizeã¹ã±ãŒãªã³ã°ãã¯ãããžãŒã«ã€ããŠã¯ãããããæ¢ã«èããããšãããã§ãããã ãã¹ãŠãã©ã®ããã«æ©èœããèªåã§ãã¹ãŠãå®è£
ããæ¹æ³ã«èå³ãããå Žåã¯ãèªãã§ãã ããïŒæ
éã«ãããããã®åçïŒã
ïŒUFOãé£ã³èŸŒãã§ããã®å³é¢ãããã«äŒžã°ããŸããïŒç§ã¯å人ã®èŠè«ã§èšäºãæçš¿ããŸãããå人ã¯ã¢ã«ãŠã³ããæã£ãŠããªããããHabrã«èŒããããšãã§ããŸããã
ããªãã®å©ç¹ã®ãããã§ãèè
ã¯æåŸ
ç¶ãæã£ãŠããŸãããããŠä»ã圌ã¯ç§ãã¡ãšäžç·ã«ããŸãïŒ ã³ãã¿ãŒ ã
å
容
- ã·ãŒã ã«ãŒãã³ã°ãšã¯
- ãã®èšäºãèªãéã®æ³šæäºé
- äžè¬çãªã¢ã«ãŽãªãºã ã¹ããŒã
- ãã€ã³ããšãã«ã®ãŒèšç®
- ç·ãšãã«ã®ãŒãæå°ã®ãã§ãŒã³ãèŠã€ãã
- å³é¢ã®åæž
- å³é¢ã®æ¡å€§
- äŸ
- ãŸãšã
ã·ãŒã ã«ãŒãã³ã°ãšã¯
Seam Carvingã¯ãç»åã³ã³ãã³ããèæ
®ã«å
¥ããç»åãµã€ãºå€æŽã¢ã«ãŽãªãºã ã§ãïŒäœæè
ããããåŒã¶ããã«-Content-Aware Image Resizing AlgorithmïŒã 2007幎ã«åããŠå®èšŒããã倧ããªé¢å¿ãåŒã³ãŸããã ãããããã®ãããã¯
ã«é¢ããèšäºãæ¢ã«ãã£ãã®ã§ãHabrã®å€ãã®èªè
ã¯åœŒã«ã€ããŠèããã§ãããã
ãã®åŸãçåãçããŸãããã®ã¢ã«ãŽãªãºã ã¯ç»åã®å
容ãã©ã®ããã«èæ
®ããŸããïŒ çè«çã«ã¯ãããã§ã¯ãã¹ãŠãåçŽã§ã-æåã«ãç»åã®ããŸããŸãªéšåã®éèŠæ§ãèšç®ããããã®åŸãã¢ã«ãŽãªãºã ã«åŸã£ãŠãµã€ãºãããã»ã©éèŠã§ã¯ãªãéšåã®ã¿ãèšç®ãããŸãã å®éã«ã¯ããã®ã¢ã«ãŽãªãºã ãå®è£
ããã«ã¯ãç»åã®éèŠãªéšåãã©ã®ããã«å€æããããç»åã®éèŠã§ãªãéšåãèŠã€ããŠå§çž®ããæ¹æ³ãªã©ãããã€ãã®è³ªåã解決ããå¿
èŠããããŸãã
ãã®èšäºã§ã¯ããããã«å ããŠããã®åé¡ã解決ãããšãã«çããä»ã®å€ãã®è³ªåã«çããããšããŸããã
ãã§ã«ç§ãçµãã£ããã®ãèŠãããšæã£ãŠãã人ã¯ãèšäºã®æåŸã§ç»åã®äŸãšã³ã¡ã³ãä»ããœãŒã¹ã®ãã¢ããã°ã©ã ãèŠã€ããããšãã§ããŸãã
ãã®èšäºãèªãéã®æ³šæäºé
èšäºèªäœã®åã«ãããã€ãã®èŠåãèŠå®ããããšæããŸãã
ãŸã第äžã«ã ãã®èšäºã§ã¯ãããšãã«ã®ãŒããšããçšèªããã䜿çšããŸããããã®çšèªã®æ£ç¢ºæ§ã«ã€ããŠã¯ããããŸããã ãããŠãèè
èªèº«ãè±èªã®åèªããšãã«ã®ãŒããšåŒãã§ããã®ã§ãç§ã¯ããã䜿ããŸãã ãã€ã³ãã®ãšãã«ã®ãŒã¯ãç»åã«ããããã®éèŠæ§ãæå³ããŸãã ããå€ãã®ãšãã«ã®ãŒãããéèŠãªãã€ã³ãã
第äºã«ã ãã®èšäºã§ã¯ãæ°Žå¹³æ¹åã®ãµã€ãºå€æŽã®ã¿ãæ±ããŸãã äž¡æ¹ã®æ¹åã«åæã«ãµã€ãºå€æŽããå Žåãåçã¯åããŸãŸã§ããã¯ã»ã«ã®åçŽãã§ãŒã³ã ãã§ãªããæ°Žå¹³ãã§ãŒã³ãèæ
®ããŠããã ãã§ãã
第äžã«ã CïŒ/ãNETã§æžããçµéšã¯ãããŸããã ããã°ã©ã ãäœæããããã®ãã©ãããã©ãŒã /èšèªã®éžæã¯ãçè§£ããã³ãŒãã®ã·ã³ãã«ããšèŽè¡ã®å¹
åºããªãŒãã«ãããã®ã§ããã ãããã£ãŠãããã°ã©ã å
ã§ç¡å¹ãŸãã¯ããã¬ãããã§ã¯ãªãäœããæžããå Žåãããã«æ³šæãæããªãã§ãã ããã ããã¯ããã°ã©ã ã®æ¬è³ªã§ã¯ãããŸããã
4çªç®ã ãã·ã¢èªã¯ç§ã®æ¯åœèªã§ã¯ãªãã®ã§ãééãã®å¯èœæ§ãããããšãæ®å¿µã«æããŸãã
ãããŠæåŸã®1ã€ã ããã°ã©ã ã³ãŒããæé©ã§ã¯ãããŸããã ã³ãŒãã®åçŽããšã³ãŒãã®æé©æ§ã®éã§ãåçŽããéžæããŸããããããã£ãŠããã®ã¢ã«ãŽãªãºã ãã©ããã§äœ¿çšããå Žåã¯ãã¿ã¹ã¯ã«åãããŠæé©åããŸãã 幞ããªããšã«ãããã«ã¯æé©åã®äœå°ããããŸãã
ããã§ãå®éã«ãç§ãã¡ã¯å奿²ãçµããŸãããä»ãæãè峿·±ããã®ã«ç®ãåããŸã...
äžè¬çãªã¢ã«ãŽãªãºã ã¹ããŒã
ã¢ã«ãŽãªãºã å
šäœã¯ã次ã®ã³ã³ããŒãã³ãã§æ§æãããŠããŸãã
- åãã€ã³ãã®ãšãã«ã®ãŒãèŠã€ããã ãã®æ®µéã§ããããã®ããŒã¿ã«åºã¥ããŠãç»åã®ã©ã®éšåãããéèŠã§ãã©ã®éšåãããã»ã©éèŠã§ãªãããèŠã€ããå¿
èŠããããŸãããã®åŸãç»åãµã€ãºã倿ŽããŸãã
- ãã®ãã§ãŒã³ã«å
¥ããã¯ã»ã«ã®ç·ãšãã«ã®ãŒãæå°ã«ãªãããã«ããã¯ã»ã«ã®åçŽãã§ãŒã³ãèŠã€ããã ãã¯ã»ã«ãã§ãŒã³ã¯ãåè¡ã§æ£ç¢ºã«1ã€ã®ãã¯ã»ã«ãéžæããããã®äžã®é£æ¥ãããã¯ã»ã«ã蟺ãŸãã¯è§ã§æ¥ç¶ãããŠãããã¯ã»ã«ã®ã»ããã§ãã ãã®ãããªãã§ãŒã³ãèŠã€ãã£ãå Žåãç»åã®ã³ã³ãã³ããžã®åœ±é¿ãæå°éã«æããªãããç»åããåé€ã§ããŸãã
- æå°éã®ãšãã«ã®ãŒã§ãã§ãŒã³ãèŠã€ããå Žåãç»åãçž®å°ããå¿
èŠãããå Žåã«ã®ã¿ãã§ãŒã³ãåé€ã§ããç»åãæ¡å€§ããå¿
èŠãããå Žåã«ã¯ã¹ãã¬ããã§ããŸãã
次ã«ãåé
ç®ãããã«è©³ããæ€èšããŸãã
ãã€ã³ããšãã«ã®ãŒèšç®
ãŸããç»åã®ã©ã®éšåãéèŠã§ãã©ã®éšåãéèŠã§ãªããã倿ããå¿
èŠããããŸãã
ãã®åé¡ã解決ããããã«ãã¢ã«ãŽãªãºã ã®äœæè
ã¯ãåãã¯ã»ã«ã«ã€ããŠããšãã«ã®ãŒããã€ãŸãããã®ç»åã§ãã®ãã¯ã»ã«ãéèŠã§ãããã©ãããç€ºãæ¡ä»¶ã€ã³ãžã±ãŒã¿ãŒïŒãªãŠã ïŒãèšç®ããããšãææ¡ããŸãã
ååãšããŠããããè¡ãã«ã¯å€ãã®æ¹æ³ããããŸããæãåçŽãªæ¹æ³ïŒããšãã°ã飿¥ãããã®ãšæ¯èŒããŠè²ã®å€åãæ°ããïŒããããªãè€éãªæ¹æ³ïŒããšãã°ãäººã®æ³šæãåæããïŒãŸã§ã§ãã èè
èªèº«ã«ãããšã圌ãã¯å€ãã®ãšãã«ã®ãŒé¢æ°ããã¹ãããæãåçŽãªé¢æ°ã®1ã€ãæè¯ã®çµæã®1ã€ãäžããŸããã ãããã£ãŠããã®æ©èœã䜿çšããŸãã ããã«ãããŸãïŒ
ãã®åŒãèŠãŠãåæãæãåºãå¿
èŠã®ããæŽŸçç©ãèŠãã®ãæãã®ãªããç¡é§ã§ãã å®éãããã¯éåžžã«åçŽã«å®åŒåãããŠããŸãããã¯ã»ã«ã®ãšãã«ã®ãŒã¯ãæå®ããããã¯ã»ã«ãšæ¯èŒããŠã飿¥ãããã¯ã»ã«ã®è²ã®å€åã«çãããªããŸãã ã€ãŸããç¹å®ã®ãã¯ã»ã«ãšé£æ¥ãããã¯ã»ã«ã®è²ã®å·®ã倧ããã»ã©ããã®ãšãã«ã®ãŒã¯å€§ãããªããŸãã
次ã«ãå®éã®ãšãã«ã®ãŒèšç®ã®å®è£
ãæ€èšããŸãã ã€ã¡ãŒãžãã€ã³ãããã®åŒ·åºŠã§ç¹åŸŽä»ããŸãã æ¬¡ã®3x3ãããç»åããããŸãã
ãŸãããã¯ã»ã«ãšãã®é£æ¥ãã¯ã»ã«ïŒå³ãšäžïŒã®åŒ·åºŠã®å·®ãæ³ãšããŠèšç®ããæ¬¡ã«ãããã®å€ã®ç®è¡å¹³åãšããŠãã®ãã¯ã»ã«ã®ãšãã«ã®ãŒãèšç®ããŸãã
éžæãããã¯ã»ã«ã®å ŽåïŒå³åŽã®é£ã®ãã¯ã»ã«ãš8ã®å·®ã¯ãäžéšã®é£ã®ãã¯ã»ã«ãš3ã®å·®ã§ããç®è¡å¹³åã¯ïŒ8 + 3ïŒ/ 2 = 5.5ã§ãã ããããæŽæ°ãæ±ãæ¹ããã䟿å©ã§é«éã§ããããã®ãããªç²ŸåºŠã¯äžèŠã§ãããããå°æ°éšåã¯ç Žæ£ããŸãã ã€ãŸããéžæãããã¯ã»ã«ã®ãšãã«ã®ãŒã¯5ã§ãã
åæ§ã«ãæ®ãã®ãã¯ã»ã«ã«ã€ããŠèšç®ããŸãã ãã®å Žåãå³ç«¯ãšäžç«¯ã«æ¥µç«¯ãªãã¯ã»ã«ãããã®ã¯ãå³ãŸãã¯äžã«é£æ¥ãããã¯ã»ã«ã®ã¿ã§ããããããããã®å Žåãå·®ã®å€ã¯ç®è¡å¹³åã«ãªããŸãã å³äžé
ã®ãã¯ã»ã«ã«ã¯ããã®ãããªè¿åã¯ãŸã£ãããªãããããã®ãšãã«ã®ãŒã0ãšããŠååŸããŸããçè«çã«ã¯ãšãã«ã®ãŒãèšç®ããããšãã§ããŸãããå®éã«ã¯ç¡èŠã§ãããããçæŽ»ãè€éã«ããããšã¯ãããŸããã
ãã®çµæã次ã®ãã¯ã»ã«ãšãã«ã®ãŒã®ãããªãã¯ã¹ãååŸããŸãã
ãã¯ã»ã«ã匷床ã ãã§ãªããRãGãBã®åŒ·åºŠå€ã«ãã£ãŠå¥ã
ã«ç¹åŸŽä»ããããŠããå Žåããã¯ã»ã«ãšãã«ã®ãŒã¯åæåã®ãšãã«ã®ãŒã®åèšã«çãããªããŸãã
ç»åã®ãšãã«ã®ãŒãããã®äŸïŒ
ãã®å³ã§ã¯ããšãã«ã®ãŒãããã®è²ãæ¿ãã»ã©ããšãã«ã®ãŒãå€ããªããŸãã
次ã®é¢æ°ã䜿çšããŠãã¯ã»ã«ãšãã«ã®ãŒã®æ€åºãå®è£
ããŸããã
private void FindEnergy() { for (int i = 0; i < imgHeight; i++) for (int j = 0; j < imgWidth; j++) { energy[i, j] = 0; // R, G, B for (int k = 0; k < 3; k++) { int sum = 0, count = 0; // , sum if (i != imgHeight - 1) { count++; sum += Math.Abs((int)image[i, j, k] - (int)image[i + 1, j, k]); } // , sum if (j != imgWidth - 1) { count++; sum += Math.Abs((int)image[i, j, k] - (int)image[i, j + 1, k]); } // energy k- ( R, G B) if (count != 0) energy[i, j] += sum / count; } } }
ãã®é¢æ°ã¯ã°ããŒãã«å€æ°ã§æ©èœããŸãïŒenergy-ãšãã«ã®ãŒãæžã蟌ãŸããé
åãšimage-ç»åãä¿åãããé
åã
ç·ãšãã«ã®ãŒãæå°ã®ãã§ãŒã³ãèŠã€ãã
åãã¯ã»ã«ã®ãšãã«ã®ãŒå€ã¯ãã§ã«ãããŸãããæå°ãšãã«ã®ãŒå€ãæã€ãã¯ã»ã«ãéžæããå¿
èŠããããŸãã ããããä»»æã®ãã¯ã»ã«ãããã¯ã¢ãã/远å ãå§ãããšãç»åèªäœãåçŽã«å€ã«åºãŠèªèã§ããªãã»ã©å€åœ¢ããŸãã ãã¡ããããã®çµæã¯ç§ãã¡ã«ã¯åããŸããã ãããã£ãŠãæåã«ãã¯ã»ã«ã®ãã§ãŒã³ãéžæããŠãããããããåé€ãŸãã¯è¿œå ããå¿
èŠããããŸãã ãããŠãä»»æã®ãã§ãŒã³ã§ã¯ãªãããæ£ãããã§ãŒã³ãã
ãæ£ããããã§ãŒã³ãšã¯ãç»åã®åè¡ã§æ£ç¢ºã«1ãã¯ã»ã«ãéžæããã飿¥ããè¡ã®ãã¯ã»ã«ã蟺ãŸãã¯è§ã§ãæ¥ç¶ãããããããªãã€ã³ãã®ã»ããã§ãã
ãæ£ããããã§ãŒã³ã®äŸïŒ
ãééã£ãããã§ãŒã³ã®äŸïŒ
ããã§ããæ£ããããã§ãŒã³ãåé€ããå¿
èŠãããããšãããã£ãã®ã§ãã€ã¡ãŒãžãããŸãæãªãããšã¯ãããŸããã ããããæ¬¡ã«éžæãããã§ãŒã³ã¯ã©ãã§ããïŒ ã¢ã«ãŽãªãºã ã®äœæè
ã¯ãé€å»/ã¹ãã¬ããã®ããã«ãããã®ãã§ãŒã³ãéžæããããšãææ¡ããŸããããã«å«ãŸãããã¯ã»ã«ãšãã«ã®ãŒã®åèšã¯æå°ã§ãã
ããã¯éåžžã«èªç¶ãªçåãæããŸãïŒãã®ãããªãã§ãŒã³ãã©ã®ããã«èŠã€ããã®ã§ããïŒ
ãªãã·ã§ã³1-ãã¹ãŠã®ãã§ãŒã³ããœãŒãããããããèŠçŽããŠãæå°éã§èŠã€ããŸãã ãã¡ããããã®ãªãã·ã§ã³ã¯è峿·±ããã®ã§ãããå°ããªç»åã§ãåŠçããããã«ã¯æ°žé ã«åŸ
ããªããã°ãªããŸãã:)åšåº«ãæ°žé ã«ããå Žåã培åºçãªæ€çŽ¢ãéå§ãåŸ
æ©ã®ã³ãŒããèšè¿°ããŸãã çæéã§çµæã確èªãããå Žåã¯ãå
ã«é²ãã§ãã ããã
ããã§ãåçããã°ã©ãã³ã°ã®å©ãã«ãªããŸãã 詳现ã«ã¯è§Šãããããã°ã©ãã³ã°ã®ããã€ãããºã ããäœã§ããããæ£ç¢ºã«ç€ºããŸããïŒãšããã§ããããã°ã©ãã³ã°ããšããçšèªã¯ããã§ã³ãŒããæžãããšãšã¯é¢ä¿ãããŸããïŒãããã«ã¢ã«ãŽãªãºã ã«çŽæ¥é²ã¿ãŸãã 誰ãããåçããã°ã©ãã³ã°ããäœã§ããããç¥ãããç¥ãããå Žåã¯ã
ãŠã£ãããã£ã¢ãŸãã¯ä»ã®ãœãŒã¹ã§ããã«ã€ããŠèªãããšãã§ããŸãã
ãŸãããã¯ã»ã«ãšãã«ã®ãŒãæã€é
åãšåããµã€ãºã®æ°ããé
åãäœæããŸãã ãã®é
åã§ã¯ããã¯ã»ã«ããšã«ããã¯ã»ã«ã®æå°ãã§ãŒã³ã®èŠçŽ ã®åèšãæžã蟌ã¿ãŸããããã¯ãç»åã®äžç«¯ããå§ãŸãããã®ãã¯ã»ã«ã§çµãããŸãã
äŸã«ãã£ãŠèšç®ããã»ã¹ã瀺ããŸãã åãã¯ã»ã«ã®ãšãã«ã®ãŒå€ãæã€é
åããããšããŸãïŒ
ãã®é
åã®èŠçŽ ãè¡ããšã«èšç®ããŸã-æåããæåŸãŸã§ã äžçªäžã®è¡ã§ã¯ããã®é
åã®èŠçŽ ã¯é
åã®èŠçŽ ãšçãããªããŸãããã®ãããªåèŠçŽ ããæ§ç¯ã§ãããã§ãŒã³ã¯1ã€ã ãã§ããããã§ãïŒãã¹ãŠãŠãããé·ïŒã
次ã«ã2è¡ç®ãèšç®ããŸãããã éžæããã»ã«ãæ€èšããŠãã ããã ãã®ã»ã«ãããã§ãŒã³ãæ§ç¯ããã«ã¯ãå³ã«ç€ºãããã«3ã€ã®æ¹æ³ããããŸãã ããã3ã€ã®æ¹æ³ã®ãã¡ãæå°å€ãéžæããå¿
èŠããããŸãïŒæå°ãã§ãŒã³ã®æ£ç¢ºãªåèšãèæ
®ããããïŒã éžæããã»ã«ã®å Žåãããã¯åèš3ã®ãã§ãŒã³ã«ãªãããã®ãã§ãŒã³ã«ã»ã«èªäœã®ãšãã«ã®ãŒã远å ããŸãã ãããã£ãŠããã®ã»ã«ã«ã¯æ°å7ïŒ3ãš4ã®åèšïŒãæžã蟌ã¿ãŸãã åæ§ã«ã2è¡ç®ã®ãã¹ãŠã®èŠçŽ ã®ãã¹ãŠã®åèšãèšç®ããŸãã
3è¡ç®ã«é²ã¿ãŸãããã ååãšããŠã3è¡ç®ã¯2è¡ç®ã«é¡äŒŒããŠãããšèŠãªãããŸãã éžæããã»ã«ãããäžåºŠèŠãŠã¿ãŸãããã ããããããã®ãããªãã§ãŒã³ã圢æã§ããŸãïŒ
- ãã®ã»ã«ãšé·ã8ã®æå°ãã§ãŒã³ã
- ãã®ã»ã«ãšé·ã6ã®æå°ãã§ãŒã³ã
- ãã®ã»ã«ãšé·ã7ã®æå°ãã§ãŒã³ã
ãããã®ãªãã·ã§ã³ã®ãã¡ãåã³æå°å€ïŒ6ïŒãéžæããã»ã«èªäœã®ãšãã«ã®ãŒã远å ããŸãïŒ6ïŒã ãã®ã»ã«ã®å€ã¯12ã§ããåæ§ã«ã3è¡ç®ã®æ®ãã®èŠçŽ ãæ€èšããŸãã
ãã®æ¹æ³ã§ãã¹ãŠã®è¡ãèšç®ããåŸãçµæãšããŠæ¬¡ã®é
åãååŸããŸãã
ãã®é
åã®èšç®ã圢åŒåãããšã次ã®åŒãåŸãããŸãã
ããã§ãsã¯åèšã®é
åãeã¯ãšãã«ã®ãŒã®é
åã§ãã
åèšã®é
åãèšç®ããç§ã®å®è£
ïŒ
private void FindSum() { // sum energy for (int j = 0; j < imgWidth; j++) sum[0, j] = energy[0, j]; // (i,j) sum // energy[i,j] + MIN ( sum[i-1, j-1], sum[i-1, j], sum[i-1, j+1]) for (int i = 1; i < imgHeight; i++) for (int j = 0; j < imgWidth; j++) { sum[i, j] = sum[i - 1, j]; if (j > 0 && sum[i - 1, j - 1] < sum[i, j]) sum[i, j] = sum[i - 1, j - 1]; if (j < imgWidth - 1 && sum[i - 1, j + 1] < sum[i, j]) sum[i, j] = sum[i - 1, j + 1]; sum[i, j] += energy[i, j]; } }
ãã®é¢æ°ã¯ãã°ããŒãã«å€æ°ã§æ©èœããŸããenergy-ãšãã«ã®ãŒãæžã蟌ãŸããé
åãšsum-åèšãæžã蟌ãŸããé
åã
ãã§ã«ãã®é
åãæã£ãŠããã®ã§ãèããæãæ¥ãŸãã-ãªããããå¿
èŠãªã®ã§ããããïŒ ç§ã¯çããŸã-ãã®é
åããããšãã«ã®ãŒã®åèšãæå°ã®ãã§ãŒã³ããã°ããèŠã€ããããšãã§ããŸãã
ãŸããç»åã®äžçªäžã®è¡ã®ã©ã®ãã¯ã»ã«ããã®ãã§ãŒã³ã«å±ããŠããããèŠã€ããŸããæ¢ããŠããèŠçŽ ã¯ãäžçªäžã®è¡ã®èŠçŽ ã®äžã§sumé
åã§æå°ã®å€ãæã¡ãŸãã ãªãã§ïŒ ãã®é
åã§ã¯ãäžç«¯ããæå®ããããã¯ã»ã«ãŸã§ã®æå°ãã§ãŒã³ã®èŠçŽ ã®åèšã®å€ãèšé²ãããããšãæãåºããŠãã ããã èå³ã®ãããã§ãŒã³ã¯ãæåŸã®è¡ã®ãã¯ã»ã«ã§çµäºããŸãã ãããã£ãŠãå³å
šäœã«ã€ããŠãæå°ãã§ãŒã³ã¯ãæçµè¡ãããã¯ã»ã«ã§çµãããã¹ãŠã®æå°ãã§ãŒã³ã®æå°ãšããŠéžæãããŸãã
ãã®äŸã§ã¯ãããã¯æ¬¡ã®èŠçŽ ã«ãªããŸãã
æå°ãã§ãŒã³ãçµäºãããã¯ã»ã«ã¯ãã§ã«ããã£ãŠããŸãããæåŸãã2çªç®ã®è¡ãããã¯ã»ã«ãèŠã€ããããšãã§ããŸãã ãã§ã«èª¬æããããã«ãäžã®ãã¯ã»ã«ãããäžã®è¡ã«ãã3ã€ã®é£æ¥ãã¯ã»ã«ïŒå·ŠäžãäžããŸãã¯å³äžïŒã«ã®ã¿ç§»åã§ããŸãã ãããã®ãã¯ã»ã«ã®äžãããåèšé
åã®æå°å€ãæã€ãã¯ã»ã«ãéžæããŠãããã«ç§»åããŸãã ãããã©ã€ã³ã«éãããŸã§ç¶ããŸãã æ¬¡ã®å³ã«ããã»ã¹ã瀺ããŸãã
ããããã¹ãŠã®æäœãå®äºãããšãå¿
èŠãªãã®ãã€ãŸãç»åã®æå€±ãæå°éã«æããªãã倿Žã§ãããã¯ã»ã«ã®ã»ãããåŸãããŸãã
å³ã®æå°ãã§ãŒã³ã®äŸïŒ
ãã§ãŒã³æ€çŽ¢ã¢ã«ãŽãªãºã ã®ãœãããŠã§ã¢å®è£
ïŒ
private int[] FindShrinkedPixels() { // int last = imgHeight - 1; // int[] res = new int[imgHeight]; // sum, res[last] res[last] = 0; for (int j = 1; j < imgWidth; j++) if (sum[last, j] < sum[last, res[last]]) res[last] = j; // . for (int i = last - 1; i >= 0; i--) { // prev - // (prev-1), prev (prev+1), int prev = res[i + 1]; // , sum, , , res[i] res[i] = prev; if (prev > 0 && sum[i, res[i]] > sum[i, prev - 1]) res[i] = prev - 1; if (prev < imgWidth - 1 && sum[i, res[i]] > sum[i, prev + 1]) res[i] = prev + 1; } return res; }
å³é¢ã®åæž
æçµçã«ãäœæ¥ã«äœ¿çšãããã¯ã»ã«ã®ãã§ãŒã³ãèŠã€ããŸããã ä»ãç§ãã¡ãåœŒå¥³ãæ¢ããŠããçç±ãæãåºãããšãã§ããŸãã ç§ãã¡ã®ä»äºã¯ç»åã®ãµã€ãºå€æŽã§ãã ç»åã®æ¡å€§ãšçž®å°ã¯ãããã«ç°ãªããããæåã«çž®å°ãæ€èšããæ¬¡ã«æ¡å€§ãæ€èšããŸãã
ç»åã®å¹
ã1ãã¯ã»ã«æžããå¿
èŠãããå Žåããã¹ãŠãç°¡åã§ããäžã§èª¬æããããã«ãåçŽãã§ãŒã³ãèŠã€ããŠãç»åããåé€ããã ãã§ãã æ¬¡ã®ã«ãŒãã§ãã®æäœãå®è£
ããŸããã
for (int i = 0; i < imgHeight; i++) for (int j = cropPixels[i]; j < imgWidth; j++) { pImage[i, j] = pImage[i, j + 1]; }
cropPixelsé
åã®içªç®ã®èŠçŽ ã«ã¯ããã¯ã»ã«åã®çªå·ãæžã蟌ãŸããiçªç®ã®è¡ããåé€ãããŸãã ãµã€ã¯ã«èªäœã¯
次ã®ããšãè¡ããŸããåé€ãããã¯ã»ã«ã®å³åŽã«æžã蟌ãŸãããã¹ãŠã®ãã¯ã»ã«ã¯ã1ãã€ã³ãå·Šã«ã·ããããŸãã ãã®æäœã®çµæããã¯ã»ã«ãã§ãŒã³ã¯ç»åããåé€ãããŸãã
ã€ã¡ãŒãžã1ãã¯ã»ã«ã§ã¯ãªãããã倧ããªå€ã§çž®å°ããå¿
èŠãããå Žåã¯ãå¿
èŠã«å¿ããŠãã§ãŒã³ãåé€ããæäœãå®è¡ããŸãïŒãã®ãã§ãŒã³ãæ¢ãå¿
èŠããããã³ã«ïŒã
ç»åãnãã¯ã»ã«çž®å°ããæäœãšãç»åã1ãã¯ã»ã«nåçž®å°ããæäœã¯åçã§ã¯ãªãããšã«æ³šæããŠãã ããã ãããã®éãã¯ã1ãã¯ã»ã«ãã€nåã«æžãããšãåäžéç»åã«ã€ããŠãã¯ã»ã«ã®ãšãã«ã®ãŒãæ¢ããããã«nã ãæžãããšãå
ã®ç»åãããã¯ã»ã«ã®ãšãã«ã®ãŒãåãåºãããšã§ãã
å³é¢ã®æ¡å€§
ç»åãçž®å°ããæ¹æ³ã¯ãã§ã«ããã£ãŠããŸãããä»ã¯ç»åãæ¡å€§ããæ¹æ³ãèŠã€ããå¿
èŠããããŸãã
æåã«é ã«æµ®ãã¶ã®ã¯ããã§ãŒã³ãéžæãããã§ãŒã³ãéžæããŠãã¹ãã¬ããããããšããšãŸã£ããåãã§ãã ãããããããå®è£
ãããšã次ã®çµæãåŸãããŸãã
ã芧ã®ãšãããããã°ã©ã ã¯1åã ããåŒã䌞ã°ããŠããŸãããããã¯å¿
èŠãªãã®ã§ã¯ãããŸããã
ããšãã°ã次ã®ãããªèããèããããŸããæå°ãã§ãŒã³ã1ã€ã§ã¯ãªããå¿
èŠãªå¹
ã«åãããŠç»åã宿ãããã®ã«å¿
èŠãªã ãã®éãåãå¿
èŠããããŸãã ãã®ã¢ã«ãŽãªãºã ãå®è£
ãããšããŸãããå³ã2åã«ãããšã©ããªããŸããïŒ
ãã®å³ãããããããã«ããã¹ãŠã®ãã€ã³ããéžæããŠæ°Žå¹³æ¹åã«ã¹ãã¬ããããŸãããããã®æ¹æ³ã¯éåžžã®ã¹ãã¬ãããšå€ãããªããããå¿
èŠãªãã®ã§ã¯ãããŸããã
ããããååãšããŠãåŸè
ã®æ¹æ³ã®ã¢ã€ãã¢ãã®ãã®ã¯æ£ããã§ãããããããªå€æŽããããŸããæ®µéçã«ç»åãæ¡å€§ããå¿
èŠããããŸãããã®ãããåæ®µéã§ç»åã®ãéèŠã§ã¯ãªããéšåãã§ããã ãå€ãããéèŠãªãéšåãã§ããã ãå°ãªãããŸãã ãã®åŸãå¢å ããããã»ã¹ã段éçã«åå²ããæ¹æ³ãåé¡ã«ãªããŸããïŒ æåã§æ®µéã«åå²ããããšãããããçš®ã®ãã¥ãŒãªã¹ãã£ãã¯ã¢ãã©ã€ã¶ãŒãäœæããããšãŸã§ãå€ãã®ãªãã·ã§ã³ããããŸãã ããããç§ã®ããã°ã©ã ã§ã¯ãç°¡åã«èšè¿°ããŸãããæ®µéãžã®åå²ã¯ãåæ®µéã§ç»åã50ïŒ
ãè¶
ããŠå¢å ããªãããã«è¡ãããŸãã ããã¯åãå
¥ããããçµæã«ãªãå ŽåããããŸãããããã§ãªãå ŽåããããŸãããæ¢ã«æžããããã«ãã¹ããŒãžãžã®åå²ãå®è£
ããããã®å€ãã®ãªãã·ã§ã³ãèãåºãããšãã§ããŸãã
ãã®æ¹æ³ã§UFOç»åãæ¡å€§ãããšã次ã®çµæãåŸãããŸãã
ã芧ã®ãšãããUFOãäººãæšã¯å€åããŠããŸããã
äŸ
ã¹ã±ãŒãªã³ã°å³é¢ã®äŸã¯ãã¹ãŠããã®èšäºãšäžŠè¡ããŠäœæããããã°ã©ã ã䜿çšããŠååŸããããã§èª¬æããã¢ã«ãŽãªãºã ãå®è£
ããŠããŸãã
ãœãŒã¹ãšããã°ã©ã ãã€ããªã¯ãèšäºã®äžéšããããŠã³ããŒãã§ããŸãã
ã³ã³ãã³ãã«å¿ãããµã€ãºå€æŽã®å
žåçãªäŸïŒ
次ã®å³ã§ã¯ããéèŠãªããªããžã§ã¯ããšèæ¯ãçºé³ãããŠããŸãã
ïŒãªãªãžãã«ïŒ ïŒæžå°ïŒ ïŒå¢å ïŒæç©ºã®æç»ã ãµã€ãºã倿ŽããŠããæã®åœ¢ã¯ã»ãšãã©å€ãããŸããã
ïŒãªãªãžãã«ïŒ ïŒæžå°ïŒ ïŒå¢å ïŒãŸãã
gmmã§æ®åœ±ãã2æã®åçãã¹ã±ãŒãªã³ã°ããå¥ã®äŸã§ãã
ïŒãªãªãžãã«ïŒ ïŒæžå°ïŒ ïŒå¢å ïŒ
ïŒãªãªãžãã«ïŒ ïŒæžå°ïŒ ïŒå¢å ïŒ
ãŸãšã
ããã§ãçµæãšããŠäœãåŸãã®ãïŒ
- Seam Carvingã®ãããªè峿·±ãæçšãªã¢ã«ãŽãªãºã ã®åäœåçã«é¢ããç¥èã
- ç»åãªãµã€ã¶ãŒã§ãã¬ã€ã§ããããã°ã©ã ïŒãã¡ããPhotoshopãšhttp://rsizr.com/ããããŸããããããã®å Žåã¯ãœãŒã¹ããããŸããïŒã
- ã¢ã«ãŽãªãºã ã®å¯èœãªæ¹åãæ³åããäœå°ãååã«ãããŸãïŒããšãã°ã顿€åºåšãããã«åãä»ããããšãã§ããçµæãè¯ããªããšæããŸãïŒã
- Photoshopã®Content-Aware Rescaleã¯Photoshopã®ç¹å¥ãªéæ³ã§ã¯ãªããçè§£ã§ããéåžžã®ã¢ã«ãŽãªãºã ã§ãããšããç¥èã
èšäºãæåŸãŸã§èªãã§ããã人ã®ãããã§ããããããã£ããšæããŸãã
PS
ãœãŒã¹ïŒVS 2008ïŒãã€ããªïŒ.NETïŒæŽæ°ãããããã¯ã«é¢ãã圹ç«ã€ãªã³ã¯ïŒ
ãªã¹ãã¯è£å
ãããå ŽåããããŸãã