{"id":302235,"date":"2020-04-21T15:00:15","date_gmt":"2020-04-21T15:00:15","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=302235"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=302235","title":{"rendered":"F#, \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/498156\/\">\n<h2 id=\"vvedenie\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c, <i>\u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u044f<\/i> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445 \u043b\u0438\u0431\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0410 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <i>\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438<\/i> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432. \u0412 \u044d\u0442\u043e\u043c \u043f\u043b\u0430\u043d\u0435 \u0438\u0445 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 (\u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439) \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 F#. \u0410 \u0442\u0430\u043a\u0436\u0435, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0437\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u0432 \u043c\u043e\u0435\u0439 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u043e\u0439 \u0440\u0430\u0437\u0431\u043e\u0440\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u041e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u043e \u0441\u0442\u0430\u0442\u044c\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0437\u0434\u0435\u0441\u044c<br \/>  <a href=\"https:\/\/habr.com\/ru\/post\/496638\/\">F#, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/a><\/p>\n<p>  <\/p>\n<h2 id=\"osnovnye-operacii-binarnoy-morfologii\">\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438<\/h2>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438, \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (B)<\/li>\n<li>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (S)<br \/> <br \/>\n<blockquote><p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u2014 \u044d\u0442\u043e \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0444\u043e\u0440\u043c\u044b. \u042d\u0442\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u0438 \u0444\u043e\u0440\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f  <\/p><\/blockquote>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u0438\u0436\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u0442\u043d\u043e\u0432 \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430, \u0434\u0438\u0441\u043a\u0430 \u0438 \u043a\u043e\u043b\u044c\u0446\u0430<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/869\/bc6\/3a5\/869bc63a5e3832931cee4b89e33eecdf.svg\" alt=\"$ Box(3, 5) = \\begin{matrix}*&amp;*&amp;*&amp;*&amp;*\\\\*&amp;*&amp;*&amp;*&amp;*\\\\*&amp;*&amp;*&amp;*&amp;*\\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/1b0\/110\/62e\/1b011062ee5e56940a59de7459c99013.svg\" alt=\"$ Disk(5, 5) = \\begin{matrix}0&amp;*&amp;*&amp;*&amp;0\\\\*&amp;*&amp;*&amp;*&amp;*\\\\*&amp;*&amp;*&amp;*&amp;*\\\\*&amp;*&amp;*&amp;*&amp;*\\\\0&amp;*&amp;*&amp;*&amp;0\\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/759\/2b8\/e55\/7592b8e558903743fdf43d59406d986f.svg\" alt=\"$ Ring(5, 5) = \\begin{matrix}0&amp;*&amp;*&amp;*&amp;0\\\\*&amp;0&amp;0&amp;0&amp;*\\\\*&amp;0&amp;0&amp;0&amp;*\\\\*&amp;0&amp;0&amp;0&amp;*\\\\0&amp;*&amp;*&amp;*&amp;0\\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p><em>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b<\/em> \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0431\u043e\u0439 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u0430\u0441\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0430 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438.<\/p>\n<p>  <\/p>\n<p><em>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b<\/em> \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u044e\u0442 \u0442\u043e\u0447\u043a\u0443 <em>\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442<\/em>. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0430 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0430 \u0432 \u0446\u0435\u0442\u0440\u0435 \u043c\u0430\u0441\u043a\u0438, \u043d\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435. <em>\u041d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430<\/em> \u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0434 \u043d\u0438\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438.<\/p>\n<p>  <\/p>\n<blockquote><p>\u041d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f <strong>B<\/strong> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c <strong>S<\/strong> \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f B \u2295 S \u0438 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/p><\/blockquote>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/8e0\/cca\/7aa\/8e0cca7aae34dec7482842e5bcf2e7e7.svg\" alt=\"$B \\oplus S = \\underset{b\\in B}{\\cup} S_b$\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e \u0432\u0441\u0435\u043c \u043e\u043a\u0440\u0435\u0441\u0442\u043d\u044b\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c. <em>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442<\/em> <strong>S<\/strong> \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043a\u043e \u0432\u0441\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 <em>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430<\/em> \u0441\u043e\u0432\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0441 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u043e\u043c, \u043a\u043e \u0432\u0441\u0435\u043c\u0443 <em>\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443<\/em> \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 <em>\u0418\u041b\u0418<\/em> \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>Figure 1: \u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <strong>B<\/strong><\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e43\/9b1\/810\/e439b1810fc373d1db08a1beb484a6b6.svg\" alt=\"$ \\begin{matrix} 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ *&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0 \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>Figure 2: \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 <strong>S<\/strong><\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e09\/1ef\/0a0\/e091ef0a0aca8030237baec55e9c6460.svg\" alt=\"$ \\begin{matrix} *&amp;*&amp;*\\\\ *&amp;*&amp;*\\\\ *&amp;*&amp;* \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>Figure 3: \u041d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u0435 <strong>B \u2295 S<\/strong><\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/d95\/efc\/a86\/d95efca865dafe77f8dbf4a57a1ac987.svg\" alt=\"$ \\begin{matrix} *&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ *&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ *&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ 0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ 0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ 0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ 0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ 0&amp;*&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043a\u043e\u0434 F#, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">let (&gt;.) value checkValue = if value &gt; checkValue then checkValue else value let (&lt;.) value checkValue = if value &lt; checkValue then checkValue else value  let subArrayOfMaks array2d mask (centerX, centerY) (maskCenterX, maskCenterY) =          let (rows, cols) = Matrix.sizes {values = array2d}         let (maskRows, maskCols) = Matrix.sizes {values = mask}          let x1 = centerX - maskCenterX         let y1 = centerY - maskCenterY         let x2 = x1 + maskCols - 1         let y2 = y1 + maskRows - 1          (x1 &lt;. 0, x2 &gt;. (cols - 1), y1 &lt;. 0, y2 &gt;. (rows - 1))  let upbuilding array2d mask (maskCenterX, maskCenterY) =          let sub source mask (x, y) (maskCenterX, maskCenterY) =             let (x1, x2, y1, y2) = subArrayOfMaks source mask (x, y) (maskCenterX, maskCenterY)             source.[y1..y2, x1..x2] &lt;- mask          let copy = (Matrix.cloneO {values = array2d}).values         array2d |&gt; Array2D.iteri (fun y x v -&gt; if v = 1 then sub copy mask (x, y) (maskCenterX, maskCenterY))          copy<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <em>upbuilding<\/em><\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">let upbuilding array2d mask (maskCenterX, maskCenterY) =<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435.<\/p>\n<p>  <\/p>\n<p>\u0420\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b <strong>&gt;.<\/strong> \u0438 <strong>&lt;.<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">let (&gt;.) value checkValue = if value &gt; checkValue then checkValue else value let (&lt;.) value checkValue = if value &lt; checkValue then checkValue else value<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u043d\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u044e\u0442 \u0434\u0432\u0430 \u0447\u0438\u0441\u043b\u0430<br \/>  <em>value<\/em> \u2014 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0447\u0438\u0441\u043b\u043e<br \/>  <em>checkValue<\/em> \u2014 \u043f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e (\u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u0447\u0438\u0441\u043b\u043e)<\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 <em>value<\/em> \u0431\u043e\u043b\u044c\u0448\u0435 (\u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435) <em>checkValue<\/em>, \u0442\u043e \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <em>checkValue<\/em>, \u0438\u043d\u0430\u0447\u0435 \u2014 <em>value<\/em>. \u042d\u0442\u043e <em>\u043d\u0430\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u043e nil<\/em> \u044f\u0437\u044b\u043a\u0430 Swift (<strong>??<\/strong>), \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u043d \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0434\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0435 \u043f\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f (\u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u043c\u0435\u043d\u044c\u0448\u0435).<br \/>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">2 &lt;. 3 \/\/ \u0412\u0435\u0440\u043d\u0435\u0442 3<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418\u043b\u0438 \u0442\u0430\u043a\u043e\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">3 &lt;. 2 \/\/ \u0412\u0435\u0440\u043d\u0435\u0442 3<\/code><\/pre>\n<p>  <\/p>\n<p>\u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0433\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0443\u0431\u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f <em>subArrayOfMaks<\/em><\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">let subArrayOfMaks array2d mask (centerX, centerY) (maskCenterX, maskCenterY) = <\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0443\u0431\u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0438\u0437 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0435. \u041e\u043d\u0430 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/p>\n<p>  <\/p>\n<p><em>array2d<\/em> \u2014 \u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 (\u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435)<br \/>  <em>mask<\/em> \u2014 \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 (\u043c\u0430\u0441\u043a\u0430) \u0432 \u0432\u0438\u0434\u0435 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u043e\u0439 \u043c\u0430\u0442\u0440\u0438\u0446\u044b<br \/>  <em>(centerX, centerY)<\/em> \u2014 \u041a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438<br \/>  <em>(maskCenterX, maskCenterY)<\/em> \u2014 \u041d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435. \u041e\u0431\u044b\u0447\u043d\u043e \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0437\u0430\u0434\u0430\u044e\u0442 \u0446\u0435\u043d\u0442\u0440 \u043c\u0430\u0441\u043a\u0438, \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u0434\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0443\u044e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0443. \u0421\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u044b\u0431\u043e\u0440 \u0446\u0435\u043d\u0442\u0440\u0430 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043c\u0430\u0441\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442.<\/p>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u044f <em>upbuilding<\/em> \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/p>\n<p>  <\/p>\n<p><em>array2d<\/em> \u2014 \u0411\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435<br \/>  <em>mask<\/em> \u2014 \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442<br \/>  <em>(maskCenterX, maskCenterY)<\/em> \u2014 \u041d\u0430\u0447\u0430\u043b\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">let upbuilding array2d mask (maskCenterX, maskCenterY) =          \/\/ \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u0443\u0431\u043c\u0430\u0442\u0440\u0438\u0446\u044b, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u043c\u0430\u0441\u043a\u0438         let sub source mask (x, y) (maskCenterX, maskCenterY) =             \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0433\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0441\u0443\u0431\u043c\u0430\u0442\u0440\u0438\u0446\u044b             let (x1, x2, y1, y2) = subArrayOfMaks source mask (x, y) (maskCenterX, maskCenterY)             \/\/ \u043d\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u0443\u0431\u043c\u0430\u0442\u0440\u0438\u0446\u0443 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u043c\u0430\u0441\u043a\u043e\u0439             source.[y1..y2, x1..x2] &lt;- mask          \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043f\u0438\u044e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u0443\u044e \u043d\u0443\u043b\u044f\u043c\u0438         let copy = (Matrix.cloneO {values = array2d}).values         \/\/ \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043f\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435         array2d |&gt; Array2D.iteri (fun y x v -&gt; if v = 1 then sub copy mask (x, y) (maskCenterX, maskCenterY))          \/\/ \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043a\u043e\u043f\u0438\u044e \u043a\u0430\u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442         copy<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0438\u0441\u0447\u0435\u0440\u043f\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<blockquote><p>\u042d\u0440\u043e\u0437\u0438\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f <strong>B<\/strong> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c <strong>S<\/strong> \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f <strong>B \u2296 S<\/strong> \u0438 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c<\/p><\/blockquote>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/951\/46b\/5e2\/95146b5e2bd7745bc60df43e81d23b71.svg\" alt=\"$B \\ominus S = { b | b + s \\in B \u2200s \\in S }$\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u044d\u0440\u043e\u0437\u0438\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0442\u043e\u0436\u0435 &quot;\u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442&quot; \u043f\u043e \u0432\u0441\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0430\u043c \u0432\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0415\u0441\u043b\u0438 \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u043e\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u043e\u043c \u0432\u044b\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u044d\u0440\u043e\u0437\u0438\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043d \u043d\u0438\u0436\u0435 (\u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043e\u0433\u043e \u0432 Figure 1).<\/p>\n<p>  <\/p>\n<p>Figure 4: \u042d\u0440\u043e\u0437\u0438\u044f <strong>B \u2296 S<\/strong><\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/eb9\/a8d\/0c1\/eb9a8d0c1fbf5b17a47ccc20809c08b1.svg\" alt=\"$ \\begin{matrix} 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f F#. \u0417\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u043d\u0430 F#<br \/>  <a href=\"https:\/\/habr.com\/ru\/post\/494586\/\">\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0430\u0442\u0440\u0438\u0446\u0430\u043c\u0438 \u0438\u0437 \u0442\u0435\u043e\u0440\u0438\u0438 \u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439 \u0430\u043b\u0433\u0435\u0431\u0440\u044b<\/a><\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u0441\u043e\u0434\u0430\u0440\u0436\u0438\u0442 \u043b\u0438 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 array2d \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 mask? let contains array2d mask =         if Matrix.isEquallySized (Matrix.ofArray2D array2d) (Matrix.ofArray2D mask) then             not (array2d                  |&gt; Array2D.mapi (fun x y v -&gt; if mask.[x, y ] = 0 then 1                                                elif mask.[x, y] = v then 1                                                else 0)                  |&gt; Seq.cast&lt;int&gt;                  |&gt; Seq.contains 0)         else false  \/\/ \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0430\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u044d\u0440\u043e\u0437\u0438\u0438 let erosion array2d mask (maskCenterX, maskCenterY) =          let sub source (dest: int [,]) mask (x, y) (maskCenterX, maskCenterY) =             let (x1, x2, y1, y2) = subArrayOfMaks source mask (x, y) (maskCenterX, maskCenterY)             let subArray2d = source.[y1..y2, x1..x2]              if contains subArray2d mask then                 dest.[y, x] &lt;- 1          let copy = (Matrix.cloneO {values = array2d}).values         array2d |&gt; Array2D.iteri (fun y x v -&gt; if v = 1 then sub array2d copy mask (x, y) (maskCenterX, maskCenterY))          copy<\/code><\/pre>\n<p>  <\/p>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u044d\u0440\u043e\u0437\u0438\u0438 \u0432\u043e \u043c\u043d\u043e\u0433\u043e\u043c \u043f\u043e\u0445\u043e\u0436\u0430 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u044f, \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u043b\u0438 \u0432\u0435\u0441\u044c \u043f\u043e\u0434\u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u0435\u0436\u0430\u043b \u0432 \u043e\u043a\u0440\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u0435\u043c\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u043d\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u044f \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u043f\u0438\u043a\u0441\u0435\u043b\u044e.<\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0432\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u0438\u043d\u0442\u0435\u0437\u043e\u043c \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0445.<\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435<\/strong> \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f <strong>B<\/strong> \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c <strong>S<\/strong> \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f <strong>B \u2022 S<\/strong> \u0438 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c<\/p><\/blockquote>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/e16\/571\/2cf\/e165712cf28a80c227c1c260219465f8.svg\" alt=\"$B \u2022 S = (B \\oplus S) \\ominus S$\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f F#<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">let closure array2d mask (centerX, centerY) =          let step1 = upbuilding array2d mask (centerX, centerY)         let step2 = erosion step1 mask (centerX, centerY)          step2<\/code><\/pre>\n<p>  <\/p>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a<br \/>  Figure 5: \u0417\u0430\u043c\u044b\u043a\u0430\u043d\u0438\u0435 <strong>B \u2022 S<\/strong><\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/be7\/8aa\/40a\/be78aa40ab40b571ff8eb6714cb6fce1.svg\" alt=\"$ \\begin{matrix} 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<blockquote><p><strong>\u0420\u0430\u0437\u043c\u044b\u043a\u0430\u043d\u0438\u0435<\/strong> \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f B \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e-<br \/>  \u0449\u0438\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c S \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442\u0441\u044f B \u25e6 S \u0438 \u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c<\/p><\/blockquote>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/908\/444\/8eb\/9084448ebd343274a8f053440249b048.svg\" alt=\"$B \u25e6 S= (B \\ominus S) \\oplus$\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f F#<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">let opening array2d mask (centerX, centerY) =          let step1 = erosion array2d mask (centerX, centerY)         let step2 = upbuilding step1 mask (centerX, centerY)          step2<\/code><\/pre>\n<p>  <\/p>\n<p>Figure 6: \u0420\u0430\u0437\u043c\u044b\u043a\u0430\u043d\u0438\u0435 <strong>B \u25e6 S<\/strong><\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/ea8\/643\/7b0\/ea86437b0f8f0706a21efdac11570ef6.svg\" alt=\"$ \\begin{matrix} 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<h2 id=\"primer-ispolzovaniya-erozii-dlya-poiska-svyazannyh-struktur-v-binarnom-izobrazhenii\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u044d\u0440\u043e\u0437\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043a\u043d\u0438\u0433\u0430\u0445 \u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u0445, \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u043d\u044b\u0445 \u0441\u0445\u043e\u0436\u0435\u0439 \u0442\u0435\u043c\u0435, \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438, \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f <em>\u0423\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u044f<\/em>. \u0418 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u043a \u044d\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0435 \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0431\u0435\u0437 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u0438\u043a\u0438, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u043a \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0435\u043d\u0438\u044e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u044d\u0442\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438\u043c\u0435\u043d\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430.<\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0434\u0435\u043c \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u0436\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0443. \u041d\u043e \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u044f, \u0430 \u043f\u043e\u0439\u0434\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0435\u043c. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0436\u0435 \u0440\u0430\u043d\u0435\u0435 \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u0438\u043a\u0438, \u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 \u043c\u043e\u0438\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445.<\/p>\n<p>  <\/p>\n<p>Figure 7: \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0443\u0441\u043b\u043e\u0432\u043d\u043e\u0433\u043e \u043d\u0430\u0440\u0430\u0449\u0438\u0432\u0430\u043d\u0438\u044f<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/338\/645\/ca3\/338645ca37d5f6cd3075138119314fb2.svg\" alt=\"$ \\begin{matrix} 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;*&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;0&amp;0&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;0&amp;0&amp;0&amp;0&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>Figure 8: \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0448\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/fde\/ea4\/d9d\/fdeea4d9dff9d584e0f5fe3327fbc622.svg\" alt=\"$ \\begin{matrix} *\\\\ *\\\\ *\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>\u0417\u0430\u0434\u0430\u0447\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0442\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0442\u043e \u0435\u0441\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442 \u0435\u0433\u043e \u0432 \u0441\u0435\u0431\u044f). \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a<\/p>\n<p>  <\/p>\n<p>Figure 9: \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/621\/3ee\/6e2\/6213ee6e288d0882f3d3168882127d33.svg\" alt=\"$ \\begin{matrix} 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;0&amp;0&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;*&amp;0&amp;0&amp;0&amp;0&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0438\u0441\u043a\u0430 \u043d\u0430 F# \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0430 \u043d\u0438\u0436\u0435<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u0437\u0430\u0434\u0430\u0435\u043c \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0435 let origin = array2D [[0;0;0;0;0;0;0;0;0;0]                       [0;0;1;0;0;0;0;0;0;0]                       [0;1;1;1;0;0;0;1;0;0]                       [0;0;0;0;0;0;0;0;1;0]                       [0;0;0;0;1;0;0;0;0;0]                       [0;0;0;0;1;1;0;0;1;0]                       [0;0;0;1;1;1;1;0;1;0]                       [0;0;0;1;0;0;0;0;1;0]                       [0;0;0;0;0;0;0;1;1;0]                       [0;0;0;0;0;0;0;0;0;0]]  \/\/ \u0437\u0430\u0434\u0430\u0435\u043c \u043c\u0430\u0442\u0440\u0438\u0446\u0443 let mask = array2D [[1]                     [1]                     [1]]  \/\/ \u0438\u0449\u0435\u043c \u0441\u0432\u044f\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0438 \u043c\u0430\u0440\u043a\u0438\u0440\u0443\u0435\u043c \u0438\u0445 let marked = Algorithms.markingOfConnectedComponents origin \/\/ \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u044d\u0440\u043e\u0437\u0438\u044e let erosion = Algorithms.erosion origin mask (0, 1)  printfn &quot;origin = \\n %A&quot; origin printfn &quot;marked = \\n %A&quot; marked printfn &quot;erosion =\\n %A&quot; erosion  \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u043c\u0435\u0442\u043e\u043a \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u044f \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (\u043c\u0435\u043c\u043e\u0438\u0437\u0430\u0446\u0438\u044f) let set = erosion |&gt; Seq.cast&lt;int&gt; |&gt; Seq.filter ((&lt;&gt;)0) |&gt; Set.ofSeq  \/\/ \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u0443\u0441\u0442\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u0443\u0434\u0435\u043c \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 let copy = (Matrix.cloneO {values = marked}).values  \/\/ \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u044d\u0440\u043e\u0437\u0438\u0439\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u0446\u0435\u043b\u044c\u044e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0446\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 erosion |&gt; Array2D.iteri (fun row col v -&gt; if v = 1 then                             \/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u0435\u0442\u043a\u0443 \u0432 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u043c \u0443\u0447\u0430\u0441\u0442\u043a\u0435                             let label = marked.[row, col]                             if not (set.Contains label) then                                 \/\/ \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u043f\u0440\u043e\u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0438 \u0435\u0441\u043b\u0438 \u043c\u0435\u0442\u043a\u0438 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442, \u0442\u043e \u043f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430\u043c \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u043e\u043f\u0438\u044e \u0435\u0434\u0438\u043d\u0438\u0447\u043a\u0430\u043c\u0438                                 marked |&gt; Array2D.iteri (fun row1 col1 v1 -&gt; if v1 = label then copy.[row1, col1] &lt;- 1)                          )  printfn &quot;copy =\\n %A&quot; copy<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0438\u0436\u0435<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">origin =   [[0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 1; 0; 0; 0; 0; 0; 0; 0]  [0; 1; 1; 1; 0; 0; 0; 1; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 1; 0]  [0; 0; 0; 0; 1; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 1; 1; 0; 0; 1; 0]  [0; 0; 0; 1; 1; 1; 1; 0; 1; 0]  [0; 0; 0; 1; 0; 0; 0; 0; 1; 0]  [0; 0; 0; 0; 0; 0; 0; 1; 1; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]] marked =   [[0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 1; 0; 0; 0; 0; 0; 0; 0]  [0; 1; 1; 1; 0; 0; 0; 3; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 4; 0]  [0; 0; 0; 0; 5; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 5; 5; 0; 0; 6; 0]  [0; 0; 0; 5; 5; 5; 5; 0; 6; 0]  [0; 0; 0; 5; 0; 0; 0; 0; 6; 0]  [0; 0; 0; 0; 0; 0; 0; 6; 6; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]] erosion =  [[0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 1; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 1; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 1; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]] copy =  [[0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 1; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 1; 1; 0; 0; 1; 0]  [0; 0; 0; 1; 1; 1; 1; 0; 1; 0]  [0; 0; 0; 1; 0; 0; 0; 0; 1; 0]  [0; 0; 0; 0; 0; 0; 0; 1; 1; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]]<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"obedinenie-peresechenie-dopolnenie-raznost\">\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435, \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c<\/h2>\n<p>  <\/p>\n<p>\u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430 F#<\/p>\n<p>  <\/p>\n<p>Figure 10: \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/5f9\/561\/d46\/5f9561d464ca18921d194787e9c54e53.svg\" alt=\"$ A= \\begin{matrix} 0&amp;*&amp;0\\\\ 0&amp;*&amp;*\\\\ 0&amp;*&amp;0\\\\ \\end{matrix} , B= \\begin{matrix} 0&amp;0&amp;0\\\\ *&amp;*&amp;*\\\\ 0&amp;0&amp;0\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<blockquote><p>\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043c\u0430\u0442\u0440\u0438\u0446 <strong>A<\/strong> \u0438 <strong>B<\/strong><\/p><\/blockquote>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/547\/7aa\/6ec\/5477aa6ec5b24d3c394654531dfb5862.svg\" alt=\"$A \\cup B$\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>Figure 11: \u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/885\/ed6\/fa3\/885ed6fa39ac76706c3964f1d00e6873.svg\" alt=\"$ \\begin{matrix} 0&amp;*&amp;0\\\\ *&amp;*&amp;*\\\\ 0&amp;*&amp;0\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<blockquote><p>\u041f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u0434\u0432\u0443\u0445 \u043c\u0430\u0442\u0440\u0438\u0446 <strong>A<\/strong> \u0438 <strong>B<\/strong><\/p><\/blockquote>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/0d6\/405\/eb9\/0d6405eb9ffd9540f46c8d8af1ae934b.svg\" alt=\"$A \\cap B$\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>Figure 12: \u041f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/809\/5a7\/93c\/8095a793c818378dd2ea9b0bee5bb52e.svg\" alt=\"$ \\begin{matrix} 0&amp;0&amp;0\\\\ 0&amp;*&amp;*\\\\ 0&amp;0&amp;0\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<blockquote><p>\u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0440\u0438\u0446\u044b <strong>A<\/strong><\/p><\/blockquote>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/a80\/995\/9bb\/a809959bb196c3eea0c367dc7383fdee.svg\" alt=\"$A^c$\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>Figure 13: \u0414\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/aa4\/121\/6e8\/aa41216e82c30d44cdd786bb3f025571.svg\" alt=\"$ \\begin{matrix} *&amp;0&amp;*\\\\ *&amp;0&amp;0\\\\ *&amp;0&amp;*\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<blockquote><p>\u0420\u0430\u0437\u043d\u043e\u0441\u0442\u044c \u0434\u0432\u0443\u0445 \u043c\u0430\u0442\u0440\u0438\u0446 <strong>A<\/strong> \u0438 <strong>B<\/strong><\/p><\/blockquote>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/dda\/10a\/f75\/dda10af75b92f85ad8dc86ea4b35afde.svg\" alt=\"$A\/B$\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>Figure 13: \u0420\u0430\u0437\u043d\u043e\u0441\u0442\u044c<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/b03\/c86\/6b9\/b03c866b9288854dc4058fe0ca021a03.svg\" alt=\"$ \\begin{matrix} 0&amp;*&amp;0\\\\ 0&amp;0&amp;0\\\\ 0&amp;*&amp;0\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 F#<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 let union array2d1 array2d2 =          if Matrix.isEquallyArraySized array2d1 array2d2 then             array2d1 |&gt; Array2D.mapi (fun x y v -&gt; v ||| array2d2.[x, y])         else failwith &quot;array2d1 is not equal to array2d2&quot;  \/\/ \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 let intersection array2d1 array2d2 =          if Matrix.isEquallyArraySized array2d1 array2d2 then             array2d1 |&gt; Array2D.mapi (fun x y v -&gt; v &amp;&amp;&amp; array2d2.[x, y])         else failwith &quot;array2d1 is not equal to array2d2&quot;  \/\/ \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 (\u043f\u043e \u0441\u0432\u043e\u0435\u0439 \u0441\u0443\u0442\u0438 \u0435\u0441\u0442\u044c \u0438\u043d\u0432\u0435\u0440\u0441\u0438\u044f) let inverse array2d =         array2d |&gt; Array2D.mapi (fun _ _ v -&gt; v ^^^ 1)  let complement array2d =          inverse array2d  \/\/ \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u044c let difference array2d1 array2d2 =          if Matrix.isEquallyArraySized array2d1 array2d2 then             array2d1 |&gt; Array2D.mapi (fun x y v -&gt; if v &lt;&gt; array2d2.[x, y] then v else 0)         else failwith &quot;array2d1 is not equal to array2d2&quot;<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"vydelenie-perimetra-svyazannogo-komponenta\">\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0430 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430<\/h2>\n<p>  <\/p>\n<p>\u041a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u044d\u0440\u043e\u0437\u0438\u0438 \u0438 \u0440\u0430\u0437\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0438\u0437 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438 \u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u043f\u043e \u0435\u0433\u043e \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0443. \u0417\u0434\u0435\u0441\u044c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0431\u044b\u043b\u043e \u043f\u0443\u0441\u0442\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0430\u043d\u0441\u0442\u0432\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0445\u043e\u0442\u044f \u0431\u044b \u0432 \u043e\u0434\u043d\u0443 \u0442\u043e\u0447\u043a\u0443. \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<p>  <\/p>\n<p>Figure 14: \u0418\u0441\u0445\u043e\u0434\u043d\u043e\u0435 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0430<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/428\/6d6\/510\/4286d6510953c548e0fa1b9bc359d4ae.svg\" alt=\"$ \\begin{matrix} 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0&amp;0\\\\ 0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;0&amp;0\\\\ 0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;1\\\\ 0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ 0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0 \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>Figure 15: \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u044e\u0449\u0438\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/885\/ed6\/fa3\/885ed6fa39ac76706c3964f1d00e6873.svg\" alt=\"$ \\begin{matrix} 0&amp;*&amp;0\\\\ *&amp;*&amp;*\\\\ 0&amp;*&amp;0\\\\ \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0430 F#<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">let borderAllocation array2d mask (maskCenterX, maskCenterY) =          let e = erosion array2d mask (maskCenterX, maskCenterY)         let border = difference array2d e         border<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/7f6\/6e9\/c2b\/7f66e9c2b8844dce10c89938c654eb85.svg\" alt=\"$ \\begin{matrix} 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0&amp;0\\\\ 0&amp;*&amp;0&amp;0&amp;0&amp;*&amp;0&amp;0\\\\ 0&amp;*&amp;0&amp;0&amp;0&amp;0&amp;*&amp;1\\\\ 0&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0&amp;*\\\\ 0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0 \\end{matrix} $\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<h2 id=\"nahozhdenie-samogo-kruglogo-obekta-v-binarnom-izobrazhenii\">\u041d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u0440\u0443\u0433\u043b\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438<\/h2>\n<p>  <\/p>\n<p>\u0412 \u0437\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0441\u0430\u043c\u043e\u0433\u043e \u043a\u0440\u0443\u0433\u043b\u043e\u0433\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438. \u0415\u0441\u043b\u0438 \u0442\u043e\u0447\u043d\u0435\u0435, \u0442\u043e \u043c\u044b \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u0435\u043a\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0442\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0445 \u0441\u0432\u044f\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432. \u0427\u0435\u043c \u0432\u044b\u0448\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442, \u0442\u0435\u043c \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u0433\u043b\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0439\u0442\u0438 \u043a\u0440\u0443\u0433\u043b\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b. \u0412\u043e\u0432\u0441\u0435 \u043d\u0435\u0442, \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043b\u044e\u0431\u043e\u0439 \u0444\u043e\u0440\u043c\u044b. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0437\u043d\u0430\u043d\u0438\u044f, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435 \u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043c\u043e\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u043e\u0435\u0445\u0430\u043b\u0438.<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0441\u0430\u043c\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0435 \u0442\u0440\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430: \u043e\u0432\u0430\u043b, \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a \u0438 \u043a\u0432\u0430\u0434\u0440\u0430\u0442<\/p>\n<p>  <\/p>\n<p><math>$$display$$\\begin{matrix} 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ 0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;0&amp;0\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;*&amp;*&amp;*&amp;*&amp;*&amp;0\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0\\\\ *&amp;*&amp;*&amp;*&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0&amp;0 \\end{matrix}$$display$$<\/math><\/p>\n<p>  <\/p>\n<p>F#<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u0438\u0441\u0445\u043e\u0434\u043d\u0430\u044f \u043c\u0430\u0442\u0440\u0438\u0446\u0430 \u0441 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438     let multyBinImage = array2D [[0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0]                                  [0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0]                                  [0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0]                                  [0;0;0;0;0;0;0;0;0;0;1;1;1;1;0;0]                                  [1;1;1;1;0;0;0;0;0;1;1;1;1;1;1;0]                                  [1;1;1;1;0;0;0;0;1;1;1;1;1;1;1;1]                                  [1;1;1;1;0;0;0;0;1;1;1;1;1;1;1;1]                                  [1;1;1;1;0;0;0;0;1;1;1;1;1;1;1;1]                                  [1;1;1;1;0;0;0;0;0;1;1;1;1;1;1;0]                                  [1;1;1;1;0;0;0;0;0;0;1;1;1;1;0;0]                                  [1;1;1;1;0;0;0;0;0;0;0;0;0;0;0;0]                                  [1;1;1;1;0;0;0;0;0;0;0;0;0;0;0;0]                                  [1;1;1;1;0;0;1;1;1;0;0;0;0;0;0;0]                                  [1;1;1;1;0;0;1;1;1;0;0;0;0;0;0;0]                                  [1;1;1;1;0;0;1;1;1;0;0;0;0;0;0;0]                                  [1;1;1;1;0;0;0;0;0;0;0;0;0;0;0;0]]<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043f\u0440\u043e\u043c\u0430\u0440\u043a\u0438\u0440\u0443\u0435\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u043c\u0430\u0440\u043a\u0438\u0440\u0443\u0435\u043c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 let markedMultyImages = Algorithms.markingOfConnectedComponents mulyBinImage printfn &quot;marked = \\n %A&quot; markedMultyImages<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">marked =   [[0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 1; 1; 1; 1; 0; 0]  [2; 2; 2; 2; 0; 0; 0; 0; 0; 1; 1; 1; 1; 1; 1; 0]  [2; 2; 2; 2; 0; 0; 0; 0; 1; 1; 1; 1; 1; 1; 1; 1]  [2; 2; 2; 2; 0; 0; 0; 0; 1; 1; 1; 1; 1; 1; 1; 1]  [2; 2; 2; 2; 0; 0; 0; 0; 1; 1; 1; 1; 1; 1; 1; 1]  [2; 2; 2; 2; 0; 0; 0; 0; 0; 1; 1; 1; 1; 1; 1; 0]  [2; 2; 2; 2; 0; 0; 0; 0; 0; 0; 1; 1; 1; 1; 0; 0]  [2; 2; 2; 2; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [2; 2; 2; 2; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0]  [2; 2; 2; 2; 0; 0; 5; 5; 5; 0; 0; 0; 0; 0; 0; 0]  [2; 2; 2; 2; 0; 0; 5; 5; 5; 0; 0; 0; 0; 0; 0; 0]  [2; 2; 2; 2; 0; 0; 5; 5; 5; 0; 0; 0; 0; 0; 0; 0]  [2; 2; 2; 2; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0; 0]]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043d\u0430\u0448\u0435\u043b \u0442\u0440\u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0433\u0440\u0443\u043f\u043f\u044b \u0438 \u043f\u0440\u043e\u043c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043b \u0438\u0445 \u0442\u0440\u0435\u043c\u044f \u043c\u0435\u0442\u043a\u0430\u043c\u0438 <strong>(1, 2, 5)<\/strong><\/p>\n<p>  <\/p>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u0430, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043c\u0435\u0442\u043a\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044d\u0442\u043e\u0439 \u043c\u0435\u0442\u043a\u043e\u0439 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u043c \u043f\u043e \u043c\u0435\u0442\u043a\u0430\u043c  \/\/ groups key - \u043c\u0435\u0442\u043a\u0430, value - \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0432\u0441\u0435\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u044d\u0442\u043e\u0439 \u043c\u0435\u0442\u043a\u043e\u0439 let groups = Dictionary&lt;int, (int*int) list&gt;() markedMultyImages |&gt; Array2D.iteri (fun row col v -&gt; if v &lt;&gt; 0 then                                        if not (groups.ContainsKey(v)) then                                             groups.Add(v, [row, col])                                        else                                             groups.[v] &lt;- (row, col)::groups.[v])  printfn &quot;groups = \\n %A&quot; groups<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">groups =   seq   [[1, [(9, 13); (9, 12); (9, 11); ... ]];    [2, [(15, 3); (15, 2); (15, 1); ... ]];    [5, [(14, 8); (14, 7); (14, 6); ... ]]]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043e\u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/p>\n<p>  <\/p>\n<ol>\n<li>\u041f\u043b\u043e\u0449\u0430\u0434\u044c \u0444\u0438\u0433\u0443\u0440\u044b (\u044d\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u0432\u0441\u0435\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439)<\/li>\n<li>\u0414\u043b\u0438\u043d\u0443 \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0430 (\u0441\u0443\u043c\u043c\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043f\u043e \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0443 \u0444\u0438\u0433\u0443\u0440\u044b)<\/li>\n<li>\u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 (\u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0437\u0436\u0435)<\/li>\n<\/ol>\n<p>  <\/p>\n<pre><code class=\"haskell\">let mapAreas = groups                |&gt; Seq.map (|KeyValue|)                |&gt; Map.ofSeq  \/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043f\u043b\u043e\u0449\u0430\u0434\u0438 \u0444\u0438\u0433\u0443\u0440 let areas = mapAreas             |&gt; Map.map (fun k v -&gt; v |&gt; List.length) printfn &quot;areas =\\n %A&quot; areas<\/code><\/pre>\n<p>  <\/p>\n<p><em>areas<\/em> \u2014 \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u043b\u044e\u0447\u0438 \u2014 \u043c\u0435\u0442\u043a\u0438 \u0444\u0438\u0433\u0443\u0440, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u2014 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u043b\u043e\u0449\u0430\u0434\u0438<br \/>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">areas =  map [(1, 44); (2, 48); (5, 9)]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0444\u0438\u0433\u0443\u0440\u0430, \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u0430\u044f \u043c\u0435\u0442\u043a\u043e\u0439 1 \u0438\u043c\u0435\u0435\u0442 \u043f\u043b\u043e\u0449\u0430\u0442\u044c 44 \u043f\u0438\u043a\u0441\u0435\u043b\u044f, \u0444\u0438\u0433\u0443\u0440\u0430 \u0441 \u043c\u0435\u0442\u043a\u043e\u0439 2 \u2014 48 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0444\u0438\u0433\u0443\u0440\u0430 \u0441 \u043c\u0435\u0442\u043a\u043e\u0439 5 \u2014 9 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043c\u044b \u0432\u044b\u0440\u0435\u0436\u0435\u043c \u043a\u0430\u0436\u0434\u0443\u044e \u0444\u0438\u0433\u0443\u0440\u0443 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0442\u0440\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0445 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 1 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u0441\u0442\u043e\u0440\u043e\u043d\u0430\u043c, \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0435 \u043d\u0443\u043b\u044f\u043c\u0438. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b. \u0412 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u0435 \u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0431\u0443\u0434\u0443\u0442 \u043c\u0435\u0442\u043a\u0438, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u2014 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u043c \u043c\u0435\u0442\u043a\u0430\u043c<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u0432\u044b\u0440\u0435\u0437\u0430\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0438\u0433\u0443\u0440\u044b \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0430\u043c\u0438     let subarrays = mapAreas                     |&gt; Map.map (fun k v -&gt;                                     let minRow = v |&gt; List.map (fst) |&gt; List.min                                     let maxRow = v |&gt; List.map (fst) |&gt; List.max                                     let minCol = v |&gt; List.map (snd) |&gt; List.min                                     let maxCol = v |&gt; List.map (snd) |&gt; List.max                                      let dimRow = maxRow - minRow + 2 + 1 \/\/ add two zeros on left and right sides                                     let dimCol = maxCol - minCol + 2 + 1                                      let array2d = Array2D.create dimRow dimCol 0                                     v |&gt; List.iter (fun elem -&gt; (array2d.[(fst elem) - minRow + 1, (snd elem) - minCol + 1] &lt;- multyBinImage.[fst elem, snd elem]))                                      array2d                                )      printfn &quot;subarrays =\\n %A&quot; subarrays<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">subarrays =  map   [(1, [[0; 0; 0; 0; 0; 0; 0; 0; 0; 0]         [0; 0; 0; 1; 1; 1; 1; 0; 0; 0]         [0; 0; 1; 1; 1; 1; 1; 1; 0; 0]         [0; 1; 1; 1; 1; 1; 1; 1; 1; 0]         [0; 1; 1; 1; 1; 1; 1; 1; 1; 0]         [0; 1; 1; 1; 1; 1; 1; 1; 1; 0]         [0; 0; 1; 1; 1; 1; 1; 1; 0; 0]         [0; 0; 0; 1; 1; 1; 1; 0; 0; 0]         [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]]);     (2, [[0; 0; 0; 0; 0; 0]          [0; 1; 1; 1; 1; 0]          [0; 1; 1; 1; 1; 0]          [0; 1; 1; 1; 1; 0]          [0; 1; 1; 1; 1; 0]          [0; 1; 1; 1; 1; 0]          [0; 1; 1; 1; 1; 0]          [0; 1; 1; 1; 1; 0]          [0; 1; 1; 1; 1; 0]          [0; 1; 1; 1; 1; 0]          [0; 1; 1; 1; 1; 0]          [0; 1; 1; 1; 1; 0]          [0; 1; 1; 1; 1; 0]          [0; 0; 0; 0; 0; 0]]);     (5, [[0; 0; 0; 0; 0]         [0; 1; 1; 1; 0]         [0; 1; 1; 1; 0]         [0; 1; 1; 1; 0]         [0; 0; 0; 0; 0]])]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0433\u043e\u0442\u043e\u0432\u044b \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u044b \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b \u0438 \u043d\u0430\u0439\u0442\u0438 \u0438\u0445 \u0434\u043b\u0438\u043d\u044b. \u0414\u043b\u0438\u043d\u0430 \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0430 \u2014 \u044d\u0442\u043e \u0441\u0443\u043c\u043c\u0430 \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u044b\u0445 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u044b \u0444\u0438\u0433\u0443\u0440 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0438\u0445 \u0434\u043b\u0438\u043d\u044b     let erosionMaks = array2D [[0;1;0]                                [1;1;1]                                [0;1;0]]      let borders = subarrays                   |&gt; Map.map (fun label array2d -&gt; Algorithms.borderAllocation array2d erosionMaks (1, 1))     let bordersLength = borders |&gt; Map.map (fun label elem -&gt; elem |&gt; Seq.cast&lt;int&gt; |&gt; Seq.filter ((&lt;&gt;)0) |&gt; Seq.length)      printfn &quot;borders =\\n %A&quot; borders     printfn &quot;borders length =\\n %A&quot; bordersLength<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">borders =  map   [(1, [[0; 0; 0; 0; 0; 0; 0; 0; 0; 0]         [0; 0; 0; 1; 1; 1; 1; 0; 0; 0]         [0; 0; 1; 0; 0; 0; 0; 1; 0; 0]         [0; 1; 0; 0; 0; 0; 0; 0; 1; 0]         [0; 1; 0; 0; 0; 0; 0; 0; 1; 0]         [0; 1; 0; 0; 0; 0; 0; 0; 1; 0]         [0; 0; 1; 0; 0; 0; 0; 1; 0; 0]         [0; 0; 0; 1; 1; 1; 1; 0; 0; 0]         [0; 0; 0; 0; 0; 0; 0; 0; 0; 0]]);  (2, [[0; 0; 0; 0; 0; 0]       [0; 1; 1; 1; 1; 0]       [0; 1; 0; 0; 1; 0]       [0; 1; 0; 0; 1; 0]       [0; 1; 0; 0; 1; 0]       [0; 1; 0; 0; 1; 0]       [0; 1; 0; 0; 1; 0]       [0; 1; 0; 0; 1; 0]       [0; 1; 0; 0; 1; 0]       [0; 1; 0; 0; 1; 0]       [0; 1; 0; 0; 1; 0]       [0; 1; 0; 0; 1; 0]       [0; 1; 1; 1; 1; 0]       [0; 0; 0; 0; 0; 0]]);     (5, [[0; 0; 0; 0; 0]         [0; 1; 1; 1; 0]         [0; 1; 0; 1; 0]         [0; 1; 1; 1; 0]         [0; 0; 0; 0; 0]])]  borders length =  map [(1, 18); (2, 28); (5, 8)]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u0438\u043d\u0430 \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440\u0430 \u0444\u0438\u0433\u0443\u0440\u044b 1 \u0440\u0430\u0432\u043d\u0430 18 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0444\u0438\u0433\u0443\u0440\u0430 2 \u2014 28 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0438 \u0444\u0438\u0433\u0443\u0440\u044b 5 \u2014 8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439.<\/p>\n<p>  <\/p>\n<p>\u041d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u044c \u0446\u0435\u043d\u0442\u0440 \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u0438\u0449\u0435\u043c \u0446\u0435\u043d\u0442\u0440\u044b \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b     let centers = borders                    |&gt; Map.map (fun k v -&gt;                                  let centerRow = v |&gt; Array2D.mapi (fun r _ _ -&gt; float r) |&gt; Seq.cast&lt;float&gt; |&gt; Seq.average \/\/ list.average requires float                                  let centerCol = v |&gt; Array2D.mapi (fun _ c _ -&gt; float c) |&gt; Seq.cast&lt;float&gt; |&gt; Seq.average                                  (int centerCol, int centerRow)                               )     printfn &quot;centers =\\n %A&quot; centers<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">centers =  map [(1, (4, 4)); (2, (2, 6)); (5, (2, 2))]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u0441\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043e\u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0442\u0435\u0439 \u0444\u0438\u0433\u0443\u0440. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0444\u043e\u0440\u043c\u0443\u043b\u0443<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/6c8\/c1a\/097\/6c8c1a0975730fcd1d34989b1bcede5e.svg\" alt=\"$C=\\frac{\u03bcR}{\u03c3R}$\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>\u03bcR \u2014 \u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0440\u0430\u0434\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435<br \/>  \u03c3R \u2014 \u0421\u0440\u0435\u0434\u043d\u0435\u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u043e\u0435 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0434\u0438\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f<\/p>\n<p>  <\/p>\n<p>\u0421\u0440\u0435\u0434\u043d\u0435\u0435 \u0440\u0430\u0434\u0438\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/713\/2e3\/35b\/7132e335bf40993ddbf7a6bdb126d089.svg\" alt=\"$\u03bcR = \\frac{1}{K}\\sum\\limits_{k=1}^{K-1}||(r_k, c_k) - (\\overline{r}, \\overline{c})||$\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<p>(r_k, c_k) \u2014 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430 \u0446\u0435\u043d\u0442\u0440\u0430 \u0444\u0438\u0433\u0443\u0440\u044b<br \/>  (r, c) \u2014 \u0442\u0435\u043a\u0443\u0449\u0430\u044f\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u0430<\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0432\u0443\u043c\u044f \u0442\u043e\u0447\u043a\u0430\u043c\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u0440\u0430\u0441\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u0442\u043e\u0447\u043a\u0430\u043c\u0438     let diff point1 point2 =          let square x = x * x         let s1 = square ((fst point1) - (fst point2))         let s2 = square ((snd point1) - (snd point2))         sqrt(double (s1 + s2))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442\u044b \u03bcR \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u044b.<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043b\u043e\u0432\u0430\u0440\u044c, \u0433\u0434\u0435 key - \u043c\u0435\u0442\u043a\u0430, value - \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 (double) let mr = borders          |&gt; Map.map (fun label v -&gt;                         let aver = v                                     |&gt; Array2D.mapi (fun r c v -&gt; diff (r, c) centers.[label])                                     |&gt; Seq.cast&lt;double&gt;                                     |&gt; Seq.sum                         aver \/ (double v.Length)                  )<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u03c3R \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u0435<\/p>\n<p>  <\/p>\n<p><math><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/formulas\/f2f\/325\/33f\/f2f32533fbbeab83c78529ab6cae9608.svg\" alt=\"$\u03c3R = (\\frac{1}{K}\\sum\\limits_{k=1}^{K-1}[||(r_k, c_k) - (\\overline{r}, \\overline{c})|| - \u03bcR]^2)^{1\/2}$\" data-tex=\"display\"><\/math><\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">let qr = borders      |&gt; Map.map (fun label v -&gt;                     let aver = v                             |&gt; Array2D.mapi (fun r c v -&gt;                                                 let t1 = diff (r, c) centers.[label]                                                 let t2 = (t1 - mr.[label]) * (t1 - mr.[label])                                                 t2                                             )                             |&gt; Seq.cast&lt;double&gt;                             |&gt; Seq.sum                             |&gt; sqrt                 aver \/ (double v.Length)          )<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"haskell\">\/\/ \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043e\u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0442\u044c. \u0447\u0435\u043c \u0432\u044b\u0448\u0435 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442, \u0442\u0435\u043c \u043a\u0440\u0443\u0433\u043b\u0435\u0435 \u0444\u0438\u0433\u0443\u0440\u0430     let roundness = mr |&gt; Map.map (fun label v -&gt; v \/ qr.[label])     printfn &quot;roundness =\\n %A&quot; roundness<\/code><\/pre>\n<p>  <\/p>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442<\/p>\n<p>  <\/p>\n<pre><code class=\"haskell\">roundness =  map [(1, 25.06054796); (2, 20.37134197); (5, 13.43281947)]<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e, \u0444\u0438\u0433\u0443\u0440\u0430 \u0441 \u043c\u0435\u0442\u043a\u043e\u0439 1 \u0438\u043c\u0435\u0435\u0442 \u0441\u0430\u043c\u044b\u0439 \u0432\u044b\u0441\u043e\u043a\u0438\u0439 \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u043e\u043a\u0440\u0443\u0433\u043b\u043e\u0441\u0442\u0438. \u042d\u0442\u043e\u0439 \u0444\u0438\u0433\u0443\u0440\u043e\u0439 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0432\u0430\u043b \u0438 \u044d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442.<\/p>\n<p>  <\/p>\n<h2 id=\"zaklyuchenie\">\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 (\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439) \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438 \u043d\u0430\u0434 \u0434\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u043c\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\u043c\u0438 (\u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c\u0438) \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438\u0445 \u0432 \u044f\u0437\u044b\u043a\u0435 F#. \u0422\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0443\u043f\u0440\u0430\u0436\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441 \u0446\u0435\u043b\u044c\u044e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u0444\u0440\u0430\u0433\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f, \u0432 \u043d\u0435\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u044b \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0444\u043e\u0440\u043c\u0443\u043b\u044b. \u041d\u043e \u0442\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435, F# \u0441\u043f\u0440\u0430\u0432\u0438\u043b\u0441\u044f \u0438 \u044f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044c \u0441\u043c\u043e\u0433 \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u044f\u0437\u044b\u043a\u0430. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043d\u0435 \u0434\u0435\u043b\u0430\u043b\u0441\u044f \u0443\u043f\u043e\u0440 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043a\u043e\u0440\u0435\u0435 \u0446\u0435\u043b\u044c\u044e \u0431\u044b\u043b\u043e \u043f\u043e\u0434\u0432\u0435\u0441\u0442\u0438 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u044f \u043a \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044e, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u043b\u0430\u0432 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u0438 F# \u0434\u043b\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u044b\u043c\u0438, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0445 \u0447\u0430\u0441\u0442\u0438 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u044f \u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u044b. \u041d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u043c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>  <\/p>\n<p>\u0421\u0430\u043c\u0438 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b, \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u044b\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0437\u0434\u0435\u0441\u044c. \u0422\u0430\u043c \u0436\u0435 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 \u0435\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u0433\u0434\u0435 \u0438\u0449\u0443\u0442\u0441\u044f \u0441\u0430\u043c\u044b\u0435 \u043a\u0440\u0443\u0433\u043b\u044b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<br \/>  &lt;a href=&quot;<a href=\"https:\/\/github.com\/vlozhnikov\/traffic\/blob\/master\/fTrafficCore\/BinaryAlgorithms.fs&gt;%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D0%BC%D1%8B\" rel=\"nofollow\">https:\/\/github.com\/vlozhnikov\/traffic\/blob\/master\/fTrafficCore\/BinaryAlgorithms.fs&gt;\u0410\u043b\u0433\u043e\u0440\u0438\u043c\u044b<\/a> \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438<\/p>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/498156\/\"> https:\/\/habr.com\/ru\/post\/498156\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/498156\/\">\n<h2 id=\"vvedenie\">\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>  <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c, <i>\u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u044f<\/i> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0445 \u043b\u0438\u0431\u043e \u0441\u0432\u043e\u0439\u0441\u0442\u0432 \u044d\u0442\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f. \u0410 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 <i>\u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438<\/i> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0439 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432. \u0412 \u044d\u0442\u043e\u043c \u043f\u043b\u0430\u043d\u0435 \u0438\u0445 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 (\u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0439) \u043c\u043e\u0440\u0444\u043e\u043b\u043e\u0433\u0438\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0435 F#. \u0410 \u0442\u0430\u043a\u0436\u0435, \u0432 \u043a\u043e\u043d\u0446\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0432 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u043c\u0430\u0448\u0438\u043d\u043d\u043e\u0433\u043e \u0437\u0440\u0435\u043d\u0438\u044f.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-302235","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/302235","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=302235"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/302235\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=302235"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=302235"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=302235"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}