jezv 1 year ago
parent
commit
5bdb2c84d5
70 changed files with 89 additions and 0 deletions
  1. 89 0
      alphabet/main.py
  2. BIN
      alphabet/result/0.png
  3. BIN
      alphabet/result/100.png
  4. BIN
      alphabet/result/102.png
  5. BIN
      alphabet/result/11.png
  6. BIN
      alphabet/result/113.png
  7. BIN
      alphabet/result/119.png
  8. BIN
      alphabet/result/12.png
  9. BIN
      alphabet/result/121.png
  10. BIN
      alphabet/result/124.png
  11. BIN
      alphabet/result/13.png
  12. BIN
      alphabet/result/16.png
  13. BIN
      alphabet/result/160.png
  14. BIN
      alphabet/result/177.png
  15. BIN
      alphabet/result/183.png
  16. BIN
      alphabet/result/185.png
  17. BIN
      alphabet/result/188.png
  18. BIN
      alphabet/result/19.png
  19. BIN
      alphabet/result/192.png
  20. BIN
      alphabet/result/195.png
  21. BIN
      alphabet/result/202.png
  22. BIN
      alphabet/result/206.png
  23. BIN
      alphabet/result/208.png
  24. BIN
      alphabet/result/21.png
  25. BIN
      alphabet/result/210.png
  26. BIN
      alphabet/result/213.png
  27. BIN
      alphabet/result/219.png
  28. BIN
      alphabet/result/22.png
  29. BIN
      alphabet/result/225.png
  30. BIN
      alphabet/result/228.png
  31. BIN
      alphabet/result/24.png
  32. BIN
      alphabet/result/244.png
  33. BIN
      alphabet/result/25.png
  34. BIN
      alphabet/result/251.png
  35. BIN
      alphabet/result/266.png
  36. BIN
      alphabet/result/267.png
  37. BIN
      alphabet/result/272.png
  38. BIN
      alphabet/result/285.png
  39. BIN
      alphabet/result/291.png
  40. BIN
      alphabet/result/294.png
  41. BIN
      alphabet/result/297.png
  42. BIN
      alphabet/result/30.png
  43. BIN
      alphabet/result/302.png
  44. BIN
      alphabet/result/306.png
  45. BIN
      alphabet/result/317.png
  46. BIN
      alphabet/result/318.png
  47. BIN
      alphabet/result/322.png
  48. BIN
      alphabet/result/331.png
  49. BIN
      alphabet/result/335.png
  50. BIN
      alphabet/result/336.png
  51. BIN
      alphabet/result/339.png
  52. BIN
      alphabet/result/346.png
  53. BIN
      alphabet/result/347.png
  54. BIN
      alphabet/result/349.png
  55. BIN
      alphabet/result/355.png
  56. BIN
      alphabet/result/369.png
  57. BIN
      alphabet/result/373.png
  58. BIN
      alphabet/result/378.png
  59. BIN
      alphabet/result/386.png
  60. BIN
      alphabet/result/390.png
  61. BIN
      alphabet/result/393.png
  62. BIN
      alphabet/result/41.png
  63. BIN
      alphabet/result/44.png
  64. BIN
      alphabet/result/51.png
  65. BIN
      alphabet/result/56.png
  66. BIN
      alphabet/result/60.png
  67. BIN
      alphabet/result/62.png
  68. BIN
      alphabet/result/66.png
  69. BIN
      alphabet/result/8.png
  70. BIN
      alphabet/symbols.png

+ 89 - 0
alphabet/main.py

@@ -0,0 +1,89 @@
+import matplotlib.pyplot as plt
+import numpy as np
+from skimage.filters import threshold_otsu
+from skimage.measure import label, regionprops
+from collections import defaultdict
+from pathlib import Path
+
+
+def filling_factor(arr):
+    return np.sum(arr) / arr.size
+
+
+def count_holes(arr):
+    labeled = label(np.logical_not(arr))
+    regions = regionprops(labeled)
+    holes = 0
+    for region in regions:
+        coords = np.transpose(region.coords, (1,0))
+        ymin = np.min(coords[1])
+        ymax = np.max(coords[1])
+        xmin = np.min(coords[0])
+        xmax = np.max(coords[0])
+        if ymin == 0 or ymax == arr.shape[1]-1 or xmin == 0 or xmax == arr.shape[0]-1: continue
+        holes += 1
+    return holes
+
+
+def count_holes_rame(arr):
+    labeled = label(np.logical_not(arr))
+    return np.max(labeled)
+
+
+def count_vline(arr):
+    return np.sum(arr.mean(0) == 1)
+
+
+def recognize(region):
+    if filling_factor(region.image) == 1.0:
+        return '-'
+    else:
+        holes = count_holes(region.image)
+        if holes == 2: # B or 8
+            if count_vline(region.image) >= 3:
+                return 'B'
+            else: return '8'
+        elif holes == 1: #A or 0
+            if count_vline(region.image) >= 2:
+                if abs((region.local_centroid[0] / region.image.shape[0]) - (region.local_centroid[1] / region.image.shape[1])) > 0.035:
+                    return 'D'
+                else: return 'P'
+            elif abs((region.local_centroid[0] / region.image.shape[0]) - (region.local_centroid[1] / region.image.shape[1])) > 0.02:
+                return 'A'
+            else: return '0'
+        else:
+            if count_vline(region.image) >= 1:
+                return '1'
+            else:
+                if region.eccentricity < 0.4:
+                    return '*'
+                else:
+                    match count_holes_rame(region.image):
+                        case 2: return '/'
+                        case 4: return 'X'
+                        case 5: return 'W'
+    return '_'
+
+img = plt.imread('/home/jezv/Projects/Volovikov_CV/alphabet/symbols.png')
+
+img = np.mean(img, axis=2)
+thrash = threshold_otsu(img)
+img[img > 0] = 1
+
+regions = regionprops(label(img))
+
+result = defaultdict(lambda: 0)
+
+path = Path('.') / 'alphabet' /'result'
+path.mkdir(exist_ok=True)
+
+for i,region in enumerate(regions):
+    symbol = recognize(region)
+    result[symbol] += 1
+    if symbol in 'PD':
+        plt.clf()
+        plt.title(f"{symbol}")
+        plt.imshow(region.image)
+        plt.savefig(path / f"{i}")
+
+print(result, sum(result.values()))

BIN
alphabet/result/0.png


BIN
alphabet/result/100.png


BIN
alphabet/result/102.png


BIN
alphabet/result/11.png


BIN
alphabet/result/113.png


BIN
alphabet/result/119.png


BIN
alphabet/result/12.png


BIN
alphabet/result/121.png


BIN
alphabet/result/124.png


BIN
alphabet/result/13.png


BIN
alphabet/result/16.png


BIN
alphabet/result/160.png


BIN
alphabet/result/177.png


BIN
alphabet/result/183.png


BIN
alphabet/result/185.png


BIN
alphabet/result/188.png


BIN
alphabet/result/19.png


BIN
alphabet/result/192.png


BIN
alphabet/result/195.png


BIN
alphabet/result/202.png


BIN
alphabet/result/206.png


BIN
alphabet/result/208.png


BIN
alphabet/result/21.png


BIN
alphabet/result/210.png


BIN
alphabet/result/213.png


BIN
alphabet/result/219.png


BIN
alphabet/result/22.png


BIN
alphabet/result/225.png


BIN
alphabet/result/228.png


BIN
alphabet/result/24.png


BIN
alphabet/result/244.png


BIN
alphabet/result/25.png


BIN
alphabet/result/251.png


BIN
alphabet/result/266.png


BIN
alphabet/result/267.png


BIN
alphabet/result/272.png


BIN
alphabet/result/285.png


BIN
alphabet/result/291.png


BIN
alphabet/result/294.png


BIN
alphabet/result/297.png


BIN
alphabet/result/30.png


BIN
alphabet/result/302.png


BIN
alphabet/result/306.png


BIN
alphabet/result/317.png


BIN
alphabet/result/318.png


BIN
alphabet/result/322.png


BIN
alphabet/result/331.png


BIN
alphabet/result/335.png


BIN
alphabet/result/336.png


BIN
alphabet/result/339.png


BIN
alphabet/result/346.png


BIN
alphabet/result/347.png


BIN
alphabet/result/349.png


BIN
alphabet/result/355.png


BIN
alphabet/result/369.png


BIN
alphabet/result/373.png


BIN
alphabet/result/378.png


BIN
alphabet/result/386.png


BIN
alphabet/result/390.png


BIN
alphabet/result/393.png


BIN
alphabet/result/41.png


BIN
alphabet/result/44.png


BIN
alphabet/result/51.png


BIN
alphabet/result/56.png


BIN
alphabet/result/60.png


BIN
alphabet/result/62.png


BIN
alphabet/result/66.png


BIN
alphabet/result/8.png


BIN
alphabet/symbols.png