рдкрд╛рда рдореЗрдВ рдХреЙрд░рд┐рдбреЛрд░ рдХреА рдорд╛рдиреНрдпрддрд╛

рдХреЙрд░рд┐рдбреЛрд░ (рдирджреА) - рддреАрди рдпрд╛ рдЕрдзрд┐рдХ рдЖрд╕рдиреНрди рд░реЗрдЦрд╛рдУрдВ рдореЗрдВ рдПрдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдпрд╛ рддрд┐рд░рдЫреА рд░реЗрдЦрд╛ рдореЗрдВ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХрд╛ рд╕рдВрдпреЛрдЧ, рдПрдХ рд▓реЗрдЖрдЙрдЯ рджреЛрд╖ред рджреЛрд╖ рдХрд╛рдлреА рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХрдард┐рдирд╛рдИ рдЗрд╕рдХреЗ рд╕реНрд╡рдд: рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдореЗрдВ рдирд┐рд╣рд┐рдд рд╣реИред

рдЧрд▓рд┐рдпрд╛рд░реЗ рди рдХреЗрд╡рд▓ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рдХрд╛рд░рдг, рдмрд▓реНрдХрд┐ рдЧреНрд▓рд┐рдлрд╝ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдХрд╛рд░рдг рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЛ рдЧреНрд░рдВрдереЛрдВ рдореЗрдВ, рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рд╕рдорд╛рди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред рдкрд╣рд▓реЗ рдореЗрдВ, рджреЛ рдЧрд▓рд┐рдпрд╛рд░реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рдореЗрдВ рдХреЛрдИ рджреЛрд╖ рдирд╣реАрдВ рд╣реИред



рдкрд╛рда рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдмрд┐рдЯрдореИрдк рдЫрд╡рд┐ рдФрд░ рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдпрд╣рд╛рдВ рдПрдХ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рд╣реИред

StackExchange рдореЗрдВ рдХрд╛рд░реНрдп рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддреЗ рд╕рдордп , рджреЛ рд╕рд░рд▓ рдФрд░ рдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд┐рдП рдЧрдП рдереЗред рд╢рд╛рдпрдж рд╡реЗ рднреА рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛрдВрдЧреЗред

1. рдХрд╛рд▓реЗ рдФрд░ рд╕рдлреЗрдж рдореБрдЦреМрдЯрд╛ nix-by-1 рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдЦреЛрд▓реЗрдВ, рдЬрд╣рд╛рдВ nPix рд▓рдЧрднрдЧ рдкрдВрдХреНрддрд┐ рд░рд┐рдХреНрддрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рдЕрд░реНрдерд╛рдд рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдмреАрдЪ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ред

opImg = imopen(bwImg,ones(13,1)); 



2. рд╣рдо рдЫрд╡рд┐ рдХреЛ 1-рдмрд╛рдп-mPix рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ mPix рдЧрд▓рд┐рдпрд╛рд░реЗ рдХреА рдиреНрдпреВрдирддрдо рдЪреМрдбрд╝рд╛рдИ рд╣реИред рддреЛ рд╣рдо рдмрд╣реБрдд рдкрддрд▓реА рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВред

 opImg = imopen(opImg,ones(1,5)); 



3. рд╣рдо рдХреНрд╖реИрддрд┐рдЬ "рдЧрд▓рд┐рдпрд╛рд░реЛрдВ" рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рдпрд╛ рддреЛ рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рдХреЗ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рдХрд╛рд░рдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдмрдбрд╝реЗ рдЖрдХрд╛рд░ рдХреЗ "рдЭреАрд▓реЛрдВ" рдХреЛ рднреА рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ, рдмрд╕ nix-by-nPix рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдорд╛рд╕реНрдХ рд▓рдЧрд╛рдХрд░ред рдЗрд╕ рдЪрд░рдг рдореЗрдВ, рд╣рдо рдмрд╣реБрдд рдЫреЛрдЯреА "рдзрд╛рд░рд╛рдУрдВ" рд╕реЗ рднреА рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ (nix + 2) * (mPix + 2) * 4 рд╕реЗ рдЫреЛрдЯреА рд╣реЛрддреА рд╣реИрдВ, рдпрд╛рдиреА рд▓рдЧрднрдЧ рддреАрди рд░реЗрдЦрд╛рдПрдБред

 %# horizontal river: just look for rows that are all true opImg(all(opImg,2),:) = false; %# open with line spacing (nPix) opImg = imopen(opImg,ones(13,1)); %# remove lakes with nPix+2 opImg = opImg & ~imopen(opImg,ones(15,15)); %# remove small fry opImg = bwareaopen(opImg,7*15*4); ) %# horizontal river: just look for rows that are all true opImg(all(opImg,2),:) = false; %# open with line spacing (nPix) opImg = imopen(opImg,ones(13,1)); %# remove lakes with nPix+2 opImg = opImg & ~imopen(opImg,ones(15,15)); %# remove small fry opImg = bwareaopen(opImg,7*15*4); 



4. рдпрджрд┐ рди рдХреЗрд╡рд▓ рд▓рдВрдмрд╛рдИ, рдмрд▓реНрдХрд┐ рдЧрд▓рд┐рдпрд╛рд░реЗ рдХреА рдореЛрдЯрд╛рдИ рднреА рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рддреЛ рд╣рдо рдЧрд▓рд┐рдпрд╛рд░реЗ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдПрдХ рд╕рдорд╛рдиреНрддрд░ рдХрдВрдХрд╛рд▓ рдЦреАрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рд╕реНрдерд╛рди рдореЗрдВ рдЧрд▓рд┐рдпрд╛рд░реЗ рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рдВрджреБ рдХреЗ рд░рдВрдЧ рдХреЗ рд╕рд╛рдеред

  dt = bwdist(~opImg); sk = bwmorph(opImg,'skel',inf); %# prune the skeleton a bit to remove branches sk = bwmorph(sk,'spur',7); riversWithWidth = dt.*sk; рд╢рд╛рдЦрд╛рдУрдВ рдХреЛ рджреВрд░  dt = bwdist(~opImg); sk = bwmorph(opImg,'skel',inf); %# prune the skeleton a bit to remove branches sk = bwmorph(sk,'spur',7); riversWithWidth = dt.*sk; 



рдореИрдереЗрдореЗрдЯрд┐рдХрд╛ рдореЗрдВ, рдпрд╣ рдХрдЯрд╛рд╡ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЛрдб рдХреА рдХрдИ рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред

 (*Get Your Images*) i = Import /@ {"http://i.stack.imgur.com/4ShOW.png", "http://i.stack.imgur.com/5UQwb.png"}; (*Erode and binarize*) i1 = Binarize /@ (Erosion[#, 2] & /@ i); (*Hough transform*) lines = ImageLines[#, .5, "Segmented" -> True] & /@ i1; (*Ready, show them*) Show[#[[1]],Graphics[{Thick,Orange, Line /@ #[[2]]}]] & /@ Transpose[{i, lines}] 


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


All Articles