найти прямоугольник на изображении и извлечь из него текст, чтобы сохранить его как новое изображение - PullRequest
0 голосов
/ 14 октября 2018

Я новичок в OpenCV, поэтому мне очень нужна ваша помощь.У меня есть куча таких изображений:

enter image description here

Мне нужно определить прямоугольник на изображении, извлечь из него текстовую часть и сохранить егокак новое изображение.

Не могли бы вы помочь мне с этим?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Просто чтобы добавить в ответ Danyals, я добавил пример кода с шагами, написанными в комментариях.Для этого изображения вам даже не нужно выполнять морфологическое раскрытие на изображении.Но обычно для такого рода шумов на изображении рекомендуется.Ура!

import cv2
import numpy as np

# Read the image and create a blank mask
img = cv2.imread('napis.jpg')
h,w = img.shape[:2]
mask = np.zeros((h,w), np.uint8)

# Transform to gray colorspace and invert Otsu threshold the image
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)

# ***OPTIONAL FOR THIS IMAGE

### Perform opening (erosion followed by dilation)
#kernel = np.ones((2,2),np.uint8)
#opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)

# ***

# Search for contours, select the biggest and draw it on the mask
_, contours, hierarchy = cv2.findContours(thresh, # if you use opening then change "thresh" to "opening"
                                          cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = max(contours, key=cv2.contourArea)
cv2.drawContours(mask, [cnt], 0, 255, -1)

# Perform a bitwise operation
res = cv2.bitwise_and(img, img, mask=mask)

########### The result is a ROI with some noise
########### Clearing the noise

# Create a new mask
mask = np.zeros((h,w), np.uint8)

# Transform the resulting image to gray colorspace and Otsu threshold the image 
gray = cv2.cvtColor(res,cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# Search for contours and select the biggest one again
_, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
cnt = max(contours, key=cv2.contourArea)

# Draw it on the new mask and perform a bitwise operation again
cv2.drawContours(mask, [cnt], 0, 255, -1)
res = cv2.bitwise_and(img, img, mask=mask)

# If you will use pytesseract it is wise to make an aditional white border
# so that the letters arent on the borders
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(res,(x,y),(x+w,y+h),(255,255,255),1)

# Crop the result
final_image = res[y:y+h+1, x:x+w+1]

# Display the result
cv2.imshow('img', final_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Результат:

enter image description here

0 голосов
/ 14 октября 2018

Один из способов сделать это (если размеры прямоугольника несколько предсказуемы):

  1. Преобразовать изображение в черно-белое
  2. Инвертировать изображение
  3. Выполнить морфологическое раскрытие на изображении из (2) с помощью горизонтальной линии / прямоугольника (я пробовал с 2x30).
  4. Выполнить морфологическое раскрытие на изображении из (2) с помощью вертикальной линии (я пробовал с 15x2).
  5. Добавьте изображения из (3) и (4).Теперь у вас должен быть только белый прямоугольник.Теперь можно удалить все соответствующие строки и столбцы в исходном изображении, которые полностью равны нулю в этом изображении.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...