Class12.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488
  1. using OpenCvSharp;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace PaintDotNet.DedicatedAnalysis.GrainSizeStandard.IntegrationClass
  8. {
  9. public class Class12
  10. {
  11. public void ImgThin(Mat src, int maxIterations = -1)
  12. {
  13. Cv2.Threshold(src, src, 100.0, 1.0, ThresholdTypes.Binary);
  14. int rows = src.Rows;
  15. int cols = src.Cols;
  16. int num = 0;
  17. while (true)
  18. {
  19. num++;
  20. if (maxIterations != -1 && num > maxIterations)
  21. {
  22. break;
  23. }
  24. List<int[]> list = new List<int[]>();
  25. for (int i = 0; i < rows; i++)
  26. {
  27. for (int j = 0; j < cols; j++)
  28. {
  29. src.At<byte>(i, j);
  30. int num2 = (i != 0) ? src.At<byte>(i - 1, j) : 0;
  31. int num3 = (i != 0 && j != cols - 1) ? src.At<byte>(i - 1, j + 1) : 0;
  32. int num4 = (j != cols - 1) ? src.At<byte>(i, j + 1) : 0;
  33. int num5 = (i != rows - 1 && j != cols - 1) ? src.At<byte>(i + 1, j + 1) : 0;
  34. int num6 = (i != rows - 1) ? src.At<byte>(i + 1, j) : 0;
  35. int num7 = (i != rows - 1 && j != 0) ? src.At<byte>(i + 1, j - 1) : 0;
  36. int num8 = (j != 0) ? src.At<byte>(i, j - 1) : 0;
  37. int num9 = (i != 0 && j != 0) ? src.At<byte>(i - 1, j - 1) : 0;
  38. if (num2 + num3 + num4 + num5 + num6 + num7 + num8 + num9 >= 2 && num2 + num3 + num4 + num5 + num6 + num7 + num8 + num9 <= 6)
  39. {
  40. int num10 = 0;
  41. if (num2 == 0 && num3 == 1)
  42. {
  43. num10++;
  44. }
  45. if (num3 == 0 && num4 == 1)
  46. {
  47. num10++;
  48. }
  49. if (num4 == 0 && num5 == 1)
  50. {
  51. num10++;
  52. }
  53. if (num5 == 0 && num6 == 1)
  54. {
  55. num10++;
  56. }
  57. if (num6 == 0 && num7 == 1)
  58. {
  59. num10++;
  60. }
  61. if (num7 == 0 && num8 == 1)
  62. {
  63. num10++;
  64. }
  65. if (num8 == 0 && num9 == 1)
  66. {
  67. num10++;
  68. }
  69. if (num9 == 0 && num2 == 1)
  70. {
  71. num10++;
  72. }
  73. if (num10 == 1 && num2 * num4 * num6 == 0 && num4 * num6 * num8 == 0)
  74. {
  75. list.Add(new int[2]
  76. {
  77. i,
  78. j
  79. });
  80. }
  81. }
  82. }
  83. }
  84. list.ForEach(delegate (int[] aiP)
  85. {
  86. src.Set(aiP, (byte)0);
  87. });
  88. if (list.Count() == 0)
  89. {
  90. break;
  91. }
  92. list.Clear();
  93. for (int k = 0; k < rows; k++)
  94. {
  95. for (int l = 0; l < cols; l++)
  96. {
  97. int num11 = src.At<byte>(k, l);
  98. if (num11 != 1)
  99. {
  100. continue;
  101. }
  102. int num12 = (k != 0) ? src.At<byte>(k - 1, l) : 0;
  103. int num13 = (k != 0 && l != cols - 1) ? src.At<byte>(k - 1, l + 1) : 0;
  104. int num14 = (l != cols - 1) ? src.At<byte>(k, l + 1) : 0;
  105. int num15 = (k != rows - 1 && l != cols - 1) ? src.At<byte>(k + 1, l + 1) : 0;
  106. int num16 = (k != rows - 1) ? src.At<byte>(k + 1, l) : 0;
  107. int num17 = (k != rows - 1 && l != 0) ? src.At<byte>(k + 1, l - 1) : 0;
  108. int num18 = (l != 0) ? src.At<byte>(k, l - 1) : 0;
  109. int num19 = (k != 0 && l != 0) ? src.At<byte>(k - 1, l - 1) : 0;
  110. if (num12 + num13 + num14 + num15 + num16 + num17 + num18 + num19 >= 2 && num12 + num13 + num14 + num15 + num16 + num17 + num18 + num19 <= 6)
  111. {
  112. int num20 = 0;
  113. if (num12 == 0 && num13 == 1)
  114. {
  115. num20++;
  116. }
  117. if (num13 == 0 && num14 == 1)
  118. {
  119. num20++;
  120. }
  121. if (num14 == 0 && num15 == 1)
  122. {
  123. num20++;
  124. }
  125. if (num15 == 0 && num16 == 1)
  126. {
  127. num20++;
  128. }
  129. if (num16 == 0 && num17 == 1)
  130. {
  131. num20++;
  132. }
  133. if (num17 == 0 && num18 == 1)
  134. {
  135. num20++;
  136. }
  137. if (num18 == 0 && num19 == 1)
  138. {
  139. num20++;
  140. }
  141. if (num19 == 0 && num12 == 1)
  142. {
  143. num20++;
  144. }
  145. if (num20 == 1 && num12 * num14 * num18 == 0 && num12 * num16 * num18 == 0)
  146. {
  147. list.Add(new int[2]
  148. {
  149. k,
  150. l
  151. });
  152. }
  153. }
  154. }
  155. }
  156. list.ForEach(delegate (int[] aiP)
  157. {
  158. src.Set(aiP, (byte)0);
  159. });
  160. if (list.Count() == 0)
  161. {
  162. break;
  163. }
  164. list.Clear();
  165. }
  166. Cv2.Threshold(src, src, 0.0, 255.0, ThresholdTypes.Binary);
  167. }
  168. public void ConnectionBoundary(Mat Img, int iDistance)
  169. {
  170. Cv2.Threshold(Img, Img, 100.0, 1.0, ThresholdTypes.Binary);
  171. Mat mat = Connectivity(Img);
  172. List<int[]> list = new List<int[]>();
  173. List<int[]> list2 = new List<int[]>();
  174. int[] array = new int[2]
  175. {
  176. 1,
  177. 0
  178. };
  179. while (array[0] < Img.Rows - 1)
  180. {
  181. array[1] = 1;
  182. while (array[1] < Img.Cols - 1)
  183. {
  184. if (1 <= Img.At<byte>(array[0], array[1]) && mat.At<byte>(array[0], array[1]) == 0)
  185. {
  186. Img.Set(array, (byte)0);
  187. }
  188. if (1 <= Img.At<byte>(array[0], array[1]) && 1 == mat.At<byte>(array[0], array[1]))
  189. {
  190. list.Add(new int[2]
  191. {
  192. array[0],
  193. array[1]
  194. });
  195. int num = 0;
  196. int i = 0;
  197. for (num = -1; num <= 1; num++)
  198. {
  199. bool flag = false;
  200. for (i = -1; i <= 1; i++)
  201. {
  202. if ((num != 0 || i != 0) && Img.At<byte>(array[0] + num, array[1] + i) >= 1)
  203. {
  204. flag = true;
  205. break;
  206. }
  207. }
  208. if (flag)
  209. {
  210. break;
  211. }
  212. }
  213. list2.Add(new int[2]
  214. {
  215. -num,
  216. -i
  217. });
  218. }
  219. array[1]++;
  220. }
  221. array[0]++;
  222. }
  223. int num2 = list.Count();
  224. List<int[]>[] array2 = new List<int[]>[num2];
  225. List<int> list3 = new List<int>();
  226. List<int> list4 = new List<int>();
  227. for (int j = 0; j < num2; j++)
  228. {
  229. list3.Add(j);
  230. int[] array3 = list[j];
  231. array2[j] = new List<int[]>();
  232. array2[j].Add(new int[2]
  233. {
  234. array3[0],
  235. array3[1]
  236. });
  237. }
  238. Mat mat2 = new Mat(Img.Size(), MatType.CV_32SC1);
  239. array[0] = 0;
  240. while (array[0] < Img.Rows)
  241. {
  242. array[1] = 0;
  243. while (array[1] < Img.Cols)
  244. {
  245. int value = Img.At<byte>(array[0], array[1]);
  246. mat2.Set(array, value);
  247. array[1]++;
  248. }
  249. array[0]++;
  250. }
  251. int[,] array4 = new int[260, 2]
  252. {
  253. {
  254. -1,
  255. 0
  256. },
  257. {
  258. 0,
  259. 1
  260. },
  261. {
  262. 1,
  263. 0
  264. },
  265. {
  266. 0,
  267. 1
  268. },
  269. {
  270. -1,
  271. 1
  272. },
  273. {
  274. 1,
  275. 1
  276. },
  277. {
  278. 1,
  279. -1
  280. },
  281. {
  282. -1,
  283. -1
  284. },
  285. {
  286. -2,
  287. 0
  288. },
  289. {
  290. 0,
  291. 2
  292. },
  293. {
  294. 2,
  295. 0
  296. },
  297. {
  298. 0,
  299. -2
  300. },
  301. {
  302. -2,
  303. 1
  304. },
  305. {
  306. -1,
  307. 2
  308. },
  309. {
  310. 1,
  311. 2
  312. },
  313. {
  314. 2,
  315. 1
  316. },
  317. {
  318. 2,
  319. -1
  320. },
  321. {
  322. 1,
  323. -2
  324. },
  325. {
  326. -1,
  327. -2
  328. },
  329. {
  330. -2,
  331. -1
  332. },
  333. {
  334. -2,
  335. 2
  336. },
  337. {
  338. 2,
  339. 2
  340. },
  341. {
  342. 2,
  343. -2
  344. },
  345. {
  346. -2,
  347. -2
  348. },
  349. {
  350. -3,
  351. 0
  352. },
  353. {
  354. 0,
  355. 3
  356. },
  357. {
  358. 3,
  359. 0
  360. },
  361. {
  362. 0,
  363. -3
  364. },
  365. {
  366. -3,
  367. 1
  368. },
  369. {
  370. -1,
  371. 3
  372. },
  373. {
  374. 1,
  375. 3
  376. },
  377. {
  378. 3,
  379. 1
  380. },
  381. {
  382. 3,
  383. -1
  384. },
  385. {
  386. 1,
  387. -3
  388. },
  389. {
  390. -1,
  391. -3
  392. },
  393. {
  394. -3,
  395. -1
  396. },
  397. {
  398. 2,
  399. 3
  400. },
  401. {
  402. -3,
  403. 2
  404. },
  405. {
  406. -2,
  407. -3
  408. },
  409. {
  410. -2,
  411. 3
  412. },
  413. {
  414. -3,
  415. -2
  416. },
  417. {
  418. 3,
  419. 2
  420. },
  421. {
  422. 3,
  423. -2
  424. },
  425. {
  426. 2,
  427. -3
  428. },
  429. {
  430. 4,
  431. 0
  432. },
  433. {
  434. 0,
  435. 4
  436. },
  437. {
  438. -4,
  439. 0
  440. },
  441. {
  442. 0,
  443. -4
  444. },
  445. {
  446. 1,
  447. 4
  448. },
  449. {
  450. 4,
  451. -1
  452. },
  453. {
  454. 4,
  455. 1
  456. },
  457. {
  458. -1,
  459. -4
  460. },
  461. {
  462. -4,
  463. 1
  464. },
  465. {
  466. -4,
  467. -1
  468. },
  469. {
  470. -1,
  471. 4
  472. },
  473. {
  474. 1,
  475. -4
  476. },
  477. {
  478. 3,
  479. 3
  480. },
  481. {
  482. 3,
  483. -3
  484. },
  485. {
  486. -3,
  487. 3
  488. },
  489. {
  490. -3,
  491. -3
  492. },
  493. {
  494. -4,
  495. -2
  496. },
  497. {
  498. -2,
  499. -4
  500. },
  501. {
  502. -4,
  503. 2
  504. },
  505. {
  506. 4,
  507. 2
  508. },
  509. {
  510. -2,
  511. 4
  512. },
  513. {
  514. 4,
  515. -2
  516. },
  517. {
  518. 2,
  519. -4
  520. },
  521. {
  522. 2,
  523. 4
  524. },
  525. {
  526. 4,
  527. -3
  528. },
  529. {
  530. -3,
  531. 4
  532. },
  533. {
  534. 4,
  535. 3
  536. },
  537. {
  538. 5,
  539. 0
  540. },
  541. {
  542. 0,
  543. 5
  544. },
  545. {
  546. 0,
  547. -5
  548. },
  549. {
  550. -5,
  551. 0
  552. },
  553. {
  554. 3,
  555. 4
  556. },
  557. {
  558. -3,
  559. -4
  560. },
  561. {
  562. -4,
  563. -3
  564. },
  565. {
  566. 3,
  567. -4
  568. },
  569. {
  570. -4,
  571. 3
  572. },
  573. {
  574. 5,
  575. -1
  576. },
  577. {
  578. -1,
  579. 5
  580. },
  581. {
  582. -1,
  583. -5
  584. },
  585. {
  586. 5,
  587. 1
  588. },
  589. {
  590. 1,
  591. -5
  592. },
  593. {
  594. -5,
  595. 1
  596. },
  597. {
  598. -5,
  599. -1
  600. },
  601. {
  602. 1,
  603. 5
  604. },
  605. {
  606. -2,
  607. 5
  608. },
  609. {
  610. 2,
  611. -5
  612. },
  613. {
  614. 2,
  615. 5
  616. },
  617. {
  618. 5,
  619. 2
  620. },
  621. {
  622. -5,
  623. 2
  624. },
  625. {
  626. -2,
  627. -5
  628. },
  629. {
  630. 5,
  631. -2
  632. },
  633. {
  634. -5,
  635. -2
  636. },
  637. {
  638. -4,
  639. 4
  640. },
  641. {
  642. 4,
  643. -4
  644. },
  645. {
  646. 4,
  647. 4
  648. },
  649. {
  650. -4,
  651. -4
  652. },
  653. {
  654. 3,
  655. -5
  656. },
  657. {
  658. -5,
  659. 3
  660. },
  661. {
  662. -3,
  663. 5
  664. },
  665. {
  666. 5,
  667. -3
  668. },
  669. {
  670. 5,
  671. 3
  672. },
  673. {
  674. -5,
  675. -3
  676. },
  677. {
  678. -3,
  679. -5
  680. },
  681. {
  682. 3,
  683. 5
  684. },
  685. {
  686. 0,
  687. 6
  688. },
  689. {
  690. 0,
  691. -6
  692. },
  693. {
  694. -6,
  695. 0
  696. },
  697. {
  698. 6,
  699. 0
  700. },
  701. {
  702. -6,
  703. 1
  704. },
  705. {
  706. 1,
  707. 6
  708. },
  709. {
  710. -6,
  711. -1
  712. },
  713. {
  714. 1,
  715. -6
  716. },
  717. {
  718. -1,
  719. 6
  720. },
  721. {
  722. -1,
  723. -6
  724. },
  725. {
  726. 6,
  727. -1
  728. },
  729. {
  730. 6,
  731. 1
  732. },
  733. {
  734. 2,
  735. 6
  736. },
  737. {
  738. -2,
  739. -6
  740. },
  741. {
  742. 6,
  743. 2
  744. },
  745. {
  746. -6,
  747. 2
  748. },
  749. {
  750. 2,
  751. -6
  752. },
  753. {
  754. -6,
  755. -2
  756. },
  757. {
  758. -2,
  759. 6
  760. },
  761. {
  762. 6,
  763. -2
  764. },
  765. {
  766. -5,
  767. -4
  768. },
  769. {
  770. 5,
  771. 4
  772. },
  773. {
  774. 4,
  775. 5
  776. },
  777. {
  778. -4,
  779. 5
  780. },
  781. {
  782. 4,
  783. -5
  784. },
  785. {
  786. -5,
  787. 4
  788. },
  789. {
  790. 5,
  791. -4
  792. },
  793. {
  794. -4,
  795. -5
  796. },
  797. {
  798. -3,
  799. 6
  800. },
  801. {
  802. -6,
  803. 3
  804. },
  805. {
  806. -3,
  807. -6
  808. },
  809. {
  810. -6,
  811. -3
  812. },
  813. {
  814. 3,
  815. -6
  816. },
  817. {
  818. 6,
  819. 3
  820. },
  821. {
  822. 3,
  823. 6
  824. },
  825. {
  826. 6,
  827. -3
  828. },
  829. {
  830. 0,
  831. 7
  832. },
  833. {
  834. 7,
  835. 0
  836. },
  837. {
  838. 0,
  839. -7
  840. },
  841. {
  842. -7,
  843. 0
  844. },
  845. {
  846. 5,
  847. -5
  848. },
  849. {
  850. 1,
  851. 7
  852. },
  853. {
  854. -1,
  855. 7
  856. },
  857. {
  858. -5,
  859. -5
  860. },
  861. {
  862. -7,
  863. -1
  864. },
  865. {
  866. -7,
  867. 1
  868. },
  869. {
  870. -1,
  871. -7
  872. },
  873. {
  874. 1,
  875. -7
  876. },
  877. {
  878. 7,
  879. 1
  880. },
  881. {
  882. -5,
  883. 5
  884. },
  885. {
  886. 5,
  887. 5
  888. },
  889. {
  890. 7,
  891. -1
  892. },
  893. {
  894. 6,
  895. 4
  896. },
  897. {
  898. -6,
  899. 4
  900. },
  901. {
  902. 6,
  903. -4
  904. },
  905. {
  906. -6,
  907. -4
  908. },
  909. {
  910. -4,
  911. -6
  912. },
  913. {
  914. 4,
  915. 6
  916. },
  917. {
  918. 4,
  919. -6
  920. },
  921. {
  922. -4,
  923. 6
  924. },
  925. {
  926. 7,
  927. -2
  928. },
  929. {
  930. 7,
  931. 2
  932. },
  933. {
  934. 2,
  935. 7
  936. },
  937. {
  938. -7,
  939. -2
  940. },
  941. {
  942. -2,
  943. -7
  944. },
  945. {
  946. -2,
  947. 7
  948. },
  949. {
  950. 2,
  951. -7
  952. },
  953. {
  954. -7,
  955. 2
  956. },
  957. {
  958. 7,
  959. -3
  960. },
  961. {
  962. -3,
  963. 7
  964. },
  965. {
  966. -3,
  967. -7
  968. },
  969. {
  970. 3,
  971. -7
  972. },
  973. {
  974. -7,
  975. 3
  976. },
  977. {
  978. 3,
  979. 7
  980. },
  981. {
  982. 7,
  983. 3
  984. },
  985. {
  986. -7,
  987. -3
  988. },
  989. {
  990. 6,
  991. -5
  992. },
  993. {
  994. 5,
  995. 6
  996. },
  997. {
  998. 5,
  999. -6
  1000. },
  1001. {
  1002. 6,
  1003. 5
  1004. },
  1005. {
  1006. -5,
  1007. 6
  1008. },
  1009. {
  1010. -5,
  1011. -6
  1012. },
  1013. {
  1014. -6,
  1015. 5
  1016. },
  1017. {
  1018. -6,
  1019. -5
  1020. },
  1021. {
  1022. 8,
  1023. 0
  1024. },
  1025. {
  1026. 0,
  1027. -8
  1028. },
  1029. {
  1030. -8,
  1031. 0
  1032. },
  1033. {
  1034. 0,
  1035. 8
  1036. },
  1037. {
  1038. -4,
  1039. 7
  1040. },
  1041. {
  1042. 4,
  1043. -7
  1044. },
  1045. {
  1046. -8,
  1047. -1
  1048. },
  1049. {
  1050. -1,
  1051. 8
  1052. },
  1053. {
  1054. -7,
  1055. 4
  1056. },
  1057. {
  1058. -1,
  1059. -8
  1060. },
  1061. {
  1062. 7,
  1063. 4
  1064. },
  1065. {
  1066. 1,
  1067. -8
  1068. },
  1069. {
  1070. 1,
  1071. 8
  1072. },
  1073. {
  1074. 8,
  1075. 1
  1076. },
  1077. {
  1078. 8,
  1079. -1
  1080. },
  1081. {
  1082. -4,
  1083. -7
  1084. },
  1085. {
  1086. -7,
  1087. -4
  1088. },
  1089. {
  1090. 7,
  1091. -4
  1092. },
  1093. {
  1094. -8,
  1095. 1
  1096. },
  1097. {
  1098. 4,
  1099. 7
  1100. },
  1101. {
  1102. -2,
  1103. 8
  1104. },
  1105. {
  1106. 2,
  1107. -8
  1108. },
  1109. {
  1110. -2,
  1111. -8
  1112. },
  1113. {
  1114. 8,
  1115. 2
  1116. },
  1117. {
  1118. -8,
  1119. 2
  1120. },
  1121. {
  1122. -8,
  1123. -2
  1124. },
  1125. {
  1126. 2,
  1127. 8
  1128. },
  1129. {
  1130. 8,
  1131. -2
  1132. },
  1133. {
  1134. -6,
  1135. 6
  1136. },
  1137. {
  1138. 6,
  1139. 6
  1140. },
  1141. {
  1142. 6,
  1143. -6
  1144. },
  1145. {
  1146. -6,
  1147. -6
  1148. },
  1149. {
  1150. 3,
  1151. -8
  1152. },
  1153. {
  1154. -3,
  1155. 8
  1156. },
  1157. {
  1158. 8,
  1159. 3
  1160. },
  1161. {
  1162. 8,
  1163. -3
  1164. },
  1165. {
  1166. 3,
  1167. 8
  1168. },
  1169. {
  1170. -3,
  1171. -8
  1172. },
  1173. {
  1174. -8,
  1175. 3
  1176. },
  1177. {
  1178. -8,
  1179. -3
  1180. },
  1181. {
  1182. 7,
  1183. -5
  1184. },
  1185. {
  1186. -7,
  1187. -5
  1188. },
  1189. {
  1190. 5,
  1191. 7
  1192. },
  1193. {
  1194. 7,
  1195. 5
  1196. },
  1197. {
  1198. 5,
  1199. -7
  1200. },
  1201. {
  1202. -7,
  1203. 5
  1204. },
  1205. {
  1206. -5,
  1207. -7
  1208. },
  1209. {
  1210. -5,
  1211. 7
  1212. },
  1213. {
  1214. 8,
  1215. -4
  1216. },
  1217. {
  1218. -4,
  1219. -8
  1220. },
  1221. {
  1222. -8,
  1223. -4
  1224. },
  1225. {
  1226. 8,
  1227. 4
  1228. },
  1229. {
  1230. 4,
  1231. 8
  1232. },
  1233. {
  1234. -8,
  1235. 4
  1236. },
  1237. {
  1238. 4,
  1239. -8
  1240. },
  1241. {
  1242. -4,
  1243. 8
  1244. },
  1245. {
  1246. 0,
  1247. -9
  1248. },
  1249. {
  1250. 0,
  1251. 9
  1252. },
  1253. {
  1254. -9,
  1255. 0
  1256. },
  1257. {
  1258. 9,
  1259. 0
  1260. },
  1261. {
  1262. 9,
  1263. -1
  1264. },
  1265. {
  1266. -9,
  1267. -1
  1268. },
  1269. {
  1270. 1,
  1271. -9
  1272. },
  1273. {
  1274. -1,
  1275. 9
  1276. },
  1277. {
  1278. -1,
  1279. -9
  1280. },
  1281. {
  1282. -9,
  1283. 1
  1284. },
  1285. {
  1286. 1,
  1287. 9
  1288. },
  1289. {
  1290. 9,
  1291. 1
  1292. }
  1293. };
  1294. while (list3.Count() != 0)
  1295. {
  1296. int num3 = list3[0];
  1297. list3.RemoveAt(0);
  1298. int index = array2[num3].Count() - 1;
  1299. int[] array5 = array2[num3][index];
  1300. int[] pnt = new int[2]
  1301. {
  1302. array5[0],
  1303. array5[1]
  1304. };
  1305. int[] array6 = list2[num3];
  1306. bool flag2 = false;
  1307. for (int k = 0; k < iDistance; k++)
  1308. {
  1309. if (0 > array6[0] * array4[k, 0] || 0 > array6[1] * array4[k, 1])
  1310. {
  1311. continue;
  1312. }
  1313. pnt[0] = array5[0] + array4[k, 0];
  1314. pnt[1] = array5[1] + array4[k, 1];
  1315. if (0 > pnt[0] || Img.Rows <= pnt[0] || 0 > pnt[1] || Img.Cols <= pnt[1])
  1316. {
  1317. continue;
  1318. }
  1319. int num4 = mat2.At<int>(pnt[0], pnt[1]);
  1320. if (1 < num4 && num3 != num4)
  1321. {
  1322. list3.Remove(num4);
  1323. if (!list4.Contains(num4))
  1324. {
  1325. int num5 = array2[num4].FindIndex((int[] t) => t[0] == pnt[0] && t[1] == pnt[1]);
  1326. int num6 = array2[num4].Count() - 1;
  1327. if (1 <= num6 - num5)
  1328. {
  1329. for (int l = num5 + 1; l <= num6; l++)
  1330. {
  1331. mat2.Set(array2[num4][l], 0);
  1332. }
  1333. array2[num4].RemoveRange(num5 + 1, num6 - num5);
  1334. }
  1335. list4.Add(num4);
  1336. list4.Add(num3);
  1337. }
  1338. ConnectTwoPnt(array5, pnt, array2[num3]);
  1339. flag2 = true;
  1340. break;
  1341. }
  1342. if (1 == num4)
  1343. {
  1344. ConnectTwoPnt(array5, pnt, array2[num3]);
  1345. flag2 = true;
  1346. break;
  1347. }
  1348. }
  1349. if (!flag2)
  1350. {
  1351. pnt[0] = array5[0] + array6[0];
  1352. pnt[1] = array5[1] + array6[1];
  1353. if (0 <= pnt[0] && Img.Rows > pnt[0] && 0 <= pnt[1] && Img.Cols > pnt[1])
  1354. {
  1355. array2[num3].Add(pnt);
  1356. mat2.Set(pnt, num3);
  1357. list3.Add(num3);
  1358. }
  1359. }
  1360. }
  1361. for (int m = 0; m < num2; m++)
  1362. {
  1363. array2[m].ForEach(delegate (int[] aiP)
  1364. {
  1365. Img.Set(aiP, (byte)1);
  1366. });
  1367. }
  1368. Cv2.Threshold(Img, Img, 0.0, 255.0, ThresholdTypes.Binary);
  1369. }
  1370. public void ConnectTwoPnt(int[] pntA, int[] pntB, List<int[]> DevelopmentA)
  1371. {
  1372. int num = pntA[0];
  1373. int num2 = pntA[1];
  1374. int num3 = pntB[0] - num;
  1375. int num4 = pntB[1] - num2;
  1376. int num5 = (num3 != 0) ? (num3 / Math.Abs(num3)) : 0;
  1377. int num6 = (num4 != 0) ? (num4 / Math.Abs(num4)) : 0;
  1378. while (num3 != 0 || num4 != 0)
  1379. {
  1380. if (Math.Abs(num3) > Math.Abs(num4))
  1381. {
  1382. num += num5;
  1383. }
  1384. else
  1385. {
  1386. num2 += num6;
  1387. }
  1388. DevelopmentA.Add(new int[2]
  1389. {
  1390. num,
  1391. num2
  1392. });
  1393. num3 = pntB[0] - num;
  1394. num4 = pntB[1] - num2;
  1395. }
  1396. }
  1397. public Mat Connectivity(Mat Img)
  1398. {
  1399. Mat mat = new Mat(Img.Size(), MatType.CV_8UC1);
  1400. int[] array = new int[2]
  1401. {
  1402. 1,
  1403. 0
  1404. };
  1405. while (array[0] < Img.Rows - 1)
  1406. {
  1407. array[1] = 0;
  1408. while (array[1] < Img.Cols)
  1409. {
  1410. byte b = Img.At<byte>(array[0] - 1, array[1]);
  1411. b = (byte)(b + Img.At<byte>(array[0], array[1]));
  1412. b = (byte)(b + Img.At<byte>(array[0] + 1, array[1]));
  1413. mat.Set(array, b);
  1414. array[1]++;
  1415. }
  1416. array[0]++;
  1417. }
  1418. Mat mat2 = new Mat(Img.Size(), MatType.CV_8UC1);
  1419. array[0] = 1;
  1420. while (array[0] < Img.Rows - 1)
  1421. {
  1422. array[1] = 1;
  1423. while (array[1] < Img.Cols - 1)
  1424. {
  1425. byte b2 = mat.At<byte>(array[0], array[1] - 1);
  1426. b2 = (byte)(b2 + mat.At<byte>(array[0], array[1]));
  1427. b2 = (byte)(b2 + mat.At<byte>(array[0], array[1] + 1));
  1428. b2 = (byte)(b2 - Img.At<byte>(array[0], array[1]));
  1429. mat2.Set(array, b2);
  1430. array[1]++;
  1431. }
  1432. array[0]++;
  1433. }
  1434. mat = null;
  1435. return mat2;
  1436. }
  1437. }
  1438. }