2017-02-18 23 views
1

Есть ли способ найти объект с определенным цветом (например, красный прямоугольник 100px 50px с белым текстом), а затем выбрать этот объект, как есть, и вырезать его в новый файл? Посмотрите на изображение ниже. Я пытаюсь создать скрипт для выбора данных из изображения, затем конвертировать в текст и, наконец, писать в Excel.Выберите объект по цвету на изображении?

Я googled много howtos но не нашел, что адрес моя проблема.

Sample image

+0

Там есть пакет под названием ** OpenCV ** (CV = Computer Vision), которая имеет привязки Python, что возможно, сделает то, что вы хотите, чтобы выбрать объекты. – martineau

+0

Конвертировать изображение в цветовое пространство HSV -> Извлечь контурные области с красным цветом -> выполнить MSER для области внутри выделенных красных цветных контуров -> Tesseract сможет их прочитать –

ответ

3

Я не знаю ваши реальные намерения, вам хотелось только читать текст, или вы любите также извлекать части? В любом случае, я собираюсь показать вам прямое и общее решение. Возьмите части, которые вам нужны, в конце вы найдете код дырки.

Для отверстия связки вам нужно модулей:
cv2 (openCV) для обработки изображений
numpy для обработки специальных операций на изображениях
pytesseract для распознавания текста (OCR)
pillow (pil) подготовить изображение для pytesseract

Загрузка и фильтр

Ваше исходное изображение:
original

Сначала мы уменьшаем все цвета, кроме красного. lower и upper описывает значения из BGR (RGB = красный, зеленый, синий), которые мы хотели бы фильтровать.

image = cv.imread("AR87t.jpg") 

lower = np.array([0, 0, 200]) 
upper = np.array([100, 100, 255]) 
shapeMask = cv.inRange(image, lower, upper) 

cv.imshow("obj shapeMask", shapeMask) 
cv.waitKey(0) 

Это показывает:
shape mask

находя контуры
Далее мы находим контуры и перебор. Если мы находим 4 угла, мы сделаем следующий материал ...

cnts = cv.findContours(shapeMask.copy(), cv.RETR_EXTERNAL, 
         cv.CHAIN_APPROX_SIMPLE)[0] 

for c in cnts: 
    peri = cv.arcLength(c, True) 
    approx = cv.approxPolyDP(c, 0.04 * peri, True) 
    if len(approx) == 4: 
    .... 



маскировать оригинальный
С boundingRect, мы извлекаем x, y, w, h

(x, y, w, h) = cv.boundingRect(approx) 
cv.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), thickness=5) 


mask

ОСR на маске
И здесь приходит волшебство! Сначала мы извлекаем части маски и экспортируем изображение openCV в изображение PIL. Затем мы можем запустить tesseract.

el = shapeMask.copy()[y:y + h, x:x + w] 
pil_im = Image.fromarray(el) 

cv.imshow("obj", el) 
cv.waitKey(0) 

print(pytesseract.image_to_string(pil_im)) 


это показывает каждый прямоугольник, как небольшое изображение. Вы утешать напечатаете:

L2 = 33,33 
L3 = 44,44 
L1 = 12,22 



код

import cv2 as cv 
import numpy as np 
import pytesseract 
from PIL import Image 



image = cv.imread("AR87t.jpg") 

lower = np.array([0, 0, 200]) 
upper = np.array([100, 100, 255]) 
shapeMask = cv.inRange(image, lower, upper) 

cv.imshow("obj shapeMask", shapeMask) 
cv.waitKey(0) 


cnts = cv.findContours(shapeMask.copy(), cv.RETR_EXTERNAL, 
         cv.CHAIN_APPROX_SIMPLE)[0] 

for c in cnts: 
    peri = cv.arcLength(c, True) 
    approx = cv.approxPolyDP(c, 0.04 * peri, True) 
    if len(approx) == 4: 
     (x, y, w, h) = cv.boundingRect(approx) 
     cv.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), thickness=5) 

     print("w:%s, y:%s, w:%s, h:%s" % (x, y, w, h)) 

     el = shapeMask.copy()[y:y + h, x:x + w] 
     pil_im = Image.fromarray(el) 

     cv.imshow("obj", el) 
     cv.waitKey(0) 

     print(pytesseract.image_to_string(pil_im)) 


cv.imshow("obj rectangle", image) 
cv.waitKey(0)