繁体   English   中英

cv2.rectangle加入最近的边界框

[英]cv2.rectangle join closest bounding box

我正在尝试在扫描的页面中隔离中世纪手稿单词。 我正在使用cv2来检测区域ant id,这给了我一个令人满意的结果。 我用递增数字标记每个矩形,但我担心检测到的区域不连续: 这是一个单词上cv2边界框区域的示例结果

这是我使用的代码:

import numpy as np
import cv2
import matplotlib.pyplot as plt
# This is font for labels
font = cv2.FONT_HERSHEY_SIMPLEX
# I load a picture of a page, gray and blur it
im = cv2.imread('test.png')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
image_blurred = cv2.GaussianBlur(imgray, (5, 5), 0)
image_blurred = cv2.dilate(image_blurred, None)
ret,thresh = cv2.threshold(image_blurred,0,255,0,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# I try to retrieve contours and hierarchy on the sample
_, contours, hierarchy =    cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
hierarchy = hierarchy[0]
# I read every contours and retrieve the bounding box 
for i,component in enumerate(zip(contours, hierarchy)):
    cnt = component[0]
    currentHierarchy = component[1]
    precision = 0.01
    epsilon = precision*cv2.arcLength(cnt,True)
    approx = cv2.approxPolyDP(cnt,epsilon,True)
    # This is the best combination I found to isolate parents container
    # It gives me the best result (even if I'm not sure what I'm doing)
    # hierarchy[2/3] is "having child" / "having parent"
    # I thought  currentHierarchy[3] < 0 should be better
    # but it gives no result
    if currentHierarchy[2] > 0 and currentHierarchy[3] > 0:
        x,y,w,h = cv2.boundingRect(approx)
        cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
        cv2.putText(im,str(i),(x+2,y+2), font, 1,(0,255,0),2,cv2.LINE_AA)

plt.imshow(im)
plt.show()

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

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

你能给个提示吗?

谢谢,

我继续尝试找出各个单词。 尽管不够准确,但请看以下这张图片:

在此处输入图片说明

伪代码:

  1. 将高斯模糊应用于灰度图像。
  2. 进行了大津的门槛。
  3. 执行了一些形态运算:

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

    3.2膨胀连接单个字母(由于先前的操作而分隔)。

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

编辑

码:

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()    

感谢Jeru Luke ,我们可以在一个完整的页面上实施此尝试。 给出的值对于内核在模糊和腐蚀操作中的适应性非常有用。 圣经历史手册页上的最终结果仍然非常有趣。 据我所知,由于识别的原因,我们可以在标识中看到一些“黑洞”。 这是第一个进行中的工作。 我们将不得不处理大图片和首字母大写。 这是我们用来过滤框,在框上添加标签并将每个片段保存在单独文件中的代码:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM