cv2.rectangle连接最近的边界框

时间:2018-05-01 10:14:23

标签: python opencv bounding-box

我试图在扫描的页面中隔离中世纪的手稿单词。 我使用cv2来检测区域ant id给了我非常满意的结果。我用增量编号标记了每个矩形,并且我担心检测到的区域不是连续的: Here is a sample result of cv2 bounding box zones on a word

以下是我使用的代码:

Localstorage

我想将最近的区域加在一起,以便对我的页面进行单词标记化。在我的样本图片中,我想加入2835,2847,2864,2878,2870和2868。

我该怎么办?我以为我可以在每个框的每个坐标中存储一个数组,然后测试(start_x,start_y)和(end_x,end_y) - 但这对我来说似乎很糟糕。

你能提一下吗?

谢谢,

2 个答案:

答案 0 :(得分:1)

我继续用我的方法来弄清楚个别单词。虽然不完全准确,但请看下面这张图片:

enter image description here

伪代码:

  1. 将高斯模糊应用于灰度图像。
  2. 执行Otsu的门槛。
  3. 执行了几项形态操作:

    3.1侵蚀以尝试去除图像左上角的细线。

    3.2扩张以加入由于前一操作而分离的单个字母。

  4. 在某个区域上方找到轮廓并标记它们

  5. 修改

    代码:

    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    font = cv2.FONT_HERSHEY_SIMPLEX
    
    im = cv2.imread('corpus.png')
    imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
    image_blurred = cv2.GaussianBlur(imgray, (9, 9), 0)
    cv2.imshow('blur', image_blurred)
    
    image_blurred_d = cv2.dilate(image_blurred, None)
    cv2.imshow('dilated_blur', image_blurred_d)
    
    ret,thresh = cv2.threshold(image_blurred_d, 127, 255, cv2.THRESH_BINARY_INV +     cv2.THRESH_OTSU)
    cv2.imshow('thresh', thresh)
    
    kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (3, 3))
    erosion = cv2.erode(thresh, kernel, iterations = 1)
    cv2.imshow('erosion', erosion)
    
    kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    dilation = cv2.dilate(erosion, kernel1, iterations = 1)
    cv2.imshow('dilation', dilation)
    
    _, contours, hierarchy =    cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    count = 0
    for cnt in contours:
        if (cv2.contourArea(cnt) > 100):
            x, y, w, h = cv2.boundingRect(cnt)
            cv2.rectangle(im, (x,y), (x+w,y+h), (0, 255, 0), 2)
            count+=1
    print('Number of probable words', count)
    
    cv2.imshow('final', im)
    cv2.waitKey(0)
    cv2.destroyAllWindows()    
    

答案 1 :(得分:1)

感谢Jeru Luke,我们可以在完整页面上实施此尝试。给出的值非常有用,总体上用于模糊和侵蚀操作中的内核自适应。 The final result on the Bible Historiale Manuscript page非常有趣。我们可以看到一些"黑洞"在鉴定中,由于我的理解,扩张;这是第一个正在进行中的工作。我们将不得不管理大型图片和初始大字母。 以下是我们用于过滤框,在框上添加标签并将每个片段保存在单独文件中的代码:

for i,component in enumerate(zip(contours, hierarchy)):
    cnt = component[0]
    currentHierarchy = component[1]
    if currentHierarchy[2] > 0 and currentHierarchy[3] > 0:
        x,y,w,h = cv2.boundingRect(approx)
        if h < 300 and h > 110 and w > 110:
            cv2.rectangle(im,(x-5,y-5),(x+w+5,y+h+5),(0,255,0),8)
            cv2.putText(im,str(i),(x+2,y+2), font, 1,(0,255,0),2,cv2.LINE_AA)
            cv2.putText(im,str(cv2.contourArea(cnt)),(x+w-2,y+h-2), font, 1,(0,255,0),2,cv2.LINE_AA)
            cv2.putText(im,str(h)+'/'+str(w),(x+w-2,y+h-2), font, 1,(0,0,255),2,cv2.LINE_AA)
            fragment = im[y:y+h, x:x+w]
            cv2.imwrite("res" + str(i) + ".png", fragment)