2017-02-18 3 views
1

特定の色を持つオブジェクトを見つける方法はありますか(白いテキストの赤い四角形の100px 50pxなど)、そのオブジェクトをそのまま選択して新しいファイルに切り取りますか?下の図を見てください。私は、画像からデータを選択してテキストに変換し、最後にExcelに書き込むためのスクリプトを作成しようとしています。イメージ内のオブジェクトを色で選択しますか?

私はたくさんのハウトスを見つけましたが、私の問題に対処するものは見つかりませんでした。

Sample image

+0

そのPythonバインディングを持つ** OpenCVの**、(CV =コンピュータビジョン)と呼ばれるパッケージは、ありますオブジェクトが選択される限り、おそらくあなたが望むことを行うことができます。 – martineau

+0

画像をHSV色空間に変換 - >赤色で輪郭領域を抽出 - >抽出した赤色輪郭内で領域に対してMSERを実行 - > Tesseractでそれらを読み取ることができます –

答えて

3

私はあなたの本当の意図を知らない、あなただけの希望のテキストを読んだり、あなたは部分を抽出も好きですか? とにかく、わかりやすく、一般的な解決方法を紹介します。あなたが必要な部分を持って、最後に穴のコードを見つける。もし4つのモジュール必要孔束について

:pytesseractための画像を準備するために、テキスト(OCR)
pillow (pil)を認識する画像
pytesseractに特別な操作を処理する画像処理
cv2 (openCV)
numpy

ロードアンドフィルター

オリジナルの画像:
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で
元を隠し、我々はxywh

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


mask

マスク上のocr
ここでは魔法が来ます!まず、マスク部品を抽出し、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) 
関連する問題