Browse Source

fix for one-channel gray images

master
Evgeniy Ierusalimov 2 weeks ago
parent
commit
54b0c7299c
1 changed files with 18 additions and 12 deletions
  1. 18
    12
      src/split/slicer.py

+ 18
- 12
src/split/slicer.py View File

65
 
65
 
66
 
66
 
67
 def add_border(image: np.ndarray, border_px: int) -> np.ndarray:
67
 def add_border(image: np.ndarray, border_px: int) -> np.ndarray:
68
-    return cv2.copyMakeBorder(
69
-        image,
70
-        top=border_px,
71
-        bottom=border_px,
72
-        left=border_px,
73
-        right=border_px,
74
-        borderType=cv2.BORDER_CONSTANT,
75
-        value=BORDER_COLOR,
76
-    )
68
+    if len(image.shape) == 2:
69
+        return cv2.copyMakeBorder(image, top=border_px, bottom=border_px,
70
+                                   left=border_px, right=border_px,
71
+                                   borderType=cv2.BORDER_CONSTANT, value=255)
72
+    return cv2.copyMakeBorder(image, top=border_px, bottom=border_px,
73
+                               left=border_px, right=border_px,
74
+                               borderType=cv2.BORDER_CONSTANT, value=BORDER_COLOR)
77
 
75
 
78
 
76
 
79
 def save_page(image: np.ndarray, path: Path) -> None:
77
 def save_page(image: np.ndarray, path: Path) -> None:
115
     return cols, rows
113
     return cols, rows
116
 
114
 
117
 
115
 
116
+def _to_gray(image: np.ndarray) -> np.ndarray:
117
+    if len(image.shape) == 2:
118
+        return image
119
+    return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
120
+
121
+
118
 def is_empty(image: np.ndarray) -> bool:
122
 def is_empty(image: np.ndarray) -> bool:
119
-    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
123
+    gray = _to_gray(image)
120
     dark_pixels = (gray < EMPTY_DARK_THRESHOLD).sum()
124
     dark_pixels = (gray < EMPTY_DARK_THRESHOLD).sum()
121
     threshold = int(image.shape[0] * image.shape[1] * EMPTY_DARK_RATIO)
125
     threshold = int(image.shape[0] * image.shape[1] * EMPTY_DARK_RATIO)
122
     return dark_pixels <= threshold
126
     return dark_pixels <= threshold
126
     """Бинаризация: серый → Гаусс-блюр → Otsu-порог → морф.закрытие.
130
     """Бинаризация: серый → Гаусс-блюр → Otsu-порог → морф.закрытие.
127
     При слишком низком пороге Otsu (<50) — адаптивный порог (Gaussian, окно 31).
131
     При слишком низком пороге Otsu (<50) — адаптивный порог (Gaussian, окно 31).
128
     Морфологическое закрытие (3×3) склеивает фрагменты букв в непрерывные регионы."""
132
     Морфологическое закрытие (3×3) склеивает фрагменты букв в непрерывные регионы."""
129
-    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
133
+    gray = _to_gray(image)
130
     blurred = cv2.GaussianBlur(gray, (3, 3), 0)
134
     blurred = cv2.GaussianBlur(gray, (3, 3), 0)
131
     otsu_th, binary = cv2.threshold(
135
     otsu_th, binary = cv2.threshold(
132
         blurred, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU,
136
         blurred, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU,
241
 
245
 
242
 
246
 
243
 def unwarp_image(image: np.ndarray) -> np.ndarray:
247
 def unwarp_image(image: np.ndarray) -> np.ndarray:
244
-    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
248
+    gray = _to_gray(image)
245
     blurred = cv2.GaussianBlur(gray, (5, 5), 0)
249
     blurred = cv2.GaussianBlur(gray, (5, 5), 0)
246
     edges = cv2.Canny(blurred, 50, 150)
250
     edges = cv2.Canny(blurred, 50, 150)
247
     contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
251
     contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
266
 
270
 
267
 def denoise_image(image: np.ndarray) -> np.ndarray:
271
 def denoise_image(image: np.ndarray) -> np.ndarray:
268
     """Non-Local Means denoising. Убирает шум, сохраняя границы символов."""
272
     """Non-Local Means denoising. Убирает шум, сохраняя границы символов."""
273
+    if len(image.shape) == 2:
274
+        return cv2.fastNlMeansDenoising(image, None, 10, 7, 21)
269
     return cv2.fastNlMeansDenoisingColored(image, None, 10, 10, 7, 21)
275
     return cv2.fastNlMeansDenoisingColored(image, None, 10, 10, 7, 21)
270
 
276
 
271
 
277
 

Loading…
Cancel
Save