Я делаю проект в python, где мне нужно отсканировать, отобразить и записать его в текстовый файл, сохранив исходный макет входного изображения. Для сканирования изображения я использую pytesseract
и рисую контуры на исходном изображении, затем я сортирую контуры слева направо, используя координаты x, y контуров, и пишу текст в текстовом документе, но результаты плохие ( если 2 контура прилегают друг к другу по горизонтали, мой метод печатает их с сортировкой по вертикали), есть ли какой-либо улучшенный метод для этого? вот мой код:
document = Document()
path = "C:/xampp/htdocs/implementation/"
image = 'detecttable.jpg'
img = cv2.imread(path+image,0)
entire_tesseract_response = image_to_string(img)
entireText = nlp(entire_tesseract_response)
# done pre-processing and results are assigned here
dilation,enhanceimage = preprocessing(img)
rect_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 3))
contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
contours.sort(key=lambda x:get_contour_precedence(x, img.shape[1]))
bgr = np.ones((img.shape[0], img.shape[1]), dtype= 'uint8')*255
cv2.drawContours(bgr, cnts, -1, (0,0,255), 1)
areaThr = 61000 # let suppose if any countour is greater than 61000 then it will be a table.
i = 0
number_of_tables=0
data1=[]
ypre = 0
xpre = 0
datapre=""
p=""
for cnt in contours:
x, y, width, height = cv2.boundingRect(cnt)
area = cv2.contourArea(cnt)
if (area > areaThr):
number_of_tables=number_of_tables+1
i = i + 1
table = img[y:y+height-1, x:x+width-1]
data,vertical=table_processing(table)
cols= vertical
rows1 = int(data/vertical)
data_images=imageReader(data)
table = document.add_table(0, cols)
table.style = 'TableGrid'
itera=0
for i in range(rows1):
tableimg=1
row_cells = table.add_row().cells
for j in range(cols):
cv2.imwrite(str(itera)+".png",data_images[itera])
roi = cv2.resize(data_images[itera],None,fx=4, fy=4, interpolation = cv2.INTER_CUBIC)
text = image_to_string(roi)
row_cells[j].text = text
data1.append(text)
itera+=1
else:
table = img[y:y+height-1, x:x+width-1]
roi = cv2.resize(table,None,fx=4, fy=4, interpolation = cv2.INTER_CUBIC)
text = image_to_string(roi)
if not text:
segment=charsegment(roi)
# text = " "+image_to_string(segment)
data1.append(text)
if ypre!=0 and y==ypre:
space = x-xpre
space = int(space/7)
datapace=""
for i in range(space):
datapace=datapace+" "
text = datapace+text
p.add_run(text)
else:
if x<100:
if len(datapre)<=70:
p=document.add_paragraph(text)
else:
if(len(datapre))>70:
p.add_run(text)
else:
p=document.add_paragraph(text)
p.alignment = 0
elif x>=100 and x<=300:
p = document.add_paragraph(text)
p.alignment = 1
else:
p = document.add_paragraph(text)
p.alignment = 2
ypre= y
xpre = x
datapre=text
name = image.split(".")
filePath = name[0].split("/")
fileName = filePath[0]+"/wordFiles/"+filePath[2]+".docx"
entireText = image_to_string(img)
document.save(fileName)
doc = docx.Document(fileName)