Bu görüntünün bir tablosu var (aşağıda görüldüğü gibi). Ve bu formda (tablo görüntüsünün ilk satırında) benzer tablodan verileri almaya çalışıyorum:Veri almak için bir tablo görüntüsü işleme
rows[0] = [x,x, , , , ,x, ,x,x, ,x, ,x, , , , ,x, , , ,x,x,x, ,x, ,x, , , , ]
Ben x'in sayısının yanı sıra alanların numarası lazım. Ayrıca, buna benzeyen başka tablo görüntüleri de olacaktır (hepsi x'in sahip olduğu ve aynı sayıda sütun).
Şimdiye kadar, ben bir x görüntüsünü kullanarak x'lerin tüm algılamak mümkün. Ve hatlarını biraz tespit edebilirim. Python için açık cv2 kullanıyorum. Ayrıca yatay ve dikey çizgileri (gerçekten iyi çalışıyor) algılamak için bir houghTransform kullanıyorum.
Satıra nasıl satır ekleyebileceğimi ve bilgileri bir listede sakladığımı anlamaya çalışıyorum.
tespit etmek için kullanılan
(kodda train2.png) satırları tespit etmek için kullanılan (kodda train1.png) x tespit etmek için kullanılan :
Bunlar eğitim görüntülerdir
: hatları (kodda train3.png)
Bu kod var bugüne kadar olduğu
# process images
from pytesser import *
from PIL import Image
from matplotlib import pyplot as plt
import pytesseract
import numpy as np
import cv2
import math
import os
# the table images
images = ['table1.png', 'table2.png', 'table3.png', 'table4.png', 'table5.png']
# the template images used for training
templates = ['train1.png', 'train2.png', 'train3.png']
def hough_transform(im):
img = cv2.imread('imgs/'+im)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)
i = 1
for rho, theta in lines[0]:
a = np.cos(theta)
b = np.sin(theta)
x0 = a*rho
y0 = b*rho
x1 = int(x0 + 1000*(-b))
y1 = int(y0 + 1000*(a))
x2 = int(x0 - 1000*(-b))
y2 = int(y0 - 1000*(a))
#print '%s - 0:(%s,%s) 1:(%s,%s), 2:(%s,%s)' % (i,x0,y0,x1,y1,x2,y2)
cv2.line(img, (x1,y1), (x2,y2), (0,0,255), 2)
i += 1
fn = os.path.splitext(im)[0]+'-lines'
cv2.imwrite('imgs/'+fn+'.png', img)
def match_exes(im, te):
img_rgb = cv2.imread('imgs/'+im)
img_gry = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('imgs/'+te, 0)
w, h = template.shape[::-1]
res = cv2.matchTemplate(img_gry, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.71
loc = np.where(res >= threshold)
pts = []
exes = []
blanks = []
for pt in zip(*loc[::-1]):
pts.append(pt)
cv2.rectangle(img_rgb, pt, (pt[0]+w, pt[1]+h), (0,0,255), 1)
fn = os.path.splitext(im)[0]+'-exes'
cv2.imwrite('imgs/'+fn+'.png', img_rgb)
return pts, exes, blanks
def match_horizontal_lines(im, te, te2):
img_rgb = cv2.imread('imgs/'+im)
img_gry = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('imgs/'+te, 0)
w1, h1 = template.shape[::-1]
template2 = cv2.imread('imgs/'+te2, 0)
w2, h2 = template2.shape[::-1]
# first line template (the downward facing line)
res1 = cv2.matchTemplate(img_gry, template, cv2.TM_CCOEFF_NORMED)
threshold1 = 0.8
loc1 = np.where(res1 >= threshold1)
# second line template (the upward facing line)
res2 = cv2.matchTemplate(img_gry, template2, cv2.TM_CCOEFF_NORMED)
threshold2 = 0.8
loc2 = np.where(res2 >= threshold2)
pts = []
exes = []
blanks = []
# find first line template (the downward facing line)
for pt in zip(*loc1[::-1]):
pts.append(pt)
cv2.rectangle(img_rgb, pt, (pt[0]+w1, pt[1]+h1), (0,0,255), 1)
# find second line template (the upward facing line)
for pt in zip(*loc2[::-1]):
pts.append(pt)
cv2.rectangle(img_rgb, pt, (pt[0]+w2, pt[0]+h2), (0,0,255), 1)
fn = os.path.splitext(im)[0]+'-horiz'
cv2.imwrite('imgs/'+fn+'.png', img_rgb)
return pts, exes, blanks
# process
text = ''
for img in images:
print 'processing %s' % img
hough_transform(img)
pts, exes, blanks = match_exes(img, templates[0])
pts1, exes1, blanks1 = match_horizontal_lines(img, templates[1], templates[2])
text += '%s: %s x\'s & %s horizontal lines\n' % (img, len(pts), len(pts1))
# statistics file
outputFile = open('counts.txt', 'w')
outputFile.write(text)
outputFile.close()
Ve çıkış görüntüleri (gördüğünüz gibi, tüm x'ler algılanır ancak tüm hat) x kullanıcısının
yatay çizgiler
hough dönüşümü şuna benzer
Dediğim gibi ben aslında bu forma (tablo görüntüsünün ilk satırında) için, benzer tablodan veri almak için çalışıyorum
row a = [x,x, , , , ,x, ,x,x, ,x, ,x, , , , ,x, , , ,x,x,x, ,x, ,x, , , , ]
Boşlukların sayısı kadar x sayısına da ihtiyacım var. Ayrıca, buna benzeyen başka tablo görüntüleri de olacaktır (hepsi x'in ve aynı sayıda sütun ve farklı sayıda satır).
Ayrıca, piton 2.7
Sen çok, çok yakın olduğu görülüyor. Hough çizgilerinize baktığımızda, örneğin ilk hücrenin (satır 0, sütun 0) sınırları ile gelebilmeniz gerekir. Daha sonra bu sınırların içinde sadece bir 'x' olup olmadığını kontrol edin ve tabloyu buna göre güncelleyin. Ne yazık ki benim Python'um oldukça zayıf ya da daha somut bir cevap vereceğim. – beaker
Hough dönüşümüyle farkettiğim sorun, her satırın tablodaki 2 satırını çizmesidir. Farkı görmek için çizgi genişliğini 2'den 1'e ayarlıyorum. Şu anda, tüm x'leri şablon eşleştirmesini kullanarak ve aynı satırda hangileri olduğunu görmeye çalışıyorum, vs ... – user
Çift çizgiler, "ön plan" siyah ve "arka plan" beyaz olabilir. Önce renkleri tersine çevirmeyi deneyin. – beaker