如何从已知位置的图像中提取字符?

时间:2017-03-23 13:44:24

标签: image python-3.x opencv image-processing

我有一组300dpi的png图像。每个图像都充满了文字(不是手写的),数字(不是手写的)。

我想提取每个字符并将其保存在不同的图像中。 对于图像中的每个字符,l将其位置存储在csv文件中。

例如,在image1.png中,对于给定的字符“k”,l的位置为:

 “k”=[left=656, right=736,top=144,down= 286]

是否有允许这样做的python库?作为输入l具有包含每个图像的每个字符的位置的图像(png格式)和csv文件。 在此行执行代码l stack之后:

img_charac=img[int(coords[2]):int(coords[3]),int(coords[0]):int(coords[1])]

我收到了以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object has no attribute '__getitem__'

1 个答案:

答案 0 :(得分:3)

因此,如果我理解正确,这与图像处理,文件打开,图像裁剪和保存无关。 csv文件看起来像this
输入图像看起来像 this

我得到的结果如this

import cv2
import numpy as np
import csv

path_csv= #path to your csv

#stock coordinates of characters from your csv in numpy array
npa=np.genfromtxt(path_csv+"cs.csv", delimiter=',',skip_header=1,usecols=(1,2,3,4))
nb_charac=len(npa[:, 0]) #number of characters

#stock the actual letters of your csv in an array
characs=[]
cpt=0
#take characters
f = open(path_csv+"cs.csv", 'rt')
reader = csv.reader(f)
for row in reader:
    if cpt>=1: #skip header
        characs.append(str(row[0]))
    cpt+=1

#open your image
path_image= #path to your image
img=cv2.imread(path_image+"yourimagename.png")
path_save= #path you want to save to

#for every line on your csv,
for i in range(nb_charac):
    #get coordinates
    coords=npa[i,:]
    charac=characs[i]

    #actual cropping of the image (easy with numpy)
    img_charac=img[int(coords[2]):int(coords[3]),int(coords[0]):int(coords[1])]
    #saving the image
    cv2.imwrite(path_save+"carac"+str(i)+"_"+str(charac)+".png",img_charac)

这有点快速和肮脏,例如csv开放有点乱(你可以通过一次打开和转换得到所有信息),并且应该适应你的csv文件。