Почему это автоматическое c обрезание изображения не работает на рукописных числах? - PullRequest
0 голосов
/ 04 марта 2020

Я пытаюсь обрезать это изображение:

input image

Следующий код обрезает все стороны, но я хочу удалить даже ненужное рукописное число, которое этот код не делает , Любой код удаления шума, который мне нужно включить в это, очень помог бы.

import numpy as np
import cv2
img = cv2.imread('test.JPG') 
img = img[:-20,:-20]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = 255*(gray < 128).astype(np.uint8) 
gray = cv2.morphologyEx(gray, cv2.MORPH_OPEN, np.ones((2, 2), dtype=np.uint8)) 
coords = cv2.findNonZero(gray)
x, y, w, h = cv2.boundingRect(coords) 
rect = img[y:y+h, x:x+w] 
cv2.imwrite("test_crop", rect)

1 Ответ

0 голосов
/ 04 марта 2020
  • Обратный двоичный порог вашего изображения с низким порогом, например 24, поэтому вы избавитесь от некоторых более светлых серых пикселей.
  • В пороговом изображении подсчитайте количество белых пикселей на столбец и строка. Границы ячейки таблицы будут иметь пики:

Visualization

  • Найти первый и последний пик для обоих, чтобы получить первую и последнюю горизонталь и вертикальная граница стола; обрезать эту часть.

Вот полный код:

import cv2
import numpy as np
from skimage import io      # Only needed for web reading images

# Read image from web
image = cv2.cvtColor(io.imread('https://i.stack.imgur.com/kA16I.jpg'), cv2.COLOR_RGB2BGR)

# Convert to grayscale; inverse binary threshold; map to [0, 1]
image_thr = cv2.threshold(cv2.cvtColor(image, cv2.COLOR_BGR2GRAY), 24, 255, cv2.THRESH_BINARY_INV)[1] / 255

# Count white pixels per column and row
col_sum = np.sum(image_thr, axis=0)
row_sum = np.sum(image_thr, axis=1)

# Get first and last vertical border of table
col_thr = 50
cols = np.where(col_sum > col_thr)[0][[0, -1]]

# Get first and last horizontal border of table
row_thr = 200
rows = np.where(row_sum > row_thr)[0][[0, -1]]

# Crop table
output = image[rows[0]:rows[1]+1, cols[0]:cols[1]+1]

# Outputs
cv2.imshow('image', image)
cv2.imshow('image_thr', image_thr)
cv2.imshow('output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

Вывод:

Output

Надеюсь, это поможет!

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.1
NumPy:       1.18.1
OpenCV:      4.2.0
----------------------------------------
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...