рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЕрдкрдШрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ ASCII рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдПрдХ рдЫрд╡рд┐ рдХреЛ ASCII рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдирд╛ рдПрдХ рдЕрдзрд┐рдХ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдРрд╕реЗ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИрдВ рдЬреЛ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд▓реЗрдЦ рд╢реЛрдзрдХрд░реНрддрд╛рдУрдВ рдкреЙрд▓ рдбреАред рдУ'рдЧреНрд░реЗрдбреА рдФрд░ рд╕реНрдХреЙрдЯ рдЯреАред рд░рд┐рдХрд╛рд░реНрдб рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг "рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдмрд╛рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдПрдПрд╕рд╕реАрдЖрдИрдЖрдИ рдХрд▓рд╛ рд░реВрдкрд╛рдВрддрд░рдг" рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЬрд┐рд╕ рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ, рдЙрд╕рдореЗрдВ рдЫрд╡рд┐ рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдЕрдиреБрдХреВрд▓рди рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдФрд░ рдПрдХ рдЧреИрд░-рдирдХрд╛рд░рд╛рддреНрдордХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЕрдкрдШрдЯрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИред рдиреАрдЪреЗ рдкреНрд░рд╢реНрди рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╡рд░реНрдгрди рд╣реИ, рд╕рд╛рде рд╣реА рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди:

рдПрд▓реНрдЧреЛрд░рд┐рдердо рд╡рд┐рд╡рд░рдг


рдореВрд▓ рдЫрд╡рд┐ рдХреЛ рдЖрдХрд╛рд░ рдХреЗ рдмреНрд▓реЙрдХ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдо \ рдмрд╛рд░ рдПрди рдЬрд╣рд╛рдБ рдПрдо рдФрд░ рдПрди - рдкрд┐рдХреНрд╕рд▓ рдореЗрдВ рдПрдХ рд╡рд░реНрдг рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИред рдпрджрд┐ рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ \ рдКрдВрдЪрд╛рдИ рдЪрд░рд┐рддреНрд░ рдХреА рдЪреМрдбрд╝рд╛рдИ \ рдКрдВрдЪрд╛рдИ рдХреА рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЪрд┐рддреНрд░ рдХреЛ рдЗрдЪреНрдЫрд┐рдд рдЖрдХрд╛рд░ рдХреЗ рд╕рдлреЗрдж рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдХреНрд░реЙрдк рдпрд╛ рдкреВрд░рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдкреНрд░рддреНрдпреЗрдХ рдХрд╢реНрдореАрд░ рд╡рд┐рднрд╛рдЬрди рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рдмреНрд▓реЙрдХ рдХреЛ рд▓рдВрдмрд╛рдИ рдХреЗ рд╡реЗрдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЖрд░ = рдПрдо * рдПрди рдЬрд┐рдирдХреЗ рдореВрд▓реНрдп рдЫрд╡рд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд░рдВрдЧ рддреАрд╡реНрд░рддрд╛ (рдорд╛рди 0 рд╕реЗ 255 рддрдХ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╕рдлреЗрдж рдкрд┐рдХреНрд╕реЗрд▓ рдорд╛рди 0 рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд╛рд▓рд╛ рдкрд┐рдХреНрд╕реЗрд▓ 255 рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ)ред рдкрд░рд┐рдгрд╛рдореА рд╡реИрдХреНрдЯрд░ рдХреЛ рдЖрджрд░реНрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП l_2 :

v_i = \ frac {v_i} {\ sqrt {\ sum ^ R_ {k = 1} {v ^ 2_k}}}


рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╡реИрдХреНрдЯрд░ рдХреЛ рдХреЙрд▓рдо рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирддрд╛ рд╣реИ рд╡реА рдЖрдХрд╛рд░ рдЖрд░ \ _ рдмрд╛рд░ рдХреЗ ред

рдкрд░рд┐рдгрд╛рдореА рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╡реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдЙрддреНрдкрд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдбрдмреНрд▓реНрдпреВ рдФрд░ рдПрдЪ рд╕рднреА рддрддреНрд╡ рдЬреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд╣реИрдВ:

V_ {R \ рдЯрд╛рдЗрдореНрд╕ K} = W_ {R \ рдЯрд╛рдЗрдореНрд╕ L} H_ {L \ рдЯрд╛рдЗрдореНрд╕ K}

рдореИрдЯреНрд░рд┐рдХреНрд╕ рдбрдмреНрд▓реНрдпреВ рдЕрдЧреНрд░рд┐рдо рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рдорд╛рди рдирд┐рд░реНрдорд┐рдд рд╣реЛрддрд╛ рд╣реИ рд╡реА , рд▓реЗрдХрд┐рди рдореВрд▓ рдЫрд╡рд┐ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдХреЗ рдмрдЬрд╛рдп, ASCII рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреА рдкреАрдврд╝реА рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкреНрд░рддреАрдХреЛрдВ рдХреА рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд▓рд╛рдЧреВ рдХрд┐рдЯ рд╢рд╛рдорд┐рд▓ рд╣реИ рдПрд▓ рд╡рд░реНрдг рддрдм рдореИрдЯреНрд░рд┐рдХреНрд╕ рдбрдмреНрд▓реНрдпреВ рдПрдХ рдЖрдХрд╛рд░ рд╣реЛрдЧрд╛ рдЖрд░ \ _ рдмрд╛рд░ рдПрд▓ ред
рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ рдПрдЪ рддрд╛рдХрд┐ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдЙрджреНрджреЗрд╢реНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореВрд▓реНрдп рдХреЛ рдХрдо рд╕реЗ рдХрдо рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рд╡реА рдФрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ WH ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

D (V, W, H, \ рдмреАрдЯрд╛) = \ sum_ {ik} \ bigg ({v_ {ik} \ frac {v_ {ik} ^ {\ Beta-1} - [WH] ^ {\ beta-1}} _ {ik}} {\ beta (\ Beta-1)}} + [WH] ^ {\ Beta-1} _ _ ik} \ frac {[WH] _ {ik} -v_ {ik}} {\ beta } \ bigg)

рдпрд╣ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдХрдИ рдЙрджреНрджреЗрд╢реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ: рдЬрдм \ рдмреАрдЯрд╛ = реи рдпрд╣ рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА (рд╕реНрдХреНрд╡реЗрд░рдб рдпреВрдХреНрд▓рд┐рдбрд┐рдпрди рджреВрд░реА) рдХреЗ рд╡рд░реНрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм \ рдмреАрдЯрд╛ \ рез рдЧреМрд░реИрдпрд╛ рез рдХреБрд▓реНрд▓рдмреИрдХ-рд▓реАрдмреНрд▓рд░ рдбрд╛рдЗрд╡рд░реНрдЬреЗрдВрд╕ рджреВрд░реА рдХреЗ рдкрд╛рд╕ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ \ рдмреАрдЯрд╛ \ 0 рдЧреМрд░реИрдпрд╛ 0 - рдЗрдЯрдХреБрд░рд╛-рд╕реИрдЯреЛ (рдЗрдЯрдХреБрд░рд╛-рд╕реИрдЯреЛ рдбрд╛рдЗрд╡рд░реНрдЬреЗрдВрд╕) рдХреА рджреВрд░реА рддрдХред

рдбрд╛рдпрд░реЗрдХреНрдЯ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЪрдпрди рдПрдЪ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЙрддреНрдкрд╛рджрд┐рдд: рдПрдЪ 0 рд╕реЗ 1 рддрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдЗрд╕рдХреЗ рдорд╛рди рдирд┐рдореНрди рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреБрди: рдЕрджреНрдпрддрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ (рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИ):

h_ {jk} = h_ {jk} \ frac {\ sum ^ R_ {i = 1} {w_ {ij} \ frac {v_ {ik}} {[WH] ^ {2- \ _ \ _ {ik}} }} {\ sum ^ R_ {i = 1} {w_ {ij} [WH] ^ {\ Beta-1} _ {ik}}}

рдкреНрд░рддреНрдпреЗрдХ рдореВрд▓реНрдп h_ {ij} рд╕рдорд╛рдирддрд╛ рдХреА рдбрд┐рдЧреНрд░реА рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ рдореИрдВ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рд╕реЗ рдЪрд░рд┐рддреНрд░ j рдЫрд╡рд┐ рдХрд╛ -рдЗрд╕ рдЦрдВрдбред


рддреЛ, рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрд┐рд╕ рдЪрд░рд┐рддреНрд░ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП j рдЕрдиреБрднрд╛рдЧ, рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдорд╛рди рдЬреНрдЮрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ j рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рд╡реЗрдВ рдХреЙрд▓рдо рдПрдЪ ред рд╡рд╣ рдкрдВрдХреНрддрд┐ рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдорд╛рди рд╕реНрдерд┐рдд рд╣реИ, рд╕реЗрдЯ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд╡рд░реНрдг рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдЧреАред рдЖрдк рдХреБрдЫ рд╕реАрдорд╛ рдореВрд▓реНрдп рднреА рджрд░реНрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред \ epsilon , рдФрд░ рдпрджрд┐ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдЕрдзрд┐рдХрддрдо рдорд╛рди рдЗрд╕ рд╕реАрдорд╛ рд╕реЗ рдХрдо рд╣реИ, рддреЛ рдЫрд╡рд┐ рдЕрдиреБрднрд╛рдЧ рдХреЛ рдПрдХ рд╕реНрдерд╛рди рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдХрдо рд╕рдорд╛рдирддрд╛ рд╡рд╛рд▓реЗ рдкреНрд░рддреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЫрд╡рд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рднрд╛рд╡ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо C # рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдПрдПрд╕рд╕реАрдЖрдИрдЖрдИ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ 11x23 рдкрд┐рдХреНрд╕рд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде 95 рдЕрдХреНрд╖рд░реЛрдВ (0x20 рд╕реЗ 0x7E рддрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ; рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝реЙрдиреНрдЯ рдХреВрд░рд┐рдпрд░ рд╣реИред рдореВрд▓ рдЫрд╡рд┐ рдХреЛ ASCII рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

public static char[,] ConvertImage( Bitmap image, double beta, double threshold, ushort iterationsCount, ushort threadsNumber, Action<int> ProgressUpdated) { int charNumHor = (int)Math.Round((double)image.Width / glyphWidth); int charNumVert = (int)Math.Round((double)image.Height / glyphHeight); int totalCharactersNumber = charNumVert * charNumHor; int glyphSetSize = wNorm.ColumnCount; Matrix<double> v = SplitImage(image, charNumVert, charNumHor); Matrix<double> h = Matrix<double>.Build.Random( glyphSetSize, totalCharactersNumber, new ContinuousUniform()); int progress = 0; ushort step = (ushort)(iterationsCount / 10); for (ushort i = 0; i < iterationsCount; i++) { UpdateH(v, wNorm, h, beta, threadsNumber); if((i + 1) % step == 0) { progress += 10; if(progress < 100) { ProgressUpdated(progress); } } } var result = GetAsciiRepresentation(h, charNumVert, charNumHor, threshold); ProgressUpdated(100); return result; } 

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

1) рд╣рдо рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЫрд╡рд┐ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдореЗрдВ рдХрд┐рддрдиреЗ рд╡рд░реНрдг рдлрд┐рдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ:

 int charNumHor = (int)Math.Round((double)image.Width / glyphWidth); int charNumVert = (int)Math.Round((double)image.Height / glyphHeight); 

рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдореВрд▓ рдЫрд╡рд┐ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░ рдХреЗ рдмреНрд▓реЙрдХреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЙрд▓рдо рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рд░рдВрдЧ рдХреА рддреАрд╡реНрд░рддрд╛ рдХреЗ рдорд╛рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рд╡реА (рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╣рдо рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рд╕рдлреЗрдж рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╢реВрдиреНрдп рдорд╛рди рдЬреЛрдбрд╝рдХрд░ рдореВрд▓ рдЫрд╡рд┐ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ), рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╕рднреА рдХреЙрд▓рдореЛрдВ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдХрд░рддреЗ рд╣реИрдВ:

 private static Matrix<double> SplitImage( Bitmap image, int charNumVert, int charNumHor) { Matrix<double> result = Matrix<double>.Build.Dense( glyphHeight * glyphWidth, charNumHor * charNumVert); for (int y = 0; y < charNumVert; y++) { for (int x = 0; x < charNumHor; x++) { for (int j = 0; j < glyphHeight; j++) { for (int i = 0; i < glyphWidth; i++) { byte color = 0; if ((x * glyphWidth + i < image.Width) && (y * glyphHeight + j < image.Height)) { color = (byte)(255 - image.GetPixel( x * glyphWidth + i, y * glyphHeight + j).R); } result[glyphWidth * j + i, charNumHor * y + x] = color; } } } } result = result.NormalizeColumns(2.0); return result; } 

2) рдореИрдЯреНрд░рд┐рдХреНрд╕ рднрд░реЗрдВ рдПрдЪ 0 рд╕реЗ 1 рддрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдорд╛рди:

 Matrix<double> h = Matrix<double>.Build.Random( glyphSetSize, totalCharactersNumber, new ContinuousUniform()); 

рд╣рдо рдЕрджреНрдпрддрди рдирд┐рдпрдо рдХреЛ рдЙрд╕рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдХрдИ рдмрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:

 for (ushort i = 0; i < iterationsCount; i++) { UpdateH(v, wNorm, h, beta, threadsNumber); if((i + 1) % step == 0) { progress += 10; if(progress < 100) { ProgressUpdated(progress); } } } 

рдореИрдЯреНрд░рд┐рдХреНрд╕ рддрддреНрд╡реЛрдВ рдХреЛ рд╕реАрдзреЗ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╢реВрдиреНрдп рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдЬреБрдбрд╝реА рд╕рдорд╕реНрдпрд╛рдПрдВ рдХреБрдЫ рдмреИрд╕рд╛рдЦрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рд▓ рдХреА рдЬрд╛рддреА рд╣реИрдВ):

 private static void UpdateH( Matrix<double> v, Matrix<double> w, Matrix<double> h, double beta, ushort threadsNumber) { const double epsilon = 1e-6; Matrix<double> vApprox = w.Multiply(h); Parallel.For( 0, h.RowCount, new ParallelOptions() { MaxDegreeOfParallelism = threadsNumber }, j => { for (int k = 0; k < h.ColumnCount; k++) { double numerator = 0.0; double denominator = 0.0; for (int i = 0; i < w.RowCount; i++) { if (Math.Abs(vApprox[i, k]) > epsilon) { numerator += w[i, j] * v[i, k] / Math.Pow(vApprox[i, k], 2.0 - beta); denominator += w[i, j] * Math.Pow(vApprox[i, k], beta - 1.0); } else { numerator += w[i, j] * v[i, k]; if (beta - 1.0 > 0.0) { denominator += w[i, j] * Math.Pow(vApprox[i, k], beta - 1.0); } else { denominator += w[i, j]; } } } if (Math.Abs(denominator) > epsilon) { h[j, k] = h[j, k] * numerator / denominator; } else { h[j, k] = h[j, k] * numerator; } } }); } 

3) рдЕрдВрддрд┐рдо рдЪрд░рдг рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЙрд▓рдо рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдорд╛рди рдЬреНрдЮрд╛рдд рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдЕрдиреБрднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреБрдХреНрдд рдкреНрд░рддреАрдХ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реИ рдПрдЪ :

 private static char[,] GetAsciiRepresentation( Matrix<double> h, int charNumVert, int charNumHor, double threshold) { char[,] result = new char[charNumVert, charNumHor]; for (int j = 0; j < h.ColumnCount; j++) { double max = 0.0; int maxIndex = 0; for (int i = 0; i < h.RowCount; i++) { if (max < h[i, j]) { max = h[i, j]; maxIndex = i; } } result[j / charNumHor, j % charNumHor] = (max >= threshold) ? (char)(firstGlyphCode + maxIndex) : ' '; } return result; } 

рдкрд░рд┐рдгрд╛рдореА рдЫрд╡рд┐ рдХреЛ html рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред

рдЙрддреНрдкрдиреНрди рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг


рдиреАрдЪреЗ рд╡рд┐рднрд┐рдиреНрди рдкреИрд░рд╛рдореАрдЯрд░ рдорд╛рдиреЛрдВ рдкрд░ рдмрдирд╛рдИ рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ \ рдмреАрдЯрд╛ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдореВрд▓ рдЫрд╡рд┐ рдореЗрдВ рдХреНрд░рдорд╢рдГ 407x500 рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рдерд╛, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЫрд╡рд┐ рдХрд╛ рдЖрдХрд╛рд░ 37x22 рд╡рд░реНрдг рдерд╛ред


рдирд┐рд╖реНрдХрд░реНрд╖


рдорд╛рдирд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреБрдХрд╕рд╛рдиреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  1. рд▓рдВрдмреА рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг: рдЫрд╡рд┐ рдХреЗ рдЖрдХрд╛рд░ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЗрд╕рдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрдИ рд╕реЗрдХрдВрдб рд╕реЗ рд▓реЗрдХрд░ рджрд╕рд┐рдпреЛрдВ рдорд┐рдирдЯ рддрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
  2. рд╡рд┐рд╕реНрддреГрдд рдЫрд╡рд┐рдпреЛрдВ рдХреА рдЦрд░рд╛рдм рдЧреБрдгрд╡рддреНрддрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдгред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдорд╛рдирд╡реАрдп рдЪреЗрд╣рд░реЗ рдХреА рдЫрд╡рд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИ:


рдЙрд╕реА рд╕рдордп, рдЫрд╡рд┐ рдХреА рдЪрдордХ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдХреЛ рдмрдврд╝рд╛рдХрд░ рднрд╛рдЧреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рд╕реЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЫрд╡рд┐ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдЙрдкрд░реЛрдХреНрдд рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╕рдВрддреЛрд╖рдЬрдирдХ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi463193/


All Articles