【问题标题】:how to change area of contours formation in opencv (threshold)如何在opencv(阈值)中改变轮廓形成的区域
【发布时间】:2019-02-20 10:49:06
【问题描述】:

我正在尝试构建用于从图像中提取文本的 OCR,我正在使用轮廓来形成文本字符的边界,

经过几次更改 cv2.threshold 的试验后,我在形成文本字符边界时获得了最适合的轮廓。

#files = os.listdir(r'letters/harry.jpeg',0)
file = r'/home/naga/Documents/Naga/Machine Learning/Data_extract/letters/Harry/Harry Potter and the Sorcerer s Stone-page-006.jpg'
im1 = cv2.imread(file,0)
im = cv2.imread(file)

# ret,thresh1 = cv2.threshold(im1,180,278,cv2.THRESH_BINARY)
# _,contours, hierarchy = cv2.findContours(thresh1,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

ret,thresh1 = cv2.threshold(im1,180,278,cv2.THRESH_BINARY)
kernel = np.ones((5,5),np.uint8)
dilated = cv2.dilate(im1,kernel,iterations = 1)
_,contours, hierarchy = cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    x,y,w,h = cv2.boundingRect(cnt)
    #bound the images
    cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),1)

cv2.namedWindow('BindingBox', cv2.WINDOW_NORMAL)
cv2.imwrite('output2/BindingBox4.jpg',im)

现在我想在单词上创建轮廓。我需要每个单词的父轮廓。 Open cv中要更改的属性是什么。

我是 opencv 的新手,我关注了cv2 threshold,但无法理解如何应用它。请提供您的输入以形成单词的轮廓。

【问题讨论】:

    标签: python opencv ocr tesseract opencv-contour


    【解决方案1】:

    一个简单的解决方案是在运行 findcontour 函数之前扩大阈值图像的结果。

    ret,thresh1 = cv2.threshold(im1,180,255,cv2.THRESH_BINARY_INV)
    kernel = np.ones((5,5),np.uint8)
    dilated = cv2.dilate(thresh1,kernel,iterations = 2)
    contours, hierarchy = cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    

    膨胀是一种形态函数,可增加二进制 blob 的面积。它倾向于将所有附近的 blob 组合成一个单一的 blob,这正是您将文本组合成单词所需要的。

    如果不是所有文本都组合成一个单词,您可以增加迭代次数。如果您不确定此处使用的值,则需要进行一些试验和错误。

    阅读形态学过程以更好地理解该主题。它是基本图像处理的有用工具。

    作为额外提示,请尝试在 openCV 中搜索函数 Adaptivethreshold。在对文本图像进行二值化时,它会让您的生活更轻松。

    【讨论】:

    • 嗨@yapw87,感谢您的回复。我在图像上应用了您的代码以及更改迭代的不同试验,我看不到任何变化。我正在尝试了解文档中的内核和膨胀。
    • 结果没有变化?您能否发布一些您创建的结果和代码实现的示例?
    • @yaspws87 我刚刚添加了我尝试过的两个阈值的代码,在代码中实现膨胀后,我无法在图像中看到任何轮廓。不介意的话,可以试试原图吗
    • 好的,我已经下载并测试了代码,并对我之前的答案进行了一些小改动。 1)您需要应用 THRESH_BINARY_INV,因为我们希望暗区为 1,亮区为 0。通常我们关注的主要区域标记为 1。2)您需要将阈值图像的结果传递给扩张函数让它工作。
    • 感谢您的宝贵时间,它在识别方面工作正常:-)
    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 2019-12-07
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多