【问题标题】:Extract bounding box and save it as an image提取边界框并将其保存为图像
【发布时间】:2012-12-02 23:55:09
【问题描述】:

假设你有以下图片:

现在我想将每个独立的字母提取到单独的图像中。目前,我已经恢复了轮廓,然后绘制了一个边界框,在本例中为角色a

在此之后,我想提取每个框(在本例中为字母 a)并将其保存到图像文件中。

预期结果:

到目前为止,这是我的代码:

import numpy as np
import cv2

im = cv2.imread('abcd.png')
im[im == 255] = 1
im[im == 0] = 255
im[im == 1] = 0
im2 = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(im2,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

for i in range(0, len(contours)):
    if (i % 2 == 0):
       cnt = contours[i]
       #mask = np.zeros(im2.shape,np.uint8)
       #cv2.drawContours(mask,[cnt],0,255,-1)
       x,y,w,h = cv2.boundingRect(cnt)
       cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
       cv2.imshow('Features', im)
       cv2.imwrite(str(i)+'.png', im)

cv2.destroyAllWindows()

提前致谢。

【问题讨论】:

    标签: python image opencv image-processing bounding-box


    【解决方案1】:

    下面会给你一个字母

    letter = im[y:y+h,x:x+w]
    

    【讨论】:

    • 当我对数组进行切片时,它得到了错误的索引,即:字母“a”移动了,所以我只得到了右上角,而其他我得到了这个错误: libpng 警告:IHDR libpng 错误中的图像高度为零:IHDR 数据无效
    • 我发现了问题,尺寸倒置了,即:im[y:y+h, x:x+w]
    • 如何修改此解决方案以在原始图像上绘制绿色边界框?
    • @Andfoy 我需要关于这篇文章的帮助...stackoverflow.com/questions/43097703/… ....你能帮帮我吗??
    【解决方案2】:

    这是一种方法:

    • 将图像转换为灰度
    • Otsu 获取二值图像的阈值
    • 寻找轮廓
    • 使用 Numpy 切片遍历轮廓并提取 ROI

    找到轮廓后,我们使用cv2.boundingRect()获取每个字母的边界矩形坐标。

    x,y,w,h = cv2.boundingRect(c)
    

    为了提取 ROI,我们使用 Numpy 切片

    ROI = image[y:y+h, x:x+w]
    

    由于我们有边界矩形坐标,我们可以绘制绿色边界框

    cv2.rectangle(copy,(x,y),(x+w,y+h),(36,255,12),2)
    

    这是检测到的字母

    这是每个保存的字母 ROI

    import cv2
    
    image = cv2.imread('1.png')
    copy = image.copy()
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray,0,255,cv2.THRESH_OTSU + cv2.THRESH_BINARY)[1]
    
    cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    
    ROI_number = 0
    for c in cnts:
        x,y,w,h = cv2.boundingRect(c)
        ROI = image[y:y+h, x:x+w]
        cv2.imwrite('ROI_{}.png'.format(ROI_number), ROI)
        cv2.rectangle(copy,(x,y),(x+w,y+h),(36,255,12),2)
        ROI_number += 1
    
    cv2.imshow('thresh', thresh)
    cv2.imshow('copy', copy)
    cv2.waitKey()
    

    【讨论】:

    • 我怎样才能应用这种方法来提取单词的图像而不是字母@nathancy?
    • @Raj 相同的过程,只是进行图像处理,直到获得二进制图像,然后您就可以使用此示例。只要您尝试提取的前景对象与背景不同,它就可以处理任何东西、形状、对象、词簇、斑点。在图像处理中,我们通常希望目标对象为白色,背景为黑色
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2018-04-03
    • 2019-08-26
    • 2022-08-16
    • 2021-01-19
    • 1970-01-01
    • 2021-04-16
    相关资源
    最近更新 更多