ããžã¿ã«ç»ååŠçã¯éåžžã«è峿·±ãåéã§ãããåå¿è
ãåžžã«ééããèœãšã穎ããããããããŸãã ç§ãã¡ã¯åŠçã婿éããããžã§ã¯ãã«ç©æ¥µçã«åŒãä»ããŸãããæ°ããç»ååŠçã¢ã«ãŽãªãºã ã®å®è£
ãå¿
èŠãšããå®éã®ã¿ã¹ã¯ãåŠçã«äžããããšãããšãåäŸãã¡ã®ééãã«ææãèŠããŸããã
ãããã£ãŠãæ¬æ Œçãªã¿ã¹ã¯ãèšå®ããåã«ãåŠçã«æšæºçãªç»ååŠçã¢ã«ãŽãªãºã ãå®è£
ããããã®ããã€ãã®å®çšçãªã¿ã¹ã¯ãæäŸãå§ããŸããïŒç»åã®åºæ¬æäœïŒå転ããŒããïŒãç³ã¿èŸŒã¿ãåçŽãªãã£ã«ã¿ãŒã䜿çšããè£éïŒåç·åœ¢ãåäžæ¬¡ïŒãæ¹åè£éãã¢ã«ãŽãªãºã ã䜿çšããå¢çæœåºãã£ããŒãããŒãã€ã³ãæ€åºãªã© ããã°ã©ãã³ã°èšèªã¯ã©ãã§ãããŸããŸããããã¿ã¹ã¯ã®å®è¡æã«ã¯ãç»åã®èªã¿åããšæžã蟌ã¿ãé€ãããµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããããšã¯ã§ããŸããã ããã¯ãã¿ã¹ã¯ãæ¬è³ªçã«æè²çã§ãããã¢ã«ãŽãªãºã ã®ç¬ç«ããå®è£
ãããã°ã©ãã³ã°ã®åªããå®è·µã§ãããã¡ãœãããå
éšããã©ã®ããã«æ©èœããããçè§£ã§ãããšããäºå®ã«ãããã®ã§ãã
ãã®èšäºã§ã¯ãåŠçãç»ååŠçã§å®éçãªã¿ã¹ã¯ãå®è¡ãããšãã«ç¯ãæãäžè¬çãªééãã«ã€ããŠèª¬æããŸãã ç»åã¯æ®éã®ãã®ã§ã16ãããã®è²æ·±åºŠããã³ã¯ãããã£ãã¯æ§ã3Dç»åã®ãšããŸããã¯ãªã¿ã€ãã¯ãããŸããã
ãšã©ãŒ1.ã·ã¹ãã ãªããžã§ã¯ãBitmapãHBITMAPãªã©ã䜿çšããŠç»åãä¿åããããã«ãã¯ã»ã«ãæäœãã
ãããã®ãªããžã§ã¯ãã¯ãã°ã©ãã£ãã¯ã¹ãµãã·ã¹ãã ãšçžäºäœçšããããã«èšèšããïŒããªããã£ããšããã¹ãã®æç»ãç»é¢ãžã®è¡šç€ºïŒãç»åãã¯ã»ã«ãä¿åãããŠããã¡ã¢ãªé åãžã®çŽæ¥ã¢ã¯ã»ã¹ãæäŸããŸããã ãã¯ã»ã«ã«ã¯ãGetPixelããã³SetPixel颿°ã䜿çšããŠã¢ã¯ã»ã¹ããŸãã ãããã®é¢æ°ã®åŒã³åºãã¯éåžžã«é«äŸ¡ã§ã-ãã¯ã»ã«ãžã®çŽæ¥ã¢ã¯ã»ã¹ããã2ã3æ¡é
ããªããŸãã èªæã¯ãããããããã¿ã€ããããã«å©çšã§ããCïŒã§ç¹ã«åªããŠããŸãã
解決çïŒãããã®ã¯ã©ã¹ã¯ããã¡ã€ã«ããã®èªã¿åãããã¡ã€ã«ãžã®æžã蟌ã¿ãç»é¢ãžã®è¡šç€ºã«ã®ã¿äœ¿çšããä»ã®å Žåã¯ããã¯ã»ã«ã«å¹æçã«ã¢ã¯ã»ã¹ã§ããã¯ã©ã¹ãæäœããŸãã
泚ïŒå Žåã«ãã£ãŠã¯ãWindowsã§DIBïŒããã€ã¹ã«äŸåããªãããããããïŒã䜿çšãããšäŸ¿å©ã§ãããã¯ã»ã«ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããç»é¢ã«è¡šç€ºã§ããŸãããã€ãã¹ã¯ãã¯ã»ã«ã®çš®é¡ã®å¶éã§ãã
ãšã©ãŒ2.ç»ååŠçã®çµéšããªããŠãç»åãæäœããããã«ã©ã€ãã©ãªã䜿çšãã
ã©ã€ãã©ãªã®äœ¿çšã«ã¯ãã¢ã«ãŽãªãºã ã®æäœã«é¢ããçè§£äžè¶³ãšãã©ã€ãã©ãªã«ãªãç¬èªã®ã¢ã«ãŽãªãºã ã®éçºãå¿
èŠãšããå®éçãªåé¡ã解決ããéã®ãããªãå°é£ã䌎ããŸãã ããã¿èŸŒã¿ãªã©ã®åºæ¬çãªæäœããå®è£
ã§ããªãããã°ã©ãã³ã°ã®åªããåŠçã«åºäŒããŸãããã©ã€ãã©ãªãæ¥ç¶ã§ããªãã£ããããã®ããã«æ©èœããŸããã§ãããã10è¡ã®é¢æ°ãèšè¿°ããã ãã®å¿ããããŸããã§ããã
解決çïŒãµãŒãããŒãã£ã®ã©ã€ãã©ãªã䜿çšããã«ãç»åãæäœããããã®ç¬èªã®ã¯ã©ã¹ãäœæããåºæ¬çãªã¢ã«ãŽãªãºã ãç¬èªã«å®è£
ããŸãã ããã¯ãååãªããã°ã©ãã³ã°çµéšããªã人ã«ãšã£ãŠç¹ã«äŸ¿å©ã§ãã æããªãã¹ã®ããã«ãããžã§ã¯ãå
šäœãåãå°œããããããèªè»¢è»ãæ°åå£ããæ¹ãè¯ãã§ãããã
ééã3.äžžãã®ç²ŸåºŠã倱ãããŸãã
ããŸããŸãªç»ååŠçã¢ã«ãŽãªãºã ãé©çšããçµæãå®éã®ã¿ã€ãã®äžéçµæãçããŸãã äŸïŒã»ãšãã©ãã¹ãŠã®å¹³ååãã£ã«ã¿ãŒãããšãã°ã¬ãŠã¹ãã£ã«ã¿ãŒã çµæããã€ãåã«ãã£ã¹ããããšã远å ã®ãšã©ãŒãçºçããã¢ã«ãŽãªãºã ã®ç²ŸåºŠãäœäžããŸãã
以äžã«ãCannyãã¹æ€åºã¢ã«ãŽãªãºã ã®åäœã®äŸã瀺ããŸãããã®ã³ã³ããŒãã³ãã®1ã€ã¯ãåŸé
ã¢ãžã¥ã©ã¹ã®èšç®ã§ãã å·ŠåŽ-èšç®åŸã®åŸé
ã¢ãžã¥ãŒã«ã¯floatåã«æ ŒçŽãããå³åŽ-ãã€ãã«äžžããããŸãã


äžžã¿ãä»ãããšã茪éãç ŽããããšãããããŸãã
解決çïŒã¢ã«ãŽãªãºã ã®ç²ŸåºŠãéèŠãªå Žåã¯ããã€ãã®ä»£ããã«ãããŒãã¿ã€ãã䜿çšããŠãã¯ã»ã«å€ãä¿åããææå°æ©ãªæé©åãè¡ããªãã§ãã ãã-æåã«ã¢ã«ãŽãªãºã ããããŒãã§æ£åžžã«åäœãããŠãããå質ãäœäžããªãããã«ãã€ãã䜿çšã§ããå Žæãæ€èšããŠãã ãã
泚ïŒå®æ°ã䜿çšããææ°ã®ããã»ããµãŒã®éåºŠã¯æŽæ°ã«å¹æµããŸãã å Žåã«ãã£ãŠã¯ãã³ã³ãã€ã©ã¯èªåãã¯ãã«åãé©çšã§ããŸããããã«ãããfloatã䜿çšããã³ãŒããé«éåãããŸãã ãŸãã倿°ã®ãã€ããããŒã倿ãäžžããã¯ãªããã³ã°ã䜿çšãããšããããŒããå«ãã³ãŒããé«éã«ãªãããšããããŸãã ããããdoubleã®äœ¿çšãæ£åœåãããããšã¯ãã£ãã«ãªããfloatãšdoubleããã®ããã·ã¥ã¯ãäžè¬ã«ããããã䜿çšããã¿ã€ããšååã®èª€è§£ã®çµæã§ãã
æŽæ°åïŒbyteãint16ãuint16ïŒã䜿çšããããšã¯ãã¡ã¢ãªã¢ã¯ã»ã¹é床ãããã«ããã¯ã«ãªããã¯ãã«æŒç®ã䜿çšããå Žåã«ç¹ã«å¹æçã§ãã
ãšã©ãŒ4.ç¯å²[0ã255]ã®ç¯å²å€ã®ãã¯ã»ã«å€
粟床ã«åé¡ã¯ãããŸãããããã€ãå€ã䜿çšããŠãã¯ã»ã«å€ãä¿åãããã§ããïŒ ãã®åŸãå¥ã®åé¡ãçºçããŸãããã€ãã¥ãŒããã¯è£éãã·ã£ãŒããã³ã°ãªã©ã®å€ãã®æäœã«ãããæå®ãããç¯å²å€ã®å€ã衚瀺ãããŸãã ãã®äºå®ãèæ
®ããªãå Žåãæãè¿ããšåŒã°ãã广ãçºçããŸããå€260ã¯4ã«ãâ3ã¯253ã«å€ãããŸããæããèæ¯ã«æããç¹ãšç·ã衚瀺ãããæããèæ¯ã«æãç¹ãšç·ã衚瀺ãããŸãïŒå·ŠåŽ-æ£ããå®è£
ãå³åŽ-ãšã©ãŒããïŒ ã


解決çïŒäžéæäœãå®è¡ããå Žåãåã¹ãããã§å¯èœãªå€ã®ç¯å²ã確èªãããã€ãåã«å€æããå Žåãç¯å²ãç¯å²å€ã§ããããšã確èªããå¿
èŠããããŸããããšãã°ã次ã®ããã«ãªããŸãã
unsigned char clamp(float x) { return x < 0.0f ? 0 : (x > 255.0f ? 255 : (unsigned char)x); }
ãšã©ãŒ5ãç¯å²[0ã255]ãžã®ãã£ã¹ãã®çµæãšããŠã®å€ã®æå€±
ã¿ã€ããã€ãã§äœæ¥ãã clamp
æ©èœã䜿çšãããã§ããïŒ äžžãã®å Žåã®ããã«ãäœã倱ãããšã¯ãããŸãããïŒ
å®éã«ã埮åãèšç®ãããšãããŸãã¯ãœãŒãã«ãã£ã«ã¿ãŒãé©çšãããšããçåŸãè² ã®å€ãå€±ãæ¹æ³ãèŠãŸããã
解決çïŒäžéçµæãä¿åããã®ã«ååãªãµã€ãºã®ã¿ã€ãã䜿çšããã¯ã©ã³ãæ©èœã¯ãã¡ã€ã«ãŸãã¯ãã£ã¹ãã¬ã€ã«ä¿åããããã ãã«äœ¿çšããŸãã å°é¢æ°ãèŠèŠåããã«ã¯ããã¯ã»ã«å€ã«128ã远å ããããã¢ãžã¥ãŒã«ã䜿çšããŸãã
ãšã©ãŒ6.äžæ£ãªãã¯ã»ã«ãã€ãã¹é åºãããã°ã©ã ã®é床ãäœäžããŸã
ã³ã³ãã¥ãŒã¿ãŒã®ã¡ã¢ãªã¯1次å
ã§ãã 2次å
ç»åã¯ã1次å
é
åãšããŠã¡ã¢ãªã«ä¿åãããŸãã éåžžããããã¯è¡ããšã«æžã蟌ãŸããŸããæåã¯0çªç®ã®è¡ã次ã«1çªç®ãç¶ããŸãã
é æ¬¡ã¡ã¢ãªã¢ã¯ã»ã¹ã¯ãã©ã³ãã ã¢ã¯ã»ã¹ãããé«éã§ãã ããã¯ãã¡ã¢ãªããã®ããŒã¿ã倧ããªãããã¯ã§ãã£ãã·ã¥ã«å
¥ããããã»ããµãã£ãã·ã¥ãåå ã§ããããšãã°ãææ°ã®ããã»ããµã§ã¯64ãã€ãã§ãã ããã€ãã®æ°Žå¹³æ¹åã«é£æ¥ãããã¯ã»ã«ãäžåºŠã«ãã®ãããã¯ã«å
¥ããŸãã ã€ãŸããåãè¡ã®åŸç¶ã®ãã¯ã»ã«ã«ã¢ã¯ã»ã¹ããå Žåãã¢ã¯ã»ã¹é床ã¯åã®åŸç¶ã®ãã¯ã»ã«ãããéããªããŸãã
解決çïŒã¡ã¢ãªã¢ã¯ã»ã¹ãã·ãŒã±ã³ã·ã£ã«ã«ãªãããã«ãã€ã¡ãŒãžã®ãã€ãã¹ãè¡ãå¿
èŠããããŸããå€åŽã®ã«ãŒããåçŽãã€ãã¹ãããã³å
åŽã®ã«ãŒãã§æ°Žå¹³ã«ïŒ
for (int y = 0; y < image.Height(); y++) for (int x = 0; x < image.Width(); x++) ...
泚ïŒç°ãªãèšèªã§ã¯ãã¡ã¢ãªå
ã®å€æ¬¡å
é
åã®è¡šçŸæ¹æ³ãç°ãªãå ŽåããããŸãã ãããèŠããŠãããŠãã ããã
ééã7.å¹
ãšé«ãã®æ··ä¹±
å€å
žçãªåé¡ïŒãã¹ãã¯ååšããªãããæ£æ¹åœ¢ã®ç»åã§ã®ã¿å®è¡ãããŸã;ãã£ãŒã«ãã§ã¯ãé·æ¹åœ¢ã®ç»åãæäœããå Žåãé
åã¯å¢çãè¶ããŸãã
解決çïŒãã¹ããå¿ããªãã§ãã ããïŒ ç§ã¯TDDã«ã€ããŠã®è°è«ãè²ãŠãªãããšãææ¡ããŸãïŒTDDã®äœ¿çšã¯çã®å人çãªããžãã¹ã§ãã
ééã8.æœè±¡åã®æåŠ
ãšã³ãã£ãã£ãäœæããããšãžã®ææã¯åå¿è
ã®å
žåçãªééãã§ãããã³ãŒãã®å¯èªæ§ãšèªèã«é¢ããåé¡ã«ã€ãªãããŸãã ããã«å€ãã®äŸãæããããšãã§ããŸãã
1. getPixel(x, y)
ããã³setPixel(x, y)
ã¡ãœããã䜿çšãã代ããã«ãé
åå
ã®ã€ã³ããã¯ã¹ãçŽæ¥èšç®ããŠãã¯ã»ã«ã«getPixel(x, y)
ãŸãã å©äŸ¿æ§ã«å ããŠããããã®æ¹æ³ã§ã¯ãç»åã®å¢çãè¶
ããŠåºåããã§ãã¯ããæ£ããåŠçããããšãã§ããŸãã ããšãã°ããšã©ãŒãäžããªãã§ãç»åå€ã倿¿ããŸãã
ãã®çŸããã³ãŒããèŠãŠãã ããïŒã³ãŒãã«ã¯ããšã©ãŒããããŸããããšã©ãŒã¯ãããŸããïŒ b1 = (float)0.25 * ( w1 - 1) * (w1 - 2) * (w1 + 1) * (h1 - 1) * (h1 - 2) * (h1 + 1); b2 = -(float)0.25 * w1 * (w1 + 1) * (w1 - 2) * (h1 - 1) * (h1 - 2) * (h1 + 1); b3 = -(float)0.25 * (w1 - 1) * (w1 - 2) * (w1 + 1) * (h1 + 1) * (h1 - 2); b4 = (float)0.25 * w1 * h1 * (w1 + 1) * (w1 - 2) * (h1 + 1) * (h1 - 2); b5 = -(1 / 12) * w1 * (w1 - 1) * (w1 - 2) * (h1 - 1) * (h1 - 2) * (h1 + 1); b6 = -(1 / 12) * h1 * (w1- 1) * (w1 - 2) * (w1 + 1) * (h1 - 1) * (h1 - 2); b7 = (1 / 12) * w1 * h1 * (w1 + 1) * (w1 - 2) * (h1 + 1) * (h1 - 2); b8 = (1 / 12) * w1 * h1 * (w1- 1) * (w1 - 2) * (h1 - 1) *( h1 - 2); b9 = (1 / 12) * w1 * (w1 - 1) * (w1 + 1) * (h1 - 1) * (h1 - 2) * (h1 + 1); b10 = (1 / 12) * w1 * (w1 - 1) * (w1 - 2) * (w1 + 1) * (h1 - 1) * (h1+ 1); b11 = (1 / 36) * w1 * h1 * (w1 - 1) * (w1 - 2) * (w1 - 1) * (h1 - 2) * (h1- 2); b12 = -(1 / 12) * w1 * h1 * (w1 - 1) * (w1 + 1) * (h1 + 1) * (h1 - 2); b13 = -(1 / 12) * w1 * h1 * (w1 + 1) * (w1 - 2) * (h1 - 1) * (h1 + 1); b14 = -(1 / 36) * w1 * (w1 - 1) * (w1 + 1) * (h1 - 1) * (h1 - 2); b15 = -(1 / 36) * w1 * h1 * (w1 - 1) * (w1 - 2) * (h1 - 1) * (h1 + 1); b16 = (1 / 36) * w1 * h1 * (w1 - 1) * (w1 + 1) * (h1 - 1) * (h1 + 1); image2.rawdata[y1 * image2.Width + x1].b = image1.rawdata[h * image1.Width + w].b * b1 + image1.rawdata[h * image1.Width + w + 1].b * b2 + image1.rawdata[(h + 1) * image1.Width + w].b * b3 + image1.rawdata[(h + 1) * image1.Width + w + 1].b * b4 + image1.rawdata[h * image1.Width + w - 1].b * b5 + image1.rawdata[(h - 1) * image1.Width + w].b * b6 + image1.rawdata[(h + 1) * image1.Width + w - 1].b * b7 + image1.rawdata[(h - 1) * image1.Width + w + 1].b * b8 + image1.rawdata[h * image.Width + w + 2].b * b9 + image1.rawdata[(h + 2) * image1.Width + w].b * b10 + image1.rawdata[(h - 1) * image1.Width + w - 1].b * b11 + image1.rawdata[(h + 1) * image1.Width + w + 2].b * b12 + image1.rawdata[(h + 2) * image1.Width + w + 1].b * b13 + image1.rawdata[(h - 1) * image1.Width + w + 2].b * b14 + image1.rawdata[(h + 2) * image1.Width + w - 1].b * b15 + image1.rawdata[(h + 2) * image1.Width + w + 2].b * b16; image2.rawdata[y1 * image2.Width + x1].g = image1.rawdata[h * image1.Width + w].g * b1 + image1.rawdata[h * image1.Width + w + 1].g * b2 + image1.rawdata[(h + 1) * image1.Width + w].g * b3 + image1.rawdata[(h + 1) * image1.Width + w + 1].g * b4 + image1.rawdata[h * image1.Width + w - 1].g * b5 + image1.rawdata[(h - 1) * image1.Width + w].g * b6 + image1.rawdata[(h + 1) * image1.Width + w - 1].g * b7 + image1.rawdata[(h - 1) * image1.Width + w + 1].g * b8 + image1.rawdata[h * image1.Width + w + 2].g * b9 + image1.rawdata[(h + 2) * image1.Width + w].g * b10 + image1.rawdata[(h - 1) * image1.Width + w - 1].g * b11 + image1.rawdata[(h + 1) * image1.Width + w + 2].g * b12 + image1.rawdata[(h + 2) * image1.Width + w + 1].g * b13 + image1.rawdata[(h - 1) * image1.Width + w + 2].g * b14 + image1.rawdata[(h + 2) * image1.Width + w - 1].g * b15 + image1.rawdata[(h + 2) * image1.Width + w + 2].g * b16; image2.rawdata[y1 * image2.Width + x1].r = image1.rawdata[h * image1.Width + w].r * b1 + image1.rawdata[h * image1.Width + w + 1].r * b2 + image1.rawdata[(h + 1) * image1.Width + w].r * b3 + image1.rawdata[(h + 1) * image1.Width + w + 1].r * b4 + image1.rawdata[h * image1.Width + w - 1].r * b5 + image1.rawdata[(h - 1) * image1.Width + w].r * b6 + image1.rawdata[(h + 1) * image1.Width + w - 1].r * b7 + image1.rawdata[(h - 1) * image1.Width + w + 1].r * b8 + image1.rawdata[h * image1.Width + w + 2].r * b9 + image1.rawdata[(h + 2) * image1.Width + w].r * b10 + image1.rawdata[(h - 1) * image1.Width + w - 1].r * b11 + image1.rawdata[(h + 1) * image1.Width + w + 2].r * b12 + image1.rawdata[(h + 2) * image1.Width + w + 1].r * b13 + image1.rawdata[(h - 1) * image1.Width + w + 2].r * b14 + image1.rawdata[(h + 2) * image1.Width + w - 1].r * b15 + image1.rawdata[(h + 2) * image1.Width + w + 2].r * b16;
ããã¯ãçåŸã«ãããã€ãã¥ãŒããã¯è£éã®å®è£
ã§ãã
ãã€ãã¥ãŒããã¯è£éã¯åé¢å¯èœã§ããã16ã®ä»£ããã«4ã€ã®èŠå ã§ããŸããããšæšæž¬ããåŠçã¯ãããããã§ãã
2.ã«ã©ãŒç»åãæäœããéã®ã³ãŒãã®éè€ã«ããããšã©ãŒãçºçããŸãïŒäžèšã®äŸãåç
§ïŒã ã³ãŒããã³ããŒããŠè²Œãä»ãã r
ãg
ãšb
眮ãæãã代ããã«ãæŒç®åã®ãªãŒããŒããŒãã䜿çšããã ãã§ååã§ãã ã³ãŒãã3åå°ãªãã3åæç¢ºã§ãã
3.ç»åçšã«åå¥ã®ã¯ã©ã¹ãäœæãã代ããã«ã2次å
é
åã䜿çšããŸãã
åé¡ã¯ãã€ã³ããã¯ã¹ä»ããäžèªç¶- (y, x)
(x, y)
(y, x)
ã§ã¯ãªã(y, x)
ã§ãããé
åã®æ¬¡å
ãæç¢ºã§ã¯ãªãããšã§ãïŒ GetLength(0)
ãšGetLength(1)
ããå¹
ãããããšãããã³é«ããããããšã¯æããã§ã¯ãããŸããã ã€ã³ããã¯ã¹ãåçŽã«æ··ä¹±ããããªã¹ã¯ãé«ããªããŸãã
4.ç»åçšã«åå¥ã®ã¯ã©ã¹ãäœæãã代ããã«ãã«ã©ãŒç»åãä¿åããããã®3次å
é
åã®äœ¿çšã åã®æ®µèœã«å ããŠãã©ã®ã€ã³ããã¯ã¹ãã©ã®è²æåã«å¯Ÿå¿ããããèŠããŠããå¿
èŠããããŸãã ãŸãã3次å
é
åã(vx, vy)
ã®åœ¢åŒãš(v, angle)
ã®åœ¢åŒã®äž¡æ¹ã§ãã¯ãã«ãæ ŒçŽããããã«ã©ã®ããã«äœ¿çšãããããèŠãŸããã æ··ä¹±ããã®ã¯ç°¡åã§ãã
5.ã¯ã©ã¹ã®ä»£ããã«é
åã䜿çšããŸãã æ¬¡ã®é¢æ°ãè¿ããã®ãæšæž¬ããŸããïŒ
public static double[] HoughTransform2(GrayscaleFloatImage image, ref float[][] direction, ColorFloatImage cimage)
åçïŒ11åã®èŠçŽ ã®é
åãåèŠçŽ ã«ã¯ç¬èªã®ç¥èãªæå³ããããã³ãŒããé·æéåæããªããã°çè§£ã§ããªãã ãããããªãã§ãã ããïŒ ã¯ã©ã¹ãååŸããåãã£ãŒã«ãã«äººéã®ååãä»ããŸãã
6.ã»ãã³ãã£ã¯ã¹ã®å€æŽã䌎ã倿°ã®åå©çšã ã³ãŒãã«gradx
ãšgrady
ãããã x
ãšy
çç£çã ãšæããŸããïŒ ãããŠããã«ãããŸããããã¯ã¢ãžã¥ãŒã«ãšè§åºŠã§ãïŒ
gradx[x, y] = (float)Math.Sqrt(temp1 * temp1 + temp2 * temp2); grady[x, y] = (float)(Math.Abs(Math.Atan2(temp2, temp1)) * 180 / Math.PI);
解決çïŒéæ³ã®å®æ°ãšã€ã³ããã¯ã¹ã¯ãããŸããã ç»åãåå¥ã®ã¯ã©ã¹ãšããŠèšèšãããã¯ã»ã«èªäœãå
¥åããå¿
èŠãããããã¯ã»ã«ãžã®ã¢ã¯ã»ã¹ã¯ç¹å¥ãªæ¹æ³ã®ã¿ã§è¡ãå¿
èŠããããŸãã
ééã9.äžéšã®æ°åŠé¢æ°ã®é©çšãæ£ãããªãããŸãã¯å Žéãã§ãã
ããã¯ãããã»ããµã¢ãŒããã¯ãã£ãäžé£ã®åœä»€ãããã³ãããã®å®è¡ã«ãããæéã«é¢ããçè§£ãäžååã§ããããã§ãã èš±ãããŠãçµéšããããŸãããç§ã泚æããããã€ãã®ãã€ã³ãïŒ
1. x * x
代ããã«Math.Pow(x, 2)
ãŸãã¯pow(x, 2)
ã®åœ¢åŒã§äºä¹ããŸãã
ã³ã³ãã€ã©ãŒã¯ãããã®æ§æãæé©åããŸãããã·ã³ã°ã«ãµã€ã¯ã«ä¹ç®ã®ä»£ããã«ãææ°ãšå¯Ÿæ°ã®èšç®ãå«ãããªãè€éãªã³ãŒããçæãã1æ¡ãŸãã¯2æ¡ã®é床äœäžã«ã€ãªãããŸãã
解説pow(x, y)
åŒã³åºãã¯exp(log(x) * y)
ãŸãã ããã«ã¯ãx87ã³ãã³ãã§çŽ300ã®ææ®µãå¿
èŠã§ãã SSEã«ã¯ããŸã ææ°ãšå¯Ÿæ°ã¯ãããŸãããããšãã°ã hereã®ããã«ãããã©ãŒãã³ã¹ã®ç°ãªãexp
ãšlog
å®è£
ã倿°ããlog
ã ããããã环ä¹ã«ã¯30ã50ãµã€ã¯ã«ããããŸãã ãã ããä¹ç®ã«ã¯1ããŒãããããããŸããã
2.æŽæ°éšåã(int)Math.Floor((float)(j) / k)
ãšããŠã k
ã¯å®æ°ã§ã«ãŒãå
ã§å€åããŸããã
ããã§ã¯ã (int)(j / k)
ãããã«è¯ã(int)(j * inv_k)
float inv_k = 1.0f / k
(int)(j / k)
ãšèšè¿°ããã ãã§ååã§ãã
å®éãfloorã¯å®æ°ãè¿ããããããã«å®æ°ãæŽæ°ã«å€æããå¿
èŠããããŸãã ããã¯éåžžã«é«äŸ¡ãªäœåãªæäœã§ããããšãããããŸãã ä¹ç®ã«ããé€ç®ã®çœ®ãæãã¯æé©åã«ããããé€ç®æäœã¯äŸç¶ãšããŠé«äŸ¡ã§ãã
çºèš(int)floor(x)
ãš(int)x
ãè² ã§ãªãxã«å¯ŸããŠã®ã¿åçã§ãã floor
颿°ã¯åžžã«åãæšãŠãããŸããã (int)x
ãŒãã«åãã£ãŠãããŸãã
3.æ»ãå€ã®èšç®ã
double _sum = pow(sum, -1);
_sum = 1.0 / sum?
æžãããšãã§ãã_sum = 1.0 / sum?
ããªããããè¡ãã®_sum = 1.0 / sum?
解決çïŒæ°åŠé¢æ°ã¯å¿
èŠãªå Žåã«ã®ã¿äœ¿çšããŠãã ããã
ééã10.èšèªã®ç¡ç¥
ãããŠåã³ãæ°åŠã®åé¡ïŒ
1.åãšã®æ··åã int
代ããã«ãã¯ã»ã«ã€ã³ããã¯ã¹ã«long long
ã䜿çšãã float
ã double
ãããã³int
éã®å®æ°å€æãè¡ããŸãã ããšãã°ããªã1.0f / 16.0f
æžãããšãã§ããã®ã«(float)(1.0 / 16)
æžãã®ã§ããããïŒ
2. atan
ã䜿çšãã倧éšãã«ããæ¥µè§ã®èšç®ãšãå¿
èŠãªããšãæ£ç¢ºã«è¡ãatan2
ã䜿çšãã代ããã«ãŒãã§é€ç®ããåé¡ã
3.ç°åžžãªææ°ãšéæ³ã®å®æ°ïŒ
g=(float)Math.pow(2.71,-(d*d)/(2*sigma*sigma)); t=((float)1/((float)Math.sqrt(6.28)*sigma));
ããã§ã¯ãåŠçã¯åã«exp
颿°ãšå®æ°pi
ã®ååšãå¿ããŠããŸããã (float)1
代ããã«ãåã«1.0f
ãšæžãããšãã§ããŸãã
解決çïŒããå€ãã®ããã°ã©ã ãäœæãããã®æ¹æ³ã§ã®ã¿çµéšãç©ãã§ãã ããã
ãšã©ãŒ11.ã³ãŒãã®é£èªå
åå¿è
ã®ããã°ã©ããŒã¯ãçè§£ãããããšãããããçãã³ãŒããæžãããšã奜ã¿ãèªåã®ã¹ãã«ã瀺ãã®ã奜ã¿ãŸãã
1.è€éãªãµã€ã¯ã«
for (int x1 = x - 1, x2 = 0; x1 <= x + 1; x1++, x2++) { for (int y1 = y - 1, y2 = 0; y1 <= y + 1; y1++, y2++) {
ããã§ã¯ã-1ãã1ãŸã§ã®ãµã€ã¯ã«ãäœæãããµã€ã¯ã«å
ã§æ¢ã«x1
ãšx2
ãèšç®ããé åºã倿Žããã®ãæ£ããã§ãããã
for (int j = -1; j <= 1; j++) { int y1 = y + j, y2 = j + 1; for (int i = -1; i <= 1; i++) { int x1 = x + i, x2 = i + 1;
ã³ã³ãã€ã©ãŒã¯åçŽãªã«ãŒããç°¡åã«æé©åã§ãããããããã«é«éã«ãªããŸãã
2.ã¯ãŒã«ãªæ©èœ
long long ksize = llround(fma(ceil(3 * sigma), 2, 1)), rad = ksize >> 1;
ãããŠæ®éã®äººã¯ãã æžã
int rad = (int)(3.0f * sigma); int ksize = 2 * rad + 1;
ãããŠãããã¯äžè¬çã«åæªãè¶
ããŠããŸãã
kernel[idx] = exp(ldexp(-pow(_sigma * (rad - idx), 2), -1));
çè§£ããŠããªã人ã®ããã«ïŒ ldexp(x, -1)
ã¯2ã«ããé€ç®ã§ãã
解決çïŒé
ããæ©ããããã®ãããªã³ãŒãã®ããã«ãã³ããŒã§æãæã€ããšãèŠããŠãããŠãã ããã
ãšã©ãŒ12.åŠçãããç»åã®å€ã®ç Žæ
以äžã«ãCannyã¢ã«ãŽãªãºã ã®äžéšã§ããéæå€§å€ãæå¶ããã³ãŒãã瀺ããŸãã
for x in xrange(grad.shape[0]): for y in xrange(grad.shape[1]): if ((angle[x, y] == 0) and ((grad[x, y] <= grad[getinds(grad, x + 1, y)]) or (grad[x, y] <= grad[getinds(grad, x - 1, y)]))) or\ ((angle[x, y] == 0.25) and ((grad[x, y] <= grad[getinds(grad, x + 1, y + 1)]) or (grad[x, y] <= grad[getinds(grad, x - 1, y - 1)]))) or\ ((angle[x, y] == 0.5) and ((grad[x, y] <= grad[getinds(grad, x, y + 1)]) or (grad[x, y] <= grad[getinds(grad, x, y - 1)]))) or\ ((angle[x, y] == 0.75) and ((grad[x, y] <= grad[getinds(grad, x + 1, y - 1)]) or (grad[x, y] <= grad[getinds(grad, x - 1, y + 1)]))): grad[x, y] = 0
ããã§ãããã€ãã®å€ã¯grad[x, y] = 0
æ¶å€±ãããµã€ã¯ã«ã®åŸç¶ã®å埩ã§ã¢ã¯ã»ã¹ãããŸãã äžéçµæãèšç®ããããã«æ°ããã€ã¡ãŒãžãäœæãããçŸåšã®ã€ã¡ãŒãžãäžæžããããªãã£ãå Žåããšã©ãŒã¯çºçããŸããã§ããã
解決çïŒäºåã«ã¡ã¢ãªãç¯çŽããããšãããæ©èœçãªãã©ãã€ã ã«ã€ããŠèããŠãã ããã
ãã®ä»ã®ãšã©ãŒ
æ®ãã®ãšã©ãŒã¯ãæ¬è³ªçã«æ¢ã«éããã°ã©ã çã§ãã ãããã¯ã誀解ã«ããã¢ã«ãŽãªãºã ã®å®è£
ã®ãšã©ãŒã§ãããåå¥ã®ãã®ã§ãã ããšãã°ãã¬ãŠã¹ãã£ã«ã¿ãŒã®ã«ãŒãã«ãµã€ãºã®èª€ã£ãéžæã
ã¬ãŠã¹ãã£ã«ã¿ãŒã¯ãç»ååŠçã®äž»èŠãªãã£ã«ã¿ãŒã®1ã€ã§ãã ãšããžãšãªããžã®æ€åºãããŒãã€ã³ãã®æ€çŽ¢ãã·ã£ãŒããã³ã°ãªã©ãèšå€§ãªæ°ã®ã¢ã«ãŽãªãºã ã®åºç€ã«ãªã£ãŠããŸãã ã¬ãŠã¹ãã£ã«ã¿ãŒã«ã¯ããŒããã®ã¬ãã«ã決å®ããã·ã°ããã©ã¡ãŒã¿ãŒãããããã®ã³ã¢ã¯æ¬¡ã®åŒã§è¡šãããŸãã

ã°ã©ãã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã

ãã®é¢æ°ã¯æ±ºããŠæ¶æ»
ãããç¡éãµã€ãºã®ã«ãŒãã«ãšã®ç³ã¿èŸŒã¿ã¯æå³ããªããŸããã ãããã£ãŠããšã©ãŒãç¡èŠã§ããããã«ã«ãŒãã«ãµã€ãºãéžæãããŸãã å®éã®ã¿ã¹ã¯ã§ã¯ãååŸã(int)(3 * sigma)
ã«ãŒãã«ãåãã ãã§ååã§ãããšã©ãŒã¯1/1000
æªæºã«ãªããŸãã å°ããããã«ãŒãã«ïŒäžã®ã°ã©ãã®èµ€ã颿°ïŒãéžæãããšãã¬ãŠã¹ãã£ã«ã¿ãŒãæªã¿ãŸãã åºå®ãµã€ãºã®ã«ãŒãã«ïŒ5x5ãªã©ïŒã䜿çšãããšã sigma = 1.5
ã§ã誀ã£ãçµæã«ãªããŸãã
çµè«ïŒåå¿è
ãç»åãæäœããããã®äžè¬çãªã¬ã€ãã©ã€ã³
- ã·ã¹ãã ãªããžã§ã¯ãBitmapãHBITMAPãªã©ã䜿çšããªãã§ãã ããã
- ç»åãæäœããããã«ã©ã€ãã©ãªã䜿çšããåã«ãèªè»¢è»ãæžãããšããå§ããŠãããããæŠãã«çªå
¥ããŠãã ããã
- 粟床ãšç¯å²ã®äž¡æ¹ã§ãã¯ã»ã«å€ãæ ŒçŽããã«ã¯ãã€ãåã§ã¯äžååãªå Žåããã¯ã»ã«å€ãæ ŒçŽããã«ã¯floatåã䜿çšããŸãã ãŸããçµéšãç©ãããšã§ãåºå®å°æ°ç¹æŒç®ã䜿çšããŠæå€§ã®å¹çãéæã§ããŸãã
- æµ®åå°æ°ç¹ãããã€ãã«å€æãããšãã¯ãäžžã誀差ãšåå¢çãè¶
ããããšã«æ³šæããŠãã ããã
- è² ã®å€ã«æ³šæããŠãã ããã
- ç»åå
ã®ãã¯ã»ã«ãæ£ããé åºã§èµ°æ»ããŸãã
- ã³ãŒããæ
éã«ãã¹ãããŸãã
- ãšã³ãã£ãã£ãçæããããšãæããªãã§ãã ããã ã³ãŒãã¯æç¢ºã§ãªããã°ãªããŸããã
- æ°åŠæŒç®ãè³¢ã䜿çšããŠãã ããã
- èšèªãåŠã¶ã
- ã¹ãã«ãèŠããããšããªãã§ãã ããã
- ç»ååŠçã®ãã¥ãŒããªã¢ã«ãèªãã§ãã ãã-圌ãã¯å€ãã®æçšãªãã®ãæžããŸãã
ããã°ã©ã ã®äœæã容æã«ããããã«ãç»åã®èªã¿åããšæžã蟌ã¿ãæ¢ã«å®è£
ãããŠãããããžã§ã¯ããäœæããæå°éã®æ©èœã§ç»åãä¿åããããã®ã¯ã©ã¹ãäœæããç»åã«å¯Ÿããæäœã®äŸã瀺ããŸããã
â Visual Studio 2015ãC ++
â Visual Studio 2015ãCïŒ
Linuxã®ããŒãžã§ã³ã¯ãããŸãããLinuxã䜿çšããŠããåŠçã¯ãéåžžããã®ãããªåé¡ãçµéšããŸããã
ãŸããããã€-ã¡ããã©åçã
Cannyã¢ã«ãŽãªãºã ã䜿çšããåç·æœåºã å·Šäžã®å
¥åç»åããããå·Šã®2çªç®ãæ£ããçµæã§ãããæ®ãã¯èª€ã£ãçµæã§ãã
ãã€ãã¥ãŒããã¯è£éã䜿çšããåçã